lapis-minecraft-versioning 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +18 -0
  3. data/.gitignore +151 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +1156 -0
  6. data/.travis.yml +4 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.md +16 -0
  9. data/README.md +83 -0
  10. data/Rakefile +28 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +7 -0
  13. data/lapis-minecraft-versioning.gemspec +35 -0
  14. data/lib/lapis/minecraft/version.rb +89 -0
  15. data/lib/lapis/minecraft/versioning.rb +26 -0
  16. data/lib/lapis/minecraft/versioning/asset.rb +44 -0
  17. data/lib/lapis/minecraft/versioning/asset_index.rb +61 -0
  18. data/lib/lapis/minecraft/versioning/basic.rb +56 -0
  19. data/lib/lapis/minecraft/versioning/detailed.rb +69 -0
  20. data/lib/lapis/minecraft/versioning/launcher_properties.rb +48 -0
  21. data/lib/lapis/minecraft/versioning/library.rb +51 -0
  22. data/lib/lapis/minecraft/versioning/manifest.rb +49 -0
  23. data/lib/lapis/minecraft/versioning/marshalling.rb +15 -0
  24. data/lib/lapis/minecraft/versioning/marshalling/asset_index_parser.rb +41 -0
  25. data/lib/lapis/minecraft/versioning/marshalling/manifest_parser.rb +66 -0
  26. data/lib/lapis/minecraft/versioning/marshalling/version_parser.rb +204 -0
  27. data/lib/lapis/minecraft/versioning/meta_server.rb +52 -0
  28. data/lib/lapis/minecraft/versioning/os_rule.rb +45 -0
  29. data/lib/lapis/minecraft/versioning/resource.rb +44 -0
  30. data/lib/lapis/minecraft/versioning/resource_set.rb +61 -0
  31. data/lib/lapis/minecraft/versioning/rule.rb +32 -0
  32. data/lib/lapis/minecraft/versioning/version.rb +7 -0
  33. data/lib/lapis/minecraft/versioning/version_list.rb +64 -0
  34. data/spec/factories/asset_factory.rb +11 -0
  35. data/spec/factories/asset_index_document_factory.rb +25 -0
  36. data/spec/factories/asset_index_factory.rb +15 -0
  37. data/spec/factories/basic_factory.rb +28 -0
  38. data/spec/factories/detailed_factory.rb +16 -0
  39. data/spec/factories/launcher_properties_factory.rb +11 -0
  40. data/spec/factories/library_factory.rb +21 -0
  41. data/spec/factories/manifest_document_factory.rb +48 -0
  42. data/spec/factories/manifest_factory.rb +12 -0
  43. data/spec/factories/meta_server_mock_factory.rb +33 -0
  44. data/spec/factories/os_rule_factory.rb +30 -0
  45. data/spec/factories/resource_factory.rb +32 -0
  46. data/spec/factories/resource_set_factory.rb +16 -0
  47. data/spec/factories/rule_factory.rb +17 -0
  48. data/spec/factories/version_document_factory.rb +176 -0
  49. data/spec/factories/version_factory.rb +18 -0
  50. data/spec/lapis/minecraft/version_spec.rb +181 -0
  51. data/spec/lapis/minecraft/versioning/asset_index_spec.rb +89 -0
  52. data/spec/lapis/minecraft/versioning/asset_spec.rb +65 -0
  53. data/spec/lapis/minecraft/versioning/basic_spec.rb +75 -0
  54. data/spec/lapis/minecraft/versioning/detailed_spec.rb +175 -0
  55. data/spec/lapis/minecraft/versioning/launcher_properties_spec.rb +73 -0
  56. data/spec/lapis/minecraft/versioning/library_spec.rb +91 -0
  57. data/spec/lapis/minecraft/versioning/manifest_spec.rb +71 -0
  58. data/spec/lapis/minecraft/versioning/marshalling/asset_index_parser_spec.rb +27 -0
  59. data/spec/lapis/minecraft/versioning/marshalling/manifest_parser_spec.rb +74 -0
  60. data/spec/lapis/minecraft/versioning/marshalling/version_parser_spec.rb +101 -0
  61. data/spec/lapis/minecraft/versioning/meta_server_spec.rb +59 -0
  62. data/spec/lapis/minecraft/versioning/os_rule_spec.rb +73 -0
  63. data/spec/lapis/minecraft/versioning/resource_set_spec.rb +87 -0
  64. data/spec/lapis/minecraft/versioning/resource_spec.rb +55 -0
  65. data/spec/lapis/minecraft/versioning/rule_spec.rb +36 -0
  66. data/spec/lapis/minecraft/versioning/version_list_spec.rb +66 -0
  67. data/spec/spec_helper.rb +90 -0
  68. data/spec/time_helper.rb +39 -0
  69. metadata +289 -0
