Icarus-Mod-Tools 1.7.1 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/Gemfile.lock +12 -5
- data/imtconfig.sample.json +3 -1
- data/lib/icarus/mod/cli/list.rb +10 -3
- data/lib/icarus/mod/cli/sync.rb +118 -2
- data/lib/icarus/mod/firestore.rb +45 -25
- data/lib/icarus/mod/tools/baseinfo.rb +84 -0
- data/lib/icarus/mod/tools/mod_sync.rb +2 -2
- data/lib/icarus/mod/tools/modinfo.rb +3 -84
- data/lib/icarus/mod/tools/prog_sync.rb +51 -0
- data/lib/icarus/mod/tools/proginfo.rb +18 -0
- data/lib/icarus/mod/tools/proginfo_sync.rb +56 -0
- data/lib/icarus/mod/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e89daa8f362dd79f861a471ca6793f767e753fd2627d0ba8e1845fedaace7d12
|
4
|
+
data.tar.gz: a47625e44ac934097f21f17303068728926b9a32e814c81d09736bc49d08cefd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd9a8c3c7d816b49d5e5f5828b66f87646b0fa9f8d01cd11ab8034a3572c0a1942e5459f51d22a518d70433b938d4041bfd8dfba0ea3943fa0dd82747a2980f2
|
7
|
+
data.tar.gz: 2f82e939d00a943115b2c32432883fe6086a62da45e2749eb6db6d86f6bd73298c79d45ae808a23dbf4d612729d5510387b04159915a92ec43984f4e3239f3c6
|
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
Icarus-Mod-Tools (1.
|
4
|
+
Icarus-Mod-Tools (1.8.0)
|
5
5
|
google-cloud-firestore (~> 2.7)
|
6
6
|
octokit (~> 6.0)
|
7
7
|
paint (~> 2.3)
|
@@ -16,7 +16,7 @@ GEM
|
|
16
16
|
coderay (1.1.3)
|
17
17
|
concurrent-ruby (1.1.10)
|
18
18
|
diff-lcs (1.5.0)
|
19
|
-
faraday (2.7.
|
19
|
+
faraday (2.7.4)
|
20
20
|
faraday-net_http (>= 2.0, < 3.1)
|
21
21
|
ruby2_keywords (>= 0.0.4)
|
22
22
|
faraday-net_http (3.0.2)
|
@@ -51,6 +51,7 @@ GEM
|
|
51
51
|
gapic-common (>= 0.16.0, < 2.a)
|
52
52
|
google-cloud-errors (~> 1.0)
|
53
53
|
google-protobuf (3.21.12-x86_64-darwin)
|
54
|
+
google-protobuf (3.21.12-x86_64-linux)
|
54
55
|
googleapis-common-protos (1.4.0)
|
55
56
|
google-protobuf (~> 3.14)
|
56
57
|
googleapis-common-protos-types (~> 1.2)
|
@@ -67,6 +68,9 @@ GEM
|
|
67
68
|
grpc (1.50.0-x86_64-darwin)
|
68
69
|
google-protobuf (~> 3.21)
|
69
70
|
googleapis-common-protos-types (~> 1.0)
|
71
|
+
grpc (1.50.0-x86_64-linux)
|
72
|
+
google-protobuf (~> 3.21)
|
73
|
+
googleapis-common-protos-types (~> 1.0)
|
70
74
|
guard (2.18.0)
|
71
75
|
formatador (>= 0.2.4)
|
72
76
|
listen (>= 2.7, < 4.0)
|
@@ -112,7 +116,7 @@ GEM
|
|
112
116
|
rb-inotify (0.10.1)
|
113
117
|
ffi (~> 1.0)
|
114
118
|
rbtree (0.4.6)
|
115
|
-
regexp_parser (2.6.
|
119
|
+
regexp_parser (2.6.2)
|
116
120
|
rexml (3.2.5)
|
117
121
|
rspec (3.12.0)
|
118
122
|
rspec-core (~> 3.12.0)
|
@@ -123,7 +127,7 @@ GEM
|
|
123
127
|
rspec-expectations (3.12.2)
|
124
128
|
diff-lcs (>= 1.2.0, < 2.0)
|
125
129
|
rspec-support (~> 3.12.0)
|
126
|
-
rspec-mocks (3.12.
|
130
|
+
rspec-mocks (3.12.3)
|
127
131
|
diff-lcs (>= 1.2.0, < 2.0)
|
128
132
|
rspec-support (~> 3.12.0)
|
129
133
|
rspec-support (3.12.0)
|
@@ -139,8 +143,11 @@ GEM
|
|
139
143
|
unicode-display_width (>= 2.4.0, < 3.0)
|
140
144
|
rubocop-ast (1.24.1)
|
141
145
|
parser (>= 3.1.1.0)
|
142
|
-
rubocop-
|
146
|
+
rubocop-capybara (2.17.0)
|
147
|
+
rubocop (~> 1.41)
|
148
|
+
rubocop-rspec (2.18.1)
|
143
149
|
rubocop (~> 1.33)
|
150
|
+
rubocop-capybara (~> 2.17)
|
144
151
|
ruby-progressbar (1.11.0)
|
145
152
|
ruby2_keywords (0.0.5)
|
146
153
|
sawyer (0.9.2)
|
data/imtconfig.sample.json
CHANGED
data/lib/icarus/mod/cli/list.rb
CHANGED
@@ -10,9 +10,16 @@ module Icarus
|
|
10
10
|
class List < SubcommandBase
|
11
11
|
desc "modinfo", "Displays data from 'meta/modinfo/list'"
|
12
12
|
def modinfo
|
13
|
-
|
14
|
-
puts
|
15
|
-
puts "Total: #{
|
13
|
+
modinfo_array = Firestore.new.list(:modinfo)
|
14
|
+
puts modinfo_array
|
15
|
+
puts "Total: #{modinfo_array.count}" if verbose > 1
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "proginfo", "Displays data from 'meta/proginfo/list'"
|
19
|
+
def proginfo
|
20
|
+
proginfo_array = Firestore.new.list(:proginfo)
|
21
|
+
puts proginfo_array
|
22
|
+
puts "Total: #{proginfo_array.count}" if verbose > 1
|
16
23
|
end
|
17
24
|
|
18
25
|
desc "repos", "Displays data from 'meta/repos/list'"
|
data/lib/icarus/mod/cli/sync.rb
CHANGED
@@ -1,13 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "tools/modinfo_sync"
|
4
|
+
require "tools/proginfo_sync"
|
4
5
|
require "tools/mod_sync"
|
6
|
+
require "tools/prog_sync"
|
5
7
|
|
6
8
|
module Icarus
|
7
9
|
module Mod
|
8
10
|
module CLI
|
9
11
|
# Sync CLI command definitions
|
10
12
|
class Sync < SubcommandBase
|
13
|
+
class_option :dry_run, type: :boolean, default: false, desc: "Dry run (no changes will be made)"
|
14
|
+
|
15
|
+
desc "all", "Run all sync jobs"
|
16
|
+
def all
|
17
|
+
invoke :proginfo
|
18
|
+
invoke :progs
|
19
|
+
invoke :modinfo
|
20
|
+
invoke :mods
|
21
|
+
end
|
22
|
+
|
11
23
|
desc "modinfo", "Reads from 'meta/repos/list' and Syncs any modinfo files we find (github only for now)"
|
12
24
|
def modinfo
|
13
25
|
modinfo_sync = Icarus::Mod::Tools::ModinfoSync.new
|
@@ -20,11 +32,44 @@ module Icarus
|
|
20
32
|
puts "Retrieving modinfo Array..." if verbose?
|
21
33
|
modinfo_array = modinfo_sync.modinfo_data(repositories, verbose: verbose > 1)&.map(&:download_url)&.compact
|
22
34
|
|
23
|
-
raise Icarus::Mod::Tools::Error, "
|
35
|
+
raise Icarus::Mod::Tools::Error, "No modinfo.json files found" unless modinfo_array&.any?
|
36
|
+
|
37
|
+
if options[:dry_run]
|
38
|
+
puts "Dry run; no changes will be made"
|
39
|
+
return
|
40
|
+
end
|
24
41
|
|
25
42
|
puts "Saving to Firestore..." if verbose?
|
26
43
|
response = modinfo_sync.update(modinfo_array)
|
27
44
|
puts response ? "Success" : "Failure (may be no changes)" if verbose?
|
45
|
+
rescue Icarus::Mod::Tools::Error => e
|
46
|
+
warn e.message
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "proginfo", "Reads from 'meta/repos/list' and Syncs any proginfo files we find (github only for now)"
|
50
|
+
def proginfo
|
51
|
+
proginfo_sync = Icarus::Mod::Tools::ProginfoSync.new
|
52
|
+
|
53
|
+
puts "Retrieving repository Data..." if verbose?
|
54
|
+
repositories = proginfo_sync.repositories
|
55
|
+
|
56
|
+
raise Icarus::Mod::Tools::Error, "Unable to find any repositories!" unless repositories.any?
|
57
|
+
|
58
|
+
puts "Retrieving proginfo Array..." if verbose?
|
59
|
+
proginfo_array = proginfo_sync.proginfo_data(repositories, verbose: verbose > 1)&.map(&:download_url)&.compact
|
60
|
+
|
61
|
+
raise Icarus::Mod::Tools::Error, "no proginfo.json files found" unless proginfo_array&.any?
|
62
|
+
|
63
|
+
if options[:dry_run]
|
64
|
+
puts "Dry run; no changes will be made"
|
65
|
+
return
|
66
|
+
end
|
67
|
+
|
68
|
+
puts "Saving to Firestore..." if verbose?
|
69
|
+
response = proginfo_sync.update(proginfo_array)
|
70
|
+
puts response ? "Success" : "Failure (may be no changes)" if verbose?
|
71
|
+
rescue Icarus::Mod::Tools::Error => e
|
72
|
+
warn e.message
|
28
73
|
end
|
29
74
|
|
30
75
|
desc "mods", "Reads from 'meta/modinfo/list' and updates the 'mods' database accordingly"
|
@@ -55,10 +100,21 @@ module Icarus
|
|
55
100
|
end
|
56
101
|
|
57
102
|
print format("#{verb} %-<name>60s", name: "'#{mod.author || "NoOne"}/#{mod.name || "Unnamed"}'") if verbose > 1
|
103
|
+
|
104
|
+
if options[:dry_run]
|
105
|
+
puts "Dry run; no changes will be made" if verbose > 1
|
106
|
+
next
|
107
|
+
end
|
108
|
+
|
58
109
|
response = modsync.update(mod)
|
59
110
|
puts format("%<status>10s", status: response ? "Success" : "Failure") if verbose > 1
|
60
111
|
end
|
61
112
|
|
113
|
+
if options[:dry_run]
|
114
|
+
puts "Dry run; no changes will be made" if verbose?
|
115
|
+
return
|
116
|
+
end
|
117
|
+
|
62
118
|
puts "Created/Updated #{modinfo_array.count} mods" if verbose?
|
63
119
|
|
64
120
|
delete_array = mod_array.filter { |mod| modsync.find_modinfo(mod).nil? }
|
@@ -75,7 +131,67 @@ module Icarus
|
|
75
131
|
puts "Deleted #{delete_array.count} outdated mods" if verbose?
|
76
132
|
rescue Icarus::Mod::Tools::Error => e
|
77
133
|
warn e.message
|
78
|
-
|
134
|
+
end
|
135
|
+
|
136
|
+
desc "progs", "Reads from 'meta/proginfo/list' and updates the 'progs' database accordingly"
|
137
|
+
method_option :check, type: :boolean, default: false, desc: "Validate proginfo without applying changes"
|
138
|
+
def progs
|
139
|
+
progsync = Icarus::Mod::Tools::ProgSync.new
|
140
|
+
|
141
|
+
puts "Retrieving proginfo Data..." if verbose?
|
142
|
+
proginfo_array = progsync.proginfo_array
|
143
|
+
|
144
|
+
puts "Retrieving progs Data..." if verbose?
|
145
|
+
prog_array = progsync.progs
|
146
|
+
|
147
|
+
return if options[:check]
|
148
|
+
|
149
|
+
puts "Updating Program Data..." if verbose?
|
150
|
+
proginfo_array.each do |prog|
|
151
|
+
verb = "Creating"
|
152
|
+
|
153
|
+
puts "Validating proginfo Data for #{prog.uniq_name}..." if verbose > 2
|
154
|
+
warn "Skipping program #{prog.uniq_name} due to validation errors" && next unless prog.validate
|
155
|
+
|
156
|
+
doc_id = progsync.find_prog(prog)
|
157
|
+
if doc_id
|
158
|
+
puts "Found existing program #{prog.name} at #{doc_id}" if verbose > 2
|
159
|
+
prog.id = doc_id
|
160
|
+
verb = "Updating"
|
161
|
+
end
|
162
|
+
|
163
|
+
print format("#{verb} %-<name>60s", name: "'#{prog.author || "NoOne"}/#{prog.name || "Unnamed"}'") if verbose > 1
|
164
|
+
|
165
|
+
if options[:dry_run]
|
166
|
+
puts "Dry run; no changes will be made" if verbose > 1
|
167
|
+
next
|
168
|
+
end
|
169
|
+
|
170
|
+
response = progsync.update(prog)
|
171
|
+
puts format("%<status>10s", status: response ? "Success" : "Failure") if verbose > 1
|
172
|
+
end
|
173
|
+
|
174
|
+
if options[:dry_run]
|
175
|
+
puts "Dry run; no changes will be made" if verbose?
|
176
|
+
return
|
177
|
+
end
|
178
|
+
|
179
|
+
puts "Created/Updated #{proginfo_array.count} Programs" if verbose?
|
180
|
+
|
181
|
+
delete_array = prog_array.filter { |prog| progsync.find_proginfo(prog).nil? }
|
182
|
+
|
183
|
+
return unless delete_array.any?
|
184
|
+
|
185
|
+
puts "Deleting outdated programs..." if verbose?
|
186
|
+
delete_array.each do |prog|
|
187
|
+
print format("Deleting %-<name>60s", name: "'#{prog.author || "NoOne"}/#{prog.name || "Unnamed'"}") if verbose > 1
|
188
|
+
response = progsync.delete(prog)
|
189
|
+
puts format("%<status>10s", status: response ? "Success" : "Failure") if verbose > 1
|
190
|
+
end
|
191
|
+
|
192
|
+
puts "Deleted #{delete_array.count} outdated programs" if verbose?
|
193
|
+
rescue Icarus::Mod::Tools::Error => e
|
194
|
+
warn e.message
|
79
195
|
end
|
80
196
|
end
|
81
197
|
end
|
data/lib/icarus/mod/firestore.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "google/cloud/firestore"
|
4
4
|
require "tools/modinfo"
|
5
|
+
require "tools/proginfo"
|
5
6
|
|
6
7
|
module Icarus
|
7
8
|
module Mod
|
@@ -18,52 +19,65 @@ module Icarus
|
|
18
19
|
@repos ||= list(:repositories)
|
19
20
|
end
|
20
21
|
|
21
|
-
def
|
22
|
-
@
|
22
|
+
def modinfo_list
|
23
|
+
@modinfo_list ||= list(:modinfo)
|
24
|
+
end
|
25
|
+
|
26
|
+
def proginfo_list
|
27
|
+
@proginfo_list ||= list(:proginfo)
|
23
28
|
end
|
24
29
|
|
25
30
|
def mods
|
26
31
|
@mods ||= list(:mods)
|
27
32
|
end
|
28
33
|
|
29
|
-
def
|
30
|
-
|
34
|
+
def progs
|
35
|
+
@progs ||= list(:progs)
|
36
|
+
end
|
37
|
+
|
38
|
+
def find_by_type(type:, name:, author:)
|
39
|
+
list(type).find { |obj| obj.name == name && obj.author == author }
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_list(type)
|
43
|
+
raise "Invalid type: #{type} - unknown collection" unless collections.respond_to?(type)
|
44
|
+
|
45
|
+
@client.doc(collections.send(type)).get[:list]
|
31
46
|
end
|
32
47
|
|
33
48
|
def list(type)
|
34
|
-
case type
|
35
|
-
when :modinfo
|
36
|
-
|
37
|
-
when :
|
38
|
-
@client.
|
39
|
-
|
40
|
-
|
41
|
-
Icarus::Mod::Tools::Modinfo.new(doc.data, id: doc.document_id, created: doc.create_time, updated: doc.update_time)
|
49
|
+
case type.to_sym
|
50
|
+
when :modinfo, :proginfo, :repositories
|
51
|
+
get_list(type)
|
52
|
+
when :mods, :progs
|
53
|
+
@client.col(collections.send(type)).get.map do |doc|
|
54
|
+
klass = type == :mods ? Icarus::Mod::Tools::Modinfo : Icarus::Mod::Tools::Proginfo
|
55
|
+
klass.new(doc.data, id: doc.document_id, created: doc.create_time, updated: doc.update_time)
|
42
56
|
end
|
43
57
|
else
|
44
58
|
raise "Invalid type: #{type}"
|
45
59
|
end
|
46
60
|
end
|
47
61
|
|
48
|
-
def
|
49
|
-
doc_id = payload.id ||
|
62
|
+
def update_or_create(type, payload, merge:)
|
63
|
+
doc_id = payload.id || find_by_type(type:, name: payload.name, author: payload.author)&.id
|
50
64
|
|
51
|
-
return @client.doc("#{collections.
|
65
|
+
return @client.doc("#{collections.send(type)}/#{doc_id}").set(payload.to_h, merge:) if doc_id
|
52
66
|
|
53
|
-
@client.col(collections.
|
67
|
+
@client.col(collections.send(type)).add(payload.to_h)
|
54
68
|
end
|
55
69
|
|
56
70
|
def update(type, payload, merge: false)
|
57
71
|
raise "You must specify a payload to update" if payload&.empty? || payload.nil?
|
58
72
|
|
59
|
-
case type
|
60
|
-
when :modinfo
|
61
|
-
update_array = (
|
62
|
-
response = @client.doc(collections.
|
73
|
+
case type.to_sym
|
74
|
+
when :modinfo, :proginfo
|
75
|
+
update_array = (send("#{type}_list") + [payload]).flatten.uniq
|
76
|
+
response = @client.doc(collections.send(type)).set({ list: update_array }, merge:) if update_array.any?
|
63
77
|
when :repositories
|
64
78
|
response = @client.doc(collections.repositories).set({ list: payload }, merge:)
|
65
|
-
when :mod
|
66
|
-
response =
|
79
|
+
when :mod, :prog
|
80
|
+
response = update_or_create(pluralize(type), payload, merge:)
|
67
81
|
else
|
68
82
|
raise "Invalid type: #{type}"
|
69
83
|
end
|
@@ -72,15 +86,21 @@ module Icarus
|
|
72
86
|
end
|
73
87
|
|
74
88
|
def delete(type, payload)
|
75
|
-
case type
|
76
|
-
when :mod
|
77
|
-
response = @client.doc("#{collections.
|
89
|
+
case type.to_sym
|
90
|
+
when :mod, :prog
|
91
|
+
response = @client.doc("#{collections.send(pluralize(type))}/#{payload.id}").delete
|
78
92
|
else
|
79
93
|
raise "Invalid type: #{type}"
|
80
94
|
end
|
81
95
|
|
82
96
|
response.is_a?(Google::Cloud::Firestore::CommitResponse::WriteResult)
|
83
97
|
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def pluralize(type)
|
102
|
+
type.to_s.end_with?("s") ? type.to_s : "#{type}s"
|
103
|
+
end
|
84
104
|
end
|
85
105
|
end
|
86
106
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Icarus
|
4
|
+
module Mod
|
5
|
+
module Tools
|
6
|
+
# Base class for Modinfo and Proginfo
|
7
|
+
class Baseinfo
|
8
|
+
attr_reader :data, :errors, :id, :created_at, :updated_at, :warnings
|
9
|
+
|
10
|
+
HASHKEYS = %i[name author version compatibility description fileType fileURL imageURL readmeURL].freeze
|
11
|
+
|
12
|
+
def initialize(data, id: nil, created: nil, updated: nil)
|
13
|
+
@id = id
|
14
|
+
@created_at = created
|
15
|
+
@updated_at = updated
|
16
|
+
@errors = []
|
17
|
+
@warnings = []
|
18
|
+
|
19
|
+
read(data)
|
20
|
+
end
|
21
|
+
|
22
|
+
def read(data)
|
23
|
+
@data = data.is_a?(String) ? JSON.parse(data, symbolize_names: true) : data
|
24
|
+
end
|
25
|
+
|
26
|
+
def uniq_name
|
27
|
+
"#{author}/#{name}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_json(*args)
|
31
|
+
JSON.generate(@data, *args)
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_h
|
35
|
+
HASHKEYS.each_with_object({}) { |key, hash| hash[key] = @data[key] }
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate
|
39
|
+
@warnings << "Version should be a version string" unless validate_version(version)
|
40
|
+
|
41
|
+
%w[name author description].each do |key|
|
42
|
+
@errors << "#{key.capitalize} cannot be blank" unless validate_string(@data[key.to_sym])
|
43
|
+
end
|
44
|
+
|
45
|
+
@errors << "Invalid fileType: #{fileType || "blank"}" unless validate_filetype(fileType)
|
46
|
+
|
47
|
+
%w[fileURL imageURL readmeURL].each do |key|
|
48
|
+
@errors << "Invalid URL #{key.capitalize}: #{@data[key.to_sym] || "blank"}" unless validate_url(@data[key.to_sym])
|
49
|
+
end
|
50
|
+
|
51
|
+
@errors.empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
def method_missing(method_name, *_args, &)
|
55
|
+
@data[method_name.to_sym]&.strip
|
56
|
+
end
|
57
|
+
|
58
|
+
def respond_to_missing?(method_name, include_private = false)
|
59
|
+
HASHKEYS.include?(method_name.to_sym) || super
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def validate_url(url)
|
65
|
+
return true if url.nil? || url.empty?
|
66
|
+
|
67
|
+
url =~ URI::DEFAULT_PARSER.make_regexp
|
68
|
+
end
|
69
|
+
|
70
|
+
def validate_filetype(filetype)
|
71
|
+
%w[pak zip exmod].include?(filetype.downcase)
|
72
|
+
end
|
73
|
+
|
74
|
+
def validate_string(string)
|
75
|
+
!(string.nil? || string.empty?)
|
76
|
+
end
|
77
|
+
|
78
|
+
def validate_version(version)
|
79
|
+
version =~ /\d+\.\d+[.\d+]?/
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -19,7 +19,7 @@ module Icarus
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def modinfo_array
|
22
|
-
@modinfo_array ||= @firestore.
|
22
|
+
@modinfo_array ||= @firestore.modinfo_list.map do |url|
|
23
23
|
retrieve_from_url(url)[:mods].map { |mod| Modinfo.new(mod) if mod[:name] =~ /[a-z0-9]+/i }
|
24
24
|
rescue Icarus::Mod::Tools::RequestFailed
|
25
25
|
warn "Skipped; Failed to retrieve #{url}"
|
@@ -31,7 +31,7 @@ module Icarus
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def find_mod(modinfo)
|
34
|
-
@firestore.
|
34
|
+
@firestore.find_by_type(type: "mods", name: modinfo.name, author: modinfo.author)&.id
|
35
35
|
end
|
36
36
|
|
37
37
|
def find_modinfo(modinfo)
|
@@ -1,100 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "tools/baseinfo"
|
4
|
+
|
3
5
|
module Icarus
|
4
6
|
module Mod
|
5
7
|
module Tools
|
6
8
|
# Sync methods
|
7
|
-
class Modinfo
|
8
|
-
attr_reader :data, :errors, :id, :created_at, :updated_at, :warnings
|
9
|
-
|
9
|
+
class Modinfo < Baseinfo
|
10
10
|
HASHKEYS = %i[name author version compatibility description long_description fileType fileURL imageURL readmeURL].freeze
|
11
11
|
|
12
|
-
def initialize(data, id: nil, created: nil, updated: nil)
|
13
|
-
@id = id
|
14
|
-
@created_at = created
|
15
|
-
@updated_at = updated
|
16
|
-
@errors = []
|
17
|
-
@warnings = []
|
18
|
-
|
19
|
-
read(data)
|
20
|
-
end
|
21
|
-
|
22
|
-
def read(data)
|
23
|
-
@data = data.is_a?(String) ? JSON.parse(data, symbolize_names: true) : data
|
24
|
-
end
|
25
|
-
|
26
|
-
def uniq_name
|
27
|
-
"#{author}/#{name}"
|
28
|
-
end
|
29
|
-
|
30
12
|
# rubocop:disable Naming/MethodName
|
31
13
|
def fileType
|
32
14
|
@data[:fileType] || "pak"
|
33
15
|
end
|
34
16
|
# rubocop:enable Naming/MethodName
|
35
|
-
|
36
|
-
def to_json(*args)
|
37
|
-
JSON.generate(@data, *args)
|
38
|
-
end
|
39
|
-
|
40
|
-
def to_h
|
41
|
-
{
|
42
|
-
name:,
|
43
|
-
author:,
|
44
|
-
version:,
|
45
|
-
compatibility:,
|
46
|
-
description:,
|
47
|
-
long_description:,
|
48
|
-
fileType:,
|
49
|
-
fileURL:,
|
50
|
-
imageURL:,
|
51
|
-
readmeURL:
|
52
|
-
}
|
53
|
-
end
|
54
|
-
|
55
|
-
def validate
|
56
|
-
@warnings << "Version should be a version string" unless validate_version(version)
|
57
|
-
|
58
|
-
%w[name author description].each do |key|
|
59
|
-
@errors << "#{key.capitalize} cannot be blank" unless validate_string(@data[key.to_sym])
|
60
|
-
end
|
61
|
-
|
62
|
-
@errors << "Invalid fileType: #{fileType || "blank"}" unless validate_filetype(fileType)
|
63
|
-
|
64
|
-
%w[fileURL imageURL readmeURL].each do |key|
|
65
|
-
@errors << "Invalid URL #{key.capitalize}: #{@data[key.to_sym] || "blank"}" unless validate_url(@data[key.to_sym])
|
66
|
-
end
|
67
|
-
|
68
|
-
@errors.empty?
|
69
|
-
end
|
70
|
-
|
71
|
-
def method_missing(method_name, *_args, &)
|
72
|
-
@data[method_name.to_sym]&.strip
|
73
|
-
end
|
74
|
-
|
75
|
-
def respond_to_missing?(method_name, include_private = false)
|
76
|
-
HASHKEYS.include?(method_name.to_sym) || super
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
|
81
|
-
def validate_url(url)
|
82
|
-
return true if url.nil? || url.empty?
|
83
|
-
|
84
|
-
url =~ URI::DEFAULT_PARSER.make_regexp
|
85
|
-
end
|
86
|
-
|
87
|
-
def validate_filetype(filetype)
|
88
|
-
%w[pak zip exmod].include?(filetype.downcase)
|
89
|
-
end
|
90
|
-
|
91
|
-
def validate_string(string)
|
92
|
-
!(string.nil? || string.empty?)
|
93
|
-
end
|
94
|
-
|
95
|
-
def validate_version(version)
|
96
|
-
version =~ /\d+\.\d+[.\d+]?/
|
97
|
-
end
|
98
17
|
end
|
99
18
|
end
|
100
19
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "firestore"
|
4
|
+
require "tools/sync_helpers"
|
5
|
+
|
6
|
+
module Icarus
|
7
|
+
module Mod
|
8
|
+
module Tools
|
9
|
+
# Sync methods
|
10
|
+
class ProgSync
|
11
|
+
include SyncHelpers
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@firestore = Firestore.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def progs
|
18
|
+
@firestore.progs
|
19
|
+
end
|
20
|
+
|
21
|
+
def proginfo_array
|
22
|
+
@proginfo_array ||= @firestore.proginfo_list.map do |url|
|
23
|
+
retrieve_from_url(url)[:programs].map { |prog| Proginfo.new(prog) if prog[:name] =~ /[a-z0-9]+/i }
|
24
|
+
rescue Icarus::Mod::Tools::RequestFailed
|
25
|
+
warn "Skipped; Failed to retrieve #{url}"
|
26
|
+
next
|
27
|
+
rescue JSON::ParserError => e
|
28
|
+
warn "Skipped; Invalid JSON: #{e.full_message}"
|
29
|
+
next
|
30
|
+
end.flatten.compact
|
31
|
+
end
|
32
|
+
|
33
|
+
def find_prog(proginfo)
|
34
|
+
@firestore.find_by_type(type: "progs", name: proginfo.name, author: proginfo.author)&.id
|
35
|
+
end
|
36
|
+
|
37
|
+
def find_proginfo(proginfo)
|
38
|
+
@proginfo_array.find { |prog| prog.name == proginfo.name }
|
39
|
+
end
|
40
|
+
|
41
|
+
def update(proginfo)
|
42
|
+
@firestore.update(:prog, proginfo, merge: false)
|
43
|
+
end
|
44
|
+
|
45
|
+
def delete(proginfo)
|
46
|
+
@firestore.delete(:prog, proginfo)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "tools/baseinfo"
|
4
|
+
|
5
|
+
module Icarus
|
6
|
+
module Mod
|
7
|
+
module Tools
|
8
|
+
# Sync methods
|
9
|
+
class Proginfo < Baseinfo
|
10
|
+
# rubocop:disable Naming/MethodName
|
11
|
+
def fileType
|
12
|
+
@data[:fileType] || "zip"
|
13
|
+
end
|
14
|
+
# rubocop:enable Naming/MethodName
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "firestore"
|
4
|
+
require "github"
|
5
|
+
require "tools/sync_helpers"
|
6
|
+
|
7
|
+
module Icarus
|
8
|
+
module Mod
|
9
|
+
module Tools
|
10
|
+
# Sync methods
|
11
|
+
class ProginfoSync
|
12
|
+
include SyncHelpers
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@firestore = Firestore.new
|
16
|
+
@github = Github.new
|
17
|
+
@repositories = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def repositories
|
21
|
+
@firestore.repos
|
22
|
+
end
|
23
|
+
|
24
|
+
def update(proginfo_array)
|
25
|
+
@firestore.update(:proginfo, proginfo_array)
|
26
|
+
end
|
27
|
+
|
28
|
+
def proginfo(url)
|
29
|
+
retrieve_from_url(url)
|
30
|
+
end
|
31
|
+
|
32
|
+
def proginfo_data(repositories, verbose: false)
|
33
|
+
repositories.map do |repo|
|
34
|
+
print "searching #{repo}..." if verbose
|
35
|
+
|
36
|
+
case repo
|
37
|
+
when /github/
|
38
|
+
@github.repository = repo
|
39
|
+
proginfo_url = @github.find("proginfo.json")
|
40
|
+
|
41
|
+
unless proginfo_url
|
42
|
+
puts "Skipped...no proginfo.json" if verbose
|
43
|
+
next
|
44
|
+
end
|
45
|
+
|
46
|
+
puts "Found!" if verbose
|
47
|
+
proginfo_url
|
48
|
+
else
|
49
|
+
puts "Skipped...repository type not supported yet" if verbose
|
50
|
+
end
|
51
|
+
end.compact
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/icarus/mod/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Icarus-Mod-Tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Donovan Young
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-01-
|
11
|
+
date: 2023-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-cloud-firestore
|
@@ -97,10 +97,14 @@ files:
|
|
97
97
|
- lib/icarus/mod/firestore.rb
|
98
98
|
- lib/icarus/mod/github.rb
|
99
99
|
- lib/icarus/mod/tools.rb
|
100
|
+
- lib/icarus/mod/tools/baseinfo.rb
|
100
101
|
- lib/icarus/mod/tools/mod_sync.rb
|
101
102
|
- lib/icarus/mod/tools/modinfo.rb
|
102
103
|
- lib/icarus/mod/tools/modinfo_sync.rb
|
103
104
|
- lib/icarus/mod/tools/modinfo_validate.rb
|
105
|
+
- lib/icarus/mod/tools/prog_sync.rb
|
106
|
+
- lib/icarus/mod/tools/proginfo.rb
|
107
|
+
- lib/icarus/mod/tools/proginfo_sync.rb
|
104
108
|
- lib/icarus/mod/tools/sync_helpers.rb
|
105
109
|
- lib/icarus/mod/version.rb
|
106
110
|
- sig/database/sync/sync.rbs
|