Enable schema checking and implement mojang/multimc schema separation

This commit is contained in:
Petr Mrázek 2017-03-04 03:12:32 +01:00
parent a1f0e4271d
commit 8aa76d5909
3 changed files with 78 additions and 14 deletions

View File

@ -182,7 +182,7 @@ class _JsonObjectPrivateInstanceVariables(object):
@six.add_metaclass(JsonObjectMeta)
class JsonObjectBase(object):
_allow_dynamic_properties = True
_allow_dynamic_properties = False
_validate_required_lazily = False
_properties_by_attr = None

View File

@ -111,7 +111,7 @@ class MojangAssets (MojangArtifactBase):
totalSize = IntegerProperty()
class MojangLibraryDownloads(JsonObject):
artifact = MojangArtifact(exclude_if_none=True)
artifact = ObjectProperty(MojangArtifact, exclude_if_none=True, default=None)
classifiers = DictProperty(MojangArtifact, exclude_if_none=True, default=None)
class MojangLibraryExtractRules(JsonObject):
@ -132,31 +132,88 @@ class MojangLibraryExtractRules(JsonObject):
'''
class OSRule (JsonObject):
name = StringProperty(choices=["osx", "linux", "windows"])
name = StringProperty(choices=["osx", "linux", "windows"], required = True)
version = StringProperty(exclude_if_none=True, default=None)
class MojangRule (JsonObject):
action = StringProperty(choices=["allow", "disallow"])
action = StringProperty(choices=["allow", "disallow"], required = True)
os = ObjectProperty(OSRule, exclude_if_none=True, default=None)
class MojangLibrary (JsonObject):
extract = ObjectProperty(MojangLibraryExtractRules, exclude_if_none=True, default=None)
name = GradleSpecifierProperty()
downloads = ObjectProperty(MojangLibraryDownloads)
name = GradleSpecifierProperty(required = True)
downloads = ObjectProperty(MojangLibraryDownloads, exclude_if_none=True, default=None)
natives = DictProperty(StringProperty, exclude_if_none=True, default=None)
rules = ListProperty(MojangRule, exclude_if_none=True, default=None)
class MojangLoggingArtifact (MojangArtifactBase):
id = StringProperty()
class MojangLogging (JsonObject):
file = ObjectProperty(MojangLoggingArtifact, required = True)
argument = StringProperty(required = True)
type = StringProperty(required = True, choices=["log4j2-xml"])
class UnknownMojangVersionException(Exception):
"""Exception raised for unknown Mojang version file format versions.
Attributes:
message -- explanation of the error
"""
def __init__(self, message):
self.message = message
def validateSupportedMojangVersion(version):
supportedVersion = 18
if version > supportedVersion:
raise UnknownMojangVersionException("Unsupported Mojang format version: %d. Max supported is: %d" % (version, supportedVersion))
class MojangVersionFile (JsonObject):
assetIndex = ObjectProperty(MojangAssets, exclude_if_none=True, default=None)
assets = StringProperty(exclude_if_none=True, default=None)
downloads = DictProperty(MojangArtifactBase, exclude_if_none=True, default=None)
id = StringProperty(exclude_if_none=True, default=None)
libraries = ListProperty(MojangLibrary)
libraries = ListProperty(MojangLibrary, exclude_if_none=True, default=None)
mainClass = StringProperty(exclude_if_none=True, default=None)
processArguments = StringProperty(exclude_if_none=True, default=None)
minecraftArguments = StringProperty(exclude_if_none=True, default=None)
minimumLauncherVersion = IntegerProperty(exclude_if_none=True, default=None)
releaseTime = ISOTimestampProperty()
minimumLauncherVersion = IntegerProperty(exclude_if_none=True, default=None, validators=validateSupportedMojangVersion)
releaseTime = ISOTimestampProperty(exclude_if_none=True, default=None)
time = ISOTimestampProperty(exclude_if_none=True, default=None)
type = StringProperty(exclude_if_none=True, default=None)
logging = DictProperty(MojangLogging, exclude_if_none=True, default=None)
class MultiMCVersionFile (JsonObject):
name = StringProperty(required=True)
version = StringProperty(required=True)
fileId = StringProperty(required=True)
assetIndex = ObjectProperty(MojangAssets, exclude_if_none=True, default=None)
downloads = DictProperty(MojangArtifactBase, exclude_if_none=True, default=None)
libraries = ListProperty(MojangLibrary, exclude_if_none=True, default=None)
mainClass = StringProperty(exclude_if_none=True, default=None)
appletClass = StringProperty(exclude_if_none=True, default=None)
minecraftArguments = StringProperty(exclude_if_none=True, default=None)
releaseTime = ISOTimestampProperty(exclude_if_none=True, default=None)
time = ISOTimestampProperty(exclude_if_none=True, default=None)
type = StringProperty(exclude_if_none=True, default=None)
def MojangToMultiMC (file, name, fileId, version):
mmcFile = MultiMCVersionFile(
{
"name": name,
"fileId": fileId,
"version": version
}
)
mmcFile.assetIndex = file.assetIndex
mmcFile.downloads = file.downloads
mmcFile.libraries = file.libraries
mmcFile.mainClass = file.mainClass
mmcFile.minecraftArguments = file.minecraftArguments
mmcFile.releaseTime = file.releaseTime
# time should not be set.
mmcFile.type = file.type
return mmcFile
'''
The MultiMC static override file for legacy looks like this:

View File

@ -21,8 +21,13 @@ def addOrGetBucket(buckets, rules):
if ruleHash in buckets:
bucket = buckets[ruleHash]
else:
bucket = MojangVersionFile()
bucket.name = "LWJGL"
bucket = MultiMCVersionFile(
{
"name": "LWJGL",
"version": "undetermined",
"fileId": "org.lwjgl"
}
)
bucket.type = "release"
buckets[ruleHash] = bucket
return bucket
@ -46,7 +51,8 @@ legacyIDs = set(staticVersionlist.versions.keys())
lwjglVersions = {}
for filename in os.listdir('mojang/versions'):
with open("mojang/versions/" + filename) as json_file:
versionFile = MojangVersionFile(json.load(json_file))
mojangVersionFile = MojangVersionFile(json.load(json_file))
versionFile = MojangToMultiMC(mojangVersionFile, "Minecraft", "net.minecraft", mojangVersionFile.id)
libs_minecraft = []
buckets = {}
for lib in versionFile.libraries:
@ -61,6 +67,8 @@ for filename in os.listdir('mojang/versions'):
bucket = addOrGetBucket(buckets, rules)
if specifier.group == "org.lwjgl.lwjgl" and specifier.artifact == "lwjgl":
bucket.version = specifier.version
if not bucket.libraries:
bucket.libraries = []
bucket.libraries.append(libCopy)
# set the LWJGL release time to the oldest Minecraft release it appeared in
if bucket.releaseTime == None:
@ -83,8 +91,7 @@ for filename in os.listdir('mojang/versions'):
keyBucket.libraries = sorted(keyBucket.libraries, key=itemgetter('name'))
addLWJGLVersion(lwjglVersions, keyBucket)
versionFile.libraries = libs_minecraft
versionFile.name = "Minecraft"
filenameOut = "multimc/net.minecraft/%s.json" % versionFile.id
filenameOut = "multimc/net.minecraft/%s.json" % versionFile.version
with open(filenameOut, 'w') as outfile:
json.dump(versionFile.to_json(), outfile, sort_keys=True, indent=4)