@@ -0,0 +1,91 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Library do
4
+
5
+ describe '#name' do
6
+ let(:name) { 'some.mc:library:5.0' }
7
+ let(:library) { build(:library, :name => name) }
8
+ subject { library.name }
9
+
10
+ it 'is the expected value' do
11
+ is_expected.to eq name
12
+ end
13
+
14
+ it 'is frozen' do
15
+ is_expected.to be_frozen
16
+ end
17
+ end
18
+
19
+ describe '#resources' do
20
+ let(:resources) { build(:resource_set) }
21
+ let(:library) { build(:library, :resources => resources) }
22
+ subject { library.resources }
23
+
24
+ it 'has the expected value' do
25
+ is_expected.to eq resources
26
+ end
27
+ end
28
+
29
+ describe '#rules' do
30
+ let(:rules) { build_list(:rule, 5) }
31
+ let(:library) { build(:library, :rules => rules) }
32
+ subject { library.rules }
33
+
34
+ it 'cloned the array' do
35
+ is_expected.not_to be rules
36
+ end
37
+
38
+ it 'has the same elements' do
39
+ is_expected.to contain_exactly(*rules)
40
+ end
41
+
42
+ it 'is frozen' do
43
+ is_expected.to be_frozen
44
+ end
45
+ end
46
+
47
+ describe '#exclude_paths' do
48
+ let(:paths) { build_list(:library_path, 5) }
49
+ let(:library) { build(:library, :paths => paths) }
50
+ subject { library.exclude_paths }
51
+
52
+ it 'cloned the array' do
53
+ is_expected.not_to be paths
54
+ end
55
+
56
+ it 'has the same elements' do
57
+ is_expected.to contain_exactly(*paths)
58
+ end
59
+
60
+ it 'is frozen' do
61
+ is_expected.to be_frozen
62
+ end
63
+
64
+ it 'has frozen contents' do
65
+ is_expected.to all(be_frozen)
66
+ end
67
+ end
68
+
69
+ describe '#==' do
70
+ subject { library_1 == library_2 }
71
+
72
+ context 'with identical libraries' do
73
+ let(:library_1) { build(:library) }
74
+ let(:library_2) { Lapis::Minecraft::Versioning::Library.new(library_1.name, library_1.resources, library_1.rules, library_1.exclude_paths) }
75
+
76
+ it 'is true' do
77
+ is_expected.to be true
78
+ end
79
+ end
80
+
81
+ context 'with different libraries' do
82
+ let(:library_1) { build(:library) }
83
+ let(:library_2) { build(:library, :name => library_1.name + '-foobar') }
84
+
85
+ it 'is false' do
86
+ is_expected.to be false
87
+ end
88
+ end
89
+ end
90
+
91
+ end
@@ -0,0 +1,71 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Manifest do
4
+ let(:versions) { build_list(:basic, 5) }
5
+ let(:latest_release) { versions.first }
6
+ let(:latest_snapshot) { versions.last }
7
+ subject(:manifest) { build(:manifest, :versions => versions, :latest_release_id => latest_release.id, :latest_snapshot_id => latest_snapshot.id) }
8
+
9
+ describe '#each' do
10
+ subject { manifest.each }
11
+
12
+ it 'returns an enumerator' do
13
+ expect(subject).to be_an Enumerator
14
+ end
15
+
16
+ it 'yields basic info' do
17
+ args = []
18
+ manifest.each do |arg|
19
+ args << arg
20
+ end
21
+ expect(args).to all(be_a Lapis::Minecraft::Versioning::Basic)
22
+ end
23
+
24
+ it 'yields every version' do
25
+ expect { |b| manifest.each(&b) }.to yield_control.exactly(versions.count).times
26
+ end
27
+
28
+ it 'yields the expected versions' do
29
+ expect(manifest).to contain_exactly(*versions)
30
+ end
31
+ end
32
+
33
+ describe '#latest_release' do
34
+ subject { manifest.latest_release }
35
+
36
+ it 'is the expected value' do
37
+ is_expected.to be latest_release
38
+ end
39
+ end
40
+
41
+ describe '#latest_release' do
42
+ subject { manifest.latest_release }
43
+
44
+ it 'is the expected value' do
45
+ is_expected.to be latest_release
46
+ end
47
+ end
48
+
49
+ describe '#==' do
50
+ subject { manifest_1 == manifest_2 }
51
+
52
+ context 'with identical manifests' do
53
+ let(:manifest_1) { build(:manifest) }
54
+ let(:manifest_2) { Lapis::Minecraft::Versioning::Manifest.new(manifest_1.entries, manifest_1.latest_release.id, manifest_1.latest_snapshot.id) }
55
+
56
+ it 'is true' do
57
+ is_expected.to be true
58
+ end
59
+ end
60
+
61
+ context 'with different manifests' do
62
+ let(:manifest_1) { build(:manifest) }
63
+ let(:manifest_2) { build(:manifest, :versions => manifest_1.entries + [build(:basic)]) }
64
+
65
+ it 'is false' do
66
+ is_expected.to be false
67
+ end
68
+ end
69
+ end
70
+
71
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Marshalling::AssetIndexParser do
4
+ let(:index) { build(:asset_index_document) }
5
+ let(:assets) { index.assets }
6
+ let(:document) { index.document }
7
+ subject(:parser) { Lapis::Minecraft::Versioning::Marshalling::AssetIndexParser.new }
8
+
9
+ describe '#parse' do
10
+ subject { parser.parse(document) }
11
+
12
+ it 'generates a list of assets' do
13
+ is_expected.to all(be_an Lapis::Minecraft::Versioning::Asset)
14
+ end
15
+
16
+ it 'has the expected assets' do
17
+ # FIXME: This test is longer and more complicated than I would like.
18
+ subject.zip(assets).each do |actual, expected|
19
+ path, attributes = expected
20
+ expect(actual.path).to eq path
21
+ expect(actual.sha1).to eq attributes[:hash]
22
+ expect(actual.size).to eq attributes[:size]
23
+ end
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,74 @@
1
+ require_relative '../../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Marshalling::ManifestParser do
4
+ let(:manifest) { build(:manifest_document) }
5
+ let(:latest_release) { manifest.source.latest_release }
6
+ let(:latest_snapshot) { manifest.source.latest_snapshot }
7
+ let(:versions) { manifest.source.entries }
8
+ let(:document) { manifest.document }
9
+ subject(:parser) { Lapis::Minecraft::Versioning::Marshalling::ManifestParser.new }
10
+
11
+ describe '#parse' do
12
+ subject(:result) { parser.parse(document) }
13
+
14
+ it 'has the expected versions' do
15
+ is_expected.to contain_exactly(*versions)
16
+ end
17
+
18
+ describe '.latest_release' do
19
+ subject(:version) { result.latest_release }
20
+
21
+ it 'is the expected version' do
22
+ is_expected.to eq latest_release
23
+ end
24
+ end
25
+
26
+ describe '.latest_snapshot' do
27
+ subject(:version) { result.latest_snapshot }
28
+
29
+ it 'is the expected version' do
30
+ is_expected.to eq latest_snapshot
31
+ end
32
+ end
33
+
34
+ context 'when versions contain' do
35
+ let(:versions) { [version] }
36
+ let(:source) { build(:manifest, :versions => versions) }
37
+ let(:manifest) { build(:manifest_document, :source => source) }
38
+ subject { result.first.type }
39
+
40
+ context 'an alpha' do
41
+ let(:version) { build(:basic, :alpha) }
42
+
43
+ it 'sets the type to :alpha' do
44
+ is_expected.to eq :alpha
45
+ end
46
+ end
47
+
48
+ context 'a beta' do
49
+ let(:version) { build(:basic, :beta) }
50
+
51
+ it 'sets the type to :beta' do
52
+ is_expected.to eq :beta
53
+ end
54
+ end
55
+
56
+ context 'a snapshot' do
57
+ let(:version) { build(:basic, :snapshot) }
58
+
59
+ it 'sets the type to :snapshot' do
60
+ is_expected.to eq :snapshot
61
+ end
62
+ end
63
+
64
+ context 'a release' do
65
+ let(:version) { build(:basic, :release) }
66
+
67
+ it 'sets the type to :release' do
68
+ is_expected.to eq :release
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ end
@@ -0,0 +1,101 @@
1
+ require_relative '../../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Marshalling::VersionParser do
4
+ let(:source) { build(:detailed) }
5
+ let(:version) { build(:version_document, :source => source) }
6
+ let(:document) { version.document }
7
+ subject(:parser) { Lapis::Minecraft::Versioning::Marshalling::VersionParser.new }
8
+
9
+ describe '#parse' do
10
+ subject(:result) { parser.parse(document, "http://example.com/minecraft/#{source.id}.json") }
11
+
12
+ describe '.id' do
13
+ subject { result.id }
14
+
15
+ it 'is the expected value' do
16
+ is_expected.to eq source.id
17
+ end
18
+ end
19
+
20
+ describe '.type' do
21
+ subject { result.type }
22
+
23
+ context 'with an alpha' do
24
+ let(:source) { build(:detailed, :type => :alpha) }
25
+
26
+ it 'is :alpha' do
27
+ is_expected.to eq :alpha
28
+ end
29
+ end
30
+
31
+ context 'with a beta' do
32
+ let(:source) { build(:detailed, :type => :beta) }
33
+
34
+ it 'is :beta' do
35
+ is_expected.to eq :beta
36
+ end
37
+ end
38
+
39
+ context 'with a snapshot' do
40
+ let(:source) { build(:detailed, :type => :snapshot) }
41
+
42
+ it 'is :snapshot' do
43
+ is_expected.to eq :snapshot
44
+ end
45
+ end
46
+
47
+ context 'with a release' do
48
+ let(:source) { build(:detailed, :type => :release) }
49
+
50
+ it 'is :release' do
51
+ is_expected.to eq :release
52
+ end
53
+ end
54
+ end
55
+
56
+ describe '.time' do
57
+ subject { result.time }
58
+
59
+ it 'is the expected value' do
60
+ is_expected.to eq source.time
61
+ end
62
+ end
63
+
64
+ describe '.asset_index' do
65
+ subject(:index) { result.asset_index }
66
+
67
+ it 'has the expected values' do
68
+ is_expected.to eq source.asset_index
69
+ end
70
+ end
71
+
72
+ describe '.downloads' do
73
+ subject(:downloads) { result.downloads }
74
+
75
+ it 'has the expected contents' do
76
+ is_expected.to contain_exactly(*source.downloads)
77
+ end
78
+ end
79
+
80
+ describe '.libraries' do
81
+ let(:rule) { build(:rule) }
82
+ let(:os_rule) { build(:os_rule) }
83
+ let(:source_libraries) { build_list(:library, 5, :rules => [rule, os_rule]) }
84
+ let(:source) { build(:detailed, :libraries => source_libraries) }
85
+ subject(:libraries) { result.libraries }
86
+
87
+ it 'has the expected contents' do
88
+ is_expected.to contain_exactly(*source.libraries)
89
+ end
90
+ end
91
+
92
+ describe '.launcher_properties' do
93
+ subject(:launcher) { result.launcher_properties }
94
+
95
+ it 'has the expected values' do
96
+ is_expected.to eq source.launcher_properties
97
+ end
98
+ end
99
+ end
100
+
101
+ end
@@ -0,0 +1,59 @@
1
+ require 'httpclient'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::MetaServer do
4
+ let(:manifest) { build(:manifest) }
5
+ let(:detailed) { build(:detailed) }
6
+ let(:assets) { build_list(:asset, 5) }
7
+ let(:manifest_document) { build(:manifest_document, :source => manifest) }
8
+ let(:version_document) { build(:version_document, :source => detailed) }
9
+ let(:asset_index_document) { build(:asset_index_document, :assets => assets) }
10
+ let(:manifest_url) { 'http://example.com/minecraft/version_manifest.json' }
11
+ let(:version_url) { 'http://example.com/minecraft/versions/1.0.json' }
12
+ let(:assets_url) { 'http://example.com/minecraft/assets/1.0.json' }
13
+ let(:client) { double('HTTPClient') }
14
+ subject(:meta_server) { Lapis::Minecraft::Versioning::MetaServer.new(client) }
15
+ before do
16
+ allow(client).to receive(:get) do |url, *_|
17
+ case url
18
+ when manifest_url
19
+ HTTP::Message.new_response(manifest_document.document)
20
+ when version_url
21
+ HTTP::Message.new_response(version_document.document)
22
+ when assets_url
23
+ HTTP::Message.new_response(asset_index_document.document)
24
+ else
25
+ HTTP::Message.new_response(nil).tap do |response|
26
+ response.status = 404
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ describe '#get_manifest' do
33
+ subject(:result) { meta_server.get_manifest(manifest_url) }
34
+ before { expect(client).to receive(:get).with(manifest_url) }
35
+
36
+ it 'returns a Manifest instance' do
37
+ is_expected.to be_a Lapis::Minecraft::Versioning::Manifest
38
+ end
39
+ end
40
+
41
+ describe '#get_version' do
42
+ subject(:result) { meta_server.get_details(version_url) }
43
+ before { expect(client).to receive(:get).with(version_url) }
44
+
45
+ it 'returns a Detailed instance' do
46
+ is_expected.to be_a Lapis::Minecraft::Versioning::Detailed
47
+ end
48
+ end
49
+
50
+ describe '#get_assets' do
51
+ subject(:result) { meta_server.get_assets(assets_url) }
52
+ before { expect(client).to receive(:get).with(assets_url) }
53
+
54
+ it 'returns a list of assets' do
55
+ is_expected.to all(be_an Lapis::Minecraft::Versioning::Asset)
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,73 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::OSRule do
4
+
5
+ describe '#allowed?' do
6
+ let(:rule) { build(:os_rule, :allow) }
7
+ subject { rule.allowed? }
8
+
9
+ it 'is the expected value' do
10
+ is_expected.to be_truthy
11
+ end
12
+ end
13
+
14
+ describe '#os_type' do
15
+ let(:rule) { build(:os_rule, :linux) }
16
+ subject { rule.os_type }
17
+
18
+ it 'is the expected value' do
19
+ is_expected.to eq :linux
20
+ end
21
+ end
22
+
23
+ describe '#os_version' do
24
+ subject { rule.os_version }
25
+
26
+ context 'with version specified' do
27
+ let(:rule) { build(:os_rule, :os_version => '^5\\.0$') }
28
+
29
+ it 'is a Regexp' do
30
+ is_expected.to be_a Regexp
31
+ end
32
+
33
+ it 'is the expected regular expression' do
34
+ expect(subject.match '5.0')
35
+ end
36
+ end
37
+
38
+ context 'without version specified' do
39
+ let(:rule) { build(:os_rule, :no_version) }
40
+
41
+ it 'is a Regexp' do
42
+ is_expected.to be_a Regexp
43
+ end
44
+
45
+ it 'matches any version' do
46
+ expect(subject.match '5.0')
47
+ end
48
+ end
49
+ end
50
+
51
+ describe '#==' do
52
+ subject { rule_1 == rule_2 }
53
+
54
+ context 'with identical rules' do
55
+ let(:rule_1) { build(:os_rule) }
56
+ let(:rule_2) { Lapis::Minecraft::Versioning::OSRule.new(rule_1.allowed?, rule_1.os_type, rule_1.os_version.source) }
57
+
58
+ it 'is true' do
59
+ is_expected.to be true
60
+ end
61
+ end
62
+
63
+ context 'with different rules' do
64
+ let(:rule_1) { build(:os_rule) }
65
+ let(:rule_2) { build(:os_rule, :os_version => rule_1.os_version.source + '-foobar') }
66
+
67
+ it 'is false' do
68
+ is_expected.to be false
69
+ end
70
+ end
71
+ end
72
+
73
+ end