wonko_the_sane 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/bin/wonko_the_sane +12 -28
  3. data/data/sources.json +0 -5
  4. data/lib/wonko_the_sane.rb +6 -26
  5. data/lib/wonko_the_sane/input/base_input.rb +5 -10
  6. data/lib/wonko_the_sane/input/forge_installer_profile_input.rb +29 -47
  7. data/lib/wonko_the_sane/input/forgefiles_mods_input.rb +4 -7
  8. data/lib/wonko_the_sane/input/jenkins_input.rb +11 -15
  9. data/lib/wonko_the_sane/input/mojang_input.rb +52 -61
  10. data/lib/wonko_the_sane/{reader_writer.rb → new_format.rb} +31 -35
  11. data/lib/wonko_the_sane/old_format.rb +123 -0
  12. data/lib/wonko_the_sane/registry.rb +38 -23
  13. data/lib/wonko_the_sane/rules.rb +6 -6
  14. data/lib/wonko_the_sane/timestamps.rb +4 -4
  15. data/lib/wonko_the_sane/tools/update_nem.rb +20 -18
  16. data/lib/wonko_the_sane/util/configuration.rb +54 -2
  17. data/lib/wonko_the_sane/util/deep_storage_cache.rb +10 -8
  18. data/lib/wonko_the_sane/util/extraction_cache.rb +5 -4
  19. data/lib/wonko_the_sane/util/file_hash_cache.rb +6 -6
  20. data/lib/wonko_the_sane/util/http_cache.rb +50 -105
  21. data/lib/wonko_the_sane/util/maven_identifier.rb +8 -14
  22. data/lib/wonko_the_sane/util/task_stack.rb +7 -6
  23. data/lib/wonko_the_sane/{version_parser.rb → util/version_parser.rb} +10 -14
  24. data/lib/wonko_the_sane/version.rb +1 -1
  25. data/lib/wonko_the_sane/versionlists/base_version_list.rb +22 -15
  26. data/lib/wonko_the_sane/versionlists/curse_version_list.rb +15 -16
  27. data/lib/wonko_the_sane/versionlists/forge_version_list.rb +34 -37
  28. data/lib/wonko_the_sane/versionlists/forgefiles_mods_list.rb +3 -7
  29. data/lib/wonko_the_sane/versionlists/jenkins_version_list.rb +6 -15
  30. data/lib/wonko_the_sane/versionlists/liteloader_version_list.rb +18 -28
  31. data/lib/wonko_the_sane/versionlists/vanilla_legacy_version_list.rb +6 -6
  32. data/lib/wonko_the_sane/versionlists/vanilla_version_list.rb +6 -8
  33. data/lib/wonko_the_sane/wonko_version.rb +32 -12
  34. metadata +71 -15
  35. data/lib/wonko_the_sane/wonkoweb_uploader.rb +0 -162
@@ -1,36 +1,32 @@
1
- require 'hashie'
2
-
3
1
  module Reader
4
2
  def read_version_index(data)
5
- json = Hashie::Mash.new data
6
-
7
- index = VersionIndex.new json.uid
8
- index.name = json.name
9
- json.versions.each do |ver|
3
+ data = data.with_indifferent_access
4
+ index = VersionIndex.new data[:uid]
5
+ index.name = data[:name]
6
+ data[:versions].each do |ver|
10
7
  v = WonkoVersion.new
11
8
  v.is_complete = false
12
- v.uid = json.uid
9
+ v.uid = data[:uid]
13
10
  v.version = ver[:version]
14
11
  v.type = ver[:type]
15
12
  v.time = ver[:time]
16
13
  index.versions << v
17
14
  end
18
15
 
19
- return index
16
+ index
20
17
  end
21
18
 
22
19
  def read_download(data, key)
23
20
  if data[key.to_sym]
24
- data[key.to_sym].map do |dl|
25
- Download.from_json key, dl
26
- end
21
+ data[key.to_sym].map { |dl| Download.from_json key, dl }
27
22
  else
28
23
  []
29
24
  end
30
25
  end
31
26
 
32
- def read_resource(data, res)
33
- return if not data or not data.is_a? Object
27
+ def read_resource(data)
28
+ return if !data || !data.is_a?(Object)
29
+ res = WonkoVersion::Resources.new
34
30
  res.traits = data[:'general.traits'] if data[:'general.traits']
35
31
  res.folders = data[:'general.folders'] if data[:'general.folders']
36
32
  res.launchMethod = data[:'general.launcher'] if data[:'general.launcher']
@@ -38,6 +34,7 @@ module Reader
38
34
  res.downloads << read_download(data, 'general.downloads')
39
35
  res.downloads << read_download(data, 'java.libraries')
40
36
  res.downloads << read_download(data, 'java.natives')
37
+ res.downloads << read_download(data, 'mc.jarmods')
41
38
  res.downloads.flatten!
42
39
 
43
40
  res.mainClass = data[:'java.mainClass']
@@ -46,32 +43,31 @@ module Reader
46
43
  res.minecraftArguments = data[:'mc.arguments']
47
44
  res.tweakers = data[:'mc.tweakers']
48
45
  res.jarModTarget = data[:'mc.jarModTarget'] if data[:'mc.jarModTarget']
46
+ res
49
47
  end
50
48
 
51
49
  def read_version(data)
52
- json = Hashie::Mash.new data
50
+ data = data.with_indifferent_access
53
51
 
54
52
  file = WonkoVersion.new
55
53
  file.is_complete = true
56
54
 
57
- file.uid = json.uid
58
- file.version = json.version
59
- file.time = json.time
60
- file.type = json.type
61
- file.requires = json.requires.map do |req|
62
- Referenced.new(req[:uid], req[:version])
63
- end if json.requires
64
-
65
- json[:data].each do |data|
66
- rules = data[:rules] ? data[:rules] : [ImplicitRule.new(:allow)]
67
- if Rule.allowed_on_side rules, :client
68
- read_resource data, file.client
55
+ file.uid = data[:uid]
56
+ file.version = data[:version]
57
+ file.time = data[:time]
58
+ file.type = data[:type]
59
+ file.requires = data[:requires].map { |req| Referenced.new(req[:uid], req[:version]) } if data[:requires]
60
+
61
+ data[:data].each do |group|
62
+ rules = group[:rules] ? group[:rules] : [ImplicitRule.new(:allow)]
63
+ if Rule.allowed_on_side(rules, :client) && Rule.allowed_on_side(rules, :server)
64
+ file.common = read_resource group
69
65
  elsif Rule.allowed_on_side rules, :server
70
- read_resource data, file.server
66
+ file.server = read_resource group
71
67
  else
72
- read_resource data, file.common
68
+ file.client = read_resource group
73
69
  end
74
- end if json[:data]
70
+ end if data[:data]
75
71
 
76
72
  file
77
73
  end
@@ -84,7 +80,7 @@ end
84
80
  module Writer
85
81
  def write_version_index(index)
86
82
  json = {
87
- formatVersion: 0,
83
+ formatVersion: 10,
88
84
  uid: index.uid,
89
85
  name: index.name,
90
86
  versions: []
@@ -106,7 +102,7 @@ module Writer
106
102
  data[:'general.launcher'] = resource.launchMethod if resource.launchMethod
107
103
  data[:'general.folders'] = resource.folders if resource.folders and not resource.folders.empty?
108
104
  resource.downloads.each do |dl|
109
- data[dl.type] = [] if not data[dl.type]
105
+ data[dl.type] = [] unless data[dl.type]
110
106
  data[dl.type] << dl.to_json
111
107
  end
112
108
  data[:'java.mainClass'] = resource.mainClass if resource.mainClass and resource.mainClass != ''
@@ -117,8 +113,8 @@ module Writer
117
113
  data[:'mc.assets'] = resource.assets if resource.assets and resource.assets != ''
118
114
  data[:'mc.arguments'] = resource.minecraftArguments if resource.minecraftArguments and resource.minecraftArguments != ''
119
115
 
120
- if not data.empty?
121
- if side == :client or side == :server
116
+ unless data.empty?
117
+ if side == :client || side == :server
122
118
  data[:rules] = [
123
119
  ImplicitRule.new(:disallow).to_json,
124
120
  SidedRule.new(:allow, side).to_json
@@ -131,7 +127,7 @@ module Writer
131
127
  def write_version(version)
132
128
  # metadata
133
129
  json = {
134
- formatVersion: 0,
130
+ formatVersion: 10,
135
131
  uid: version.uid,
136
132
  version: version.version,
137
133
  time: version.time.to_s,
@@ -0,0 +1,123 @@
1
+ require 'time'
2
+
3
+ module OldFormatWriter
4
+ def write_version(version)
5
+ # metadata
6
+ json = {
7
+ formatVersion: 0,
8
+ uid: version.uid,
9
+ name: version.uid,
10
+ fileId: version.uid,
11
+ version: version.version,
12
+ time: Time.at(version.time).iso8601,
13
+ releaseTime: Time.at(version.time).iso8601,
14
+ type: version.type,
15
+ requires: [],
16
+ order: order_for(version.uid)
17
+ }
18
+ json[:requires] = version.requires.map do |req|
19
+ obj = { uid: req.uid }
20
+ obj[:version] = req.version if req.version
21
+ obj
22
+ end if version.requires and not version.requires.empty?
23
+ json[:id] = version.version if version.uid == 'net.minecraft'
24
+
25
+ resource = version.client
26
+
27
+ vanilla_req = version.requires.find { |r| r.uid == 'net.minecraft' }
28
+
29
+ json[:mainClass] = resource.mainClass if resource.mainClass && resource.mainClass != ''
30
+ json[:appletClass] = resource.appletClass if resource.appletClass && resource.appletClass != ''
31
+ json[:assets] = resource.assets if resource.assets && resource.assets != ''
32
+ json[:mcVersion] = vanilla_req.version if vanilla_req
33
+ json[:minecraftArguments] = resource.minecraftArguments
34
+
35
+ vanilla = Registry.instance.retrieve 'net.minecraft', json[:mcVersion] if json[:mcVersion]
36
+
37
+ json[:'+tweakers'] = resource.tweakers if resource.tweakers && !resource.tweakers.empty?
38
+
39
+ natives = {}
40
+ json[:'+libraries'] = resource.downloads
41
+ .select { |dl| dl.type == 'java.libraries' || dl.type == 'java.natives' }
42
+ .reject { |lib| lib.name.start_with? 'net.minecraft:minecraft:' }
43
+ .map do |lib|
44
+ result = { name: lib.name }
45
+ if lib.explicit_url?
46
+ result[:'MMC-absoluteUrl'] = lib.url
47
+ elsif !lib.url.nil? && lib.maven_base_url != 'https://libraries.minecraft.net/'
48
+ result[:url] = lib.url
49
+ end
50
+ result[:rules] = lib.rules.map { |r| r.to_json } unless lib.rules.nil?
51
+
52
+ if lib.name.include?('org.scala-lang') || lib.name.include?('com.typesafe')
53
+ result[:'MMC-hint'] = 'forge-pack-xz'
54
+ end
55
+
56
+ in_vanilla = if vanilla
57
+ vanilla.client.downloads
58
+ .select { |dl| dl.type == 'java.libraries' || dl.type == 'java.natives' }
59
+ .find { |dl| dl.name == lib.name }
60
+ end
61
+ if !in_vanilla.nil? && in_vanilla == lib
62
+ # it's already there, no need to add it
63
+ else
64
+ if in_vanilla.nil?
65
+ result[:insert] = 'append' unless version.uid == 'net.minecraft'
66
+ if %w(minecraftforge forge fml liteloader).include? lib.maven.artifact
67
+ result[:'MMC-depend'] = 'hard'
68
+ end
69
+ else
70
+ result[:insert] = 'replace'
71
+ end
72
+
73
+ [lib, result]
74
+ end
75
+ end.reject { |i| i.nil? }.map do |array|
76
+ lib = array[0]
77
+ result = array[1]
78
+ if lib.type == 'java.libraries'
79
+ result
80
+ else
81
+ # reconstruct insane natives
82
+ # mojang: you invented this fancy^Wweird rules system, and then you don't use it?
83
+ natives[lib.name] ||= {}
84
+ osrule = lib.rules[1]
85
+ if natives[lib.name].key? osrule.os
86
+ nil
87
+ else
88
+ natives[lib.name][osrule.os] = result
89
+ result[:url] = result[:url].sub /(32|64)/, '${arch}' if result[:url]
90
+ result[:'MMC-absoluteUrl'] = result[:'MMC-absoluteUrl'].sub /(32|64)/, '${arch}' if result[:'MMC-absoluteUrl']
91
+ result[:rules][1][:os].delete :arch
92
+ result
93
+ end
94
+ end
95
+ end.reject { |i| i.nil? }
96
+
97
+ json[:'+jarMods'] = resource.downloads.select { |dl| dl.type == 'mc.jarmods' }.map do |lib|
98
+ {}
99
+ end
100
+
101
+ json
102
+ end
103
+
104
+ def order_for(uid)
105
+ case uid
106
+ when 'net.minecraftforge'
107
+ 5
108
+ when 'com.mumfrey.liteloader'
109
+ 10
110
+ when 'net.minecraft'
111
+ -2
112
+ when 'org.lwjgl'
113
+ -1
114
+ else
115
+ 0
116
+ end
117
+ end
118
+ end
119
+
120
+ class OldFormat
121
+ include OldFormatWriter
122
+ end
123
+ $old_format = OldFormat.new
@@ -1,3 +1,5 @@
1
+ require 'fileutils'
2
+
1
3
  class Registry
2
4
  def version_index(uid)
3
5
  return VersionIndex.new uid unless File.exists? VersionIndex.local_filename uid
@@ -6,49 +8,62 @@ class Registry
6
8
 
7
9
  def store_version_index(index)
8
10
  File.write index.local_filename, JSON.pretty_generate($rw.write_version_index index)
9
- WonkoTheSane.wonkoweb_uploader.file_changed index.uid
11
+ FileUtils.copy index.local_filename, "#{Registry.out_dir}/#{index.uid}.json" unless Registry.out_dir.blank?
10
12
  end
11
13
 
12
14
  def index
13
- return { index: [] } unless File.exists? 'files/index.json'
15
+ return {index: []} unless File.exists? 'files/index.json'
14
16
  $rw.read_index JSON.parse File.read 'files/index.json'
15
17
  end
16
18
 
17
19
  def store(version)
18
20
  if version.is_a? Array
19
- version.each do |f| store(f) end
21
+ version.each do |f|
22
+ store(f)
23
+ end
20
24
  else
21
- BaseSanitizer.sanitize(version, DownloadsFixer).each do |version|
22
- Dir.mkdir 'files/' + version.uid unless Dir.exist? 'files/' + version.uid
23
- File.write version.local_filename, JSON.pretty_generate($rw.write_version version)
24
- WonkoTheSane.wonkoweb_uploader.version_changed version.uid, version.version
25
-
26
- vindex = version_index version.uid
27
- vindex.add_version version
28
- store_version_index vindex
29
-
30
- ind = index
31
- next if ind[:index].find { |i| version.uid == i[:uid] } # early exit if the uid already exists in the index
32
- ind[:formatVersion] = 0
33
- ind[:index] << { uid: version.uid }
34
- File.write 'files/index.json', JSON.pretty_generate($rw.write_index ind)
25
+ BaseSanitizer.sanitize(version, DownloadsFixer).each do |ver|
26
+ begin
27
+ Dir.mkdir 'files/' + ver.uid unless Dir.exist? 'files/' + ver.uid
28
+ File.write ver.local_filename + '.new', JSON.pretty_generate($rw.write_version ver)
29
+ File.write ver.local_filename, JSON.pretty_generate($old_format.write_version ver)
30
+ unless Registry.out_dir.blank?
31
+ FileUtils.copy ver.local_filename + '.new', "#{Registry.out_dir}/#{ver.uid}-#{ver.version}.new.json"
32
+ FileUtils.copy ver.local_filename, "#{Registry.out_dir}/#{ver.uid}-#{ver.version}.json"
33
+ end
34
+
35
+ vindex = version_index ver.uid
36
+ vindex.add_version ver
37
+ store_version_index vindex
38
+
39
+ ind = index
40
+ next if ind[:index].find { |i| ver.uid == i[:uid] } # early exit if the uid already exists in the index
41
+ ind[:formatVersion] = 0
42
+ ind[:index] << {uid: ver.uid}
43
+ File.write 'files/index.json', JSON.pretty_generate($rw.write_index ind)
44
+ rescue Exception => e
45
+ Logging.logger[ver.uid].error 'Unable to store: ' + ver.version
46
+ raise e
47
+ end
35
48
  end
36
49
  end
37
- rescue Exception => e
38
- Logging.logger[version.uid].error 'Unable to store: ' + version.version
39
- raise e
40
50
  end
41
51
 
42
52
  def retrieve(id, version)
43
53
  if File.exist? WonkoVersion.local_filename(id, version)
44
- $rw.read_version JSON.parse File.read(WonkoVersion.local_filename id, version)
54
+ $rw.read_version JSON.parse File.read(WonkoVersion.local_filename(id, version) + '.new')
45
55
  else
46
56
  nil
47
57
  end
48
58
  end
49
59
 
50
60
  def self.instance
51
- Dir.mkdir 'files' unless Dir.exist? 'files'
52
- @@instance ||= Registry.new
61
+ FileUtils.mkdir_p 'files' unless Dir.exist? 'files'
62
+ FileUtils.mkdir_p out_dir unless out_dir.blank? || Dir.exists?(out_dir)
63
+ @instance ||= Registry.new
64
+ end
65
+
66
+ def self.out_dir
67
+ WonkoTheSane.configuration.out_dir
53
68
  end
54
69
  end
@@ -11,21 +11,21 @@ class Rule
11
11
 
12
12
  def self.allowed_on_side(rules, side)
13
13
  allowed = :allow
14
- rules.each do |rule|
14
+ rules.map { |r| r.is_a?(Rule) ? r : Rule.from_json(r) }.each do |rule|
15
15
  if rule.is_a? ImplicitRule
16
16
  allowed = rule.action
17
17
  elsif rule.is_a? SidedRule
18
- allowed = rule.action if rule.side = side
18
+ allowed = rule.action if rule.side == side
19
19
  end
20
20
  end
21
- return allowed
21
+ allowed == :allow
22
22
  end
23
23
 
24
24
  def self.from_json(obj)
25
25
  if obj.key? :os
26
26
  return OsRule.new obj[:action].to_sym, obj[:os][:name], obj[:os][:version], obj[:os][:arch]
27
27
  elsif obj.key? :side
28
- return SidedRule.new obj[:action].to_sym, obj[:side]
28
+ return SidedRule.new obj[:action].to_sym, obj[:side].to_sym
29
29
  else
30
30
  return ImplicitRule.new obj[:action].to_sym
31
31
  end
@@ -50,7 +50,7 @@ class OsRule < Rule
50
50
  obj[:os] = { name: @os }
51
51
  obj[:os][:version] = @os_version if @os_version
52
52
  obj[:os][:arch] = @os_arch if @os_arch
53
- return obj
53
+ obj
54
54
  end
55
55
  end
56
56
  class SidedRule < Rule
@@ -64,6 +64,6 @@ class SidedRule < Rule
64
64
  def to_json
65
65
  obj = super
66
66
  obj[:side] = @side
67
- return obj
67
+ obj
68
68
  end
69
69
  end
@@ -4,8 +4,8 @@ class Timestamps
4
4
  end
5
5
 
6
6
  def get(uid, version, default = nil)
7
- if @json[uid.to_sym] and @json[uid.to_sym][version.to_sym.to_sym]
8
- return @json[uid.to_sym][version.to_sym]
7
+ if @json[uid.to_sym] && @json[uid.to_sym][version.to_sym]
8
+ @json[uid.to_sym][version.to_sym]
9
9
  elsif default.nil?
10
10
  raise 'No timestamp available for ' + uid + ': ' + version
11
11
  elsif default.is_a? String
@@ -24,7 +24,7 @@ class Timestamps
24
24
  end
25
25
 
26
26
  def self.get(uid, version, default = nil)
27
- @@me ||= Timestamps.new
28
- @@me.get uid, version, default
27
+ @me ||= Timestamps.new
28
+ @me.get uid, version, default
29
29
  end
30
30
  end
@@ -1,31 +1,31 @@
1
1
  def get_curse_id(name)
2
2
  data = HTTPCache.get('http://minecraft.curseforge.com/mc-mods/' + name).gsub /[\n\r]/, ''
3
3
  match = data.match /<li class="view-on?-cur?se"> *<a href="http:\/\/curse.com\/project\/(\d*)">/
4
- return match[1]
4
+ match[1]
5
5
  end
6
6
 
7
7
  def update_nem
8
- forgefilesCleaned = {
8
+ self.forgefiles_cleaned = {
9
9
  IronChests: :IronChests2
10
10
  }
11
11
 
12
12
  sources = WonkoTheSane.data_json 'sources.json'
13
- sources[:forgefiles] = {} if not sources[:forgefiles]
14
- sources[:jenkins] = [] if not sources[:jenkins]
15
- sources[:curse] = [] if not sources[:curse]
13
+ sources[:forgefiles] = {} unless sources[:forgefiles]
14
+ sources[:jenkins] = [] unless sources[:jenkins]
15
+ sources[:curse] = [] unless sources[:curse]
16
16
 
17
- nemList = JSON.parse HTTPCache.get('https://raw.githubusercontent.com/SinZ163/NotEnoughMods/master/NEMP/mods.json'), symbolize_names: true
18
- nemList.each do |key, value|
17
+ nem_list = JSON.parse HTTPCache.get('https://raw.githubusercontent.com/SinZ163/NotEnoughMods/master/NEMP/mods.json'), symbolize_names: true
18
+ nem_list.each do |key, value|
19
19
  name = (value[:name] ? value[:name] : key).to_sym
20
20
  case value[:function]
21
21
  when 'CheckMCForge2'
22
- if forgefilesCleaned[name]
23
- name = forgefilesCleaned[name]
22
+ if self.forgefiles_cleaned[name]
23
+ name = self.forgefiles_cleaned[name]
24
24
  end
25
25
  if not sources[:forgefiles].find do |artifact, urlId| urlId == name.to_s end and not [:MinecraftForge, :FML, :Cauldron].include? name
26
26
  print "Please enter an uid for the #{"forgefiles".cyan} artifact #{name.to_s.green}: "
27
27
  uid = gets.chomp
28
- if not uid.empty?
28
+ unless uid.empty?
29
29
  sources[:forgefiles][uid.to_sym] = name.to_s
30
30
  end
31
31
  end
@@ -42,14 +42,14 @@ def update_nem
42
42
  when 'CheckChickenBones'
43
43
  # TODO
44
44
  when 'CheckCurse'
45
- curseId = value[:curse][:id] ? value[:curse][:id] : get_curse_id(value[:curse][:name] ? value[:curse][:name] : name.to_s.downcase)
46
- if not sources[:curse].find do |obj| obj[:id] == curseId end
47
- print "Please enter an uid for the #{"curse".cyan} artifact #{name.to_s.green} (id: #{curseId.yellow}): "
45
+ curse_id = value[:curse][:id] ? value[:curse][:id] : get_curse_id(value[:curse][:name] ? value[:curse][:name] : name.to_s.downcase)
46
+ if sources[:curse].find { |obj| obj[:id] == curse_id }.nil?
47
+ print "Please enter an uid for the #{'curse'.cyan} artifact #{name.to_s.green} (id: #{curse_id.yellow}): "
48
48
  uid = gets.chomp
49
- if not uid.empty?
49
+ unless uid.empty?
50
50
  sources[:curse] << {
51
51
  uid: uid,
52
- id: curseId,
52
+ id: curse_id,
53
53
  fileregex: value[:curse][:regex]
54
54
  }
55
55
  end
@@ -61,11 +61,11 @@ def update_nem
61
61
  when 'CheckHTML'
62
62
  # TODO
63
63
  when 'CheckJenkins'
64
- parts = value[:jenkins][:url].match(/^(.*)\/job\/([^\/]*)\//)
65
- if not sources[:jenkins].find do |obj| obj[:url] == parts[1] and obj[:artifact] == parts[2] end
64
+ parts = value[:jenkins][:url].match /^(.*)\/job\/([^\/]*)\//
65
+ if sources[:jenkins].find { |obj| obj[:url] == parts[1] && obj[:artifact] == parts[2] }.nil?
66
66
  print "Please enter an uid for the #{"jenkins".cyan} artifact #{name.to_s.green} from #{parts[1].yellow} (#{parts[2].red}): "
67
67
  uid = gets.chomp
68
- if not uid.empty?
68
+ unless uid.empty?
69
69
  sources[:jenkins] << {
70
70
  uid: uid,
71
71
  url: parts[1],
@@ -77,6 +77,8 @@ def update_nem
77
77
  # TODO
78
78
  when 'CheckSpacechase'
79
79
  # TODO
80
+ else
81
+ print 'Unknown checker function: ' + value[:function]
80
82
  end
81
83
 
82
84
  # keep the writing in the loop so we don't lose progress in case of crashes or similar