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,89 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::AssetIndex do
4
+
5
+ describe '#id' do
6
+ let(:id) { 'beta1.8' }
7
+ let(:asset_index) { build(:asset_index, :id => id) }
8
+ subject { asset_index.id }
9
+
10
+ it 'is the expected value' do
11
+ is_expected.to eq id
12
+ end
13
+
14
+ it 'is frozen' do
15
+ is_expected.to be_frozen
16
+ end
17
+ end
18
+
19
+ describe '#size' do
20
+ let(:size) { 500 }
21
+ let(:asset_index) { build(:asset_index, :size => size) }
22
+ subject { asset_index.size }
23
+
24
+ it 'is the expected value' do
25
+ is_expected.to eq size
26
+ end
27
+ end
28
+
29
+ describe '#total_size' do
30
+ let(:total_size) { 1_000_000 }
31
+ let(:asset_index) { build(:asset_index, :total_size => total_size) }
32
+ subject { asset_index.total_size }
33
+
34
+ it 'is the expected value' do
35
+ is_expected.to eq total_size
36
+ end
37
+ end
38
+
39
+ describe '#url' do
40
+ let(:url) { 'https://example.com/minecraft/assets/beta1.8.json' }
41
+ let(:asset_index) { build(:asset_index, :url => url) }
42
+ subject { asset_index.url }
43
+
44
+ it 'is the expected value' do
45
+ is_expected.to eq url
46
+ end
47
+
48
+ it 'is frozen' do
49
+ is_expected.to be_frozen
50
+ end
51
+ end
52
+
53
+ describe '#sha1' do
54
+ let(:sha1) { Digest::SHA1.hexdigest 'foobarbaz' }
55
+ let(:asset_index) { build(:asset_index, :sha1 => sha1) }
56
+ subject { asset_index.sha1 }
57
+
58
+ it 'is the expected value' do
59
+ is_expected.to eq sha1
60
+ end
61
+
62
+ it 'is frozen' do
63
+ is_expected.to be_frozen
64
+ end
65
+ end
66
+
67
+ describe '#==' do
68
+ subject { index_1 == index_2 }
69
+
70
+ context 'with identical indices' do
71
+ let(:index_1) { build(:asset_index) }
72
+ let(:index_2) { Lapis::Minecraft::Versioning::AssetIndex.new(index_1.id, index_1.sha1, index_1.size, index_1.url, index_1.total_size) }
73
+
74
+ it 'is true' do
75
+ is_expected.to be true
76
+ end
77
+ end
78
+
79
+ context 'with different indices' do
80
+ let(:index_1) { build(:asset_index) }
81
+ let(:index_2) { build(:asset_index, :id => index_1.id + '-foobar') }
82
+
83
+ it 'is false' do
84
+ is_expected.to be false
85
+ end
86
+ end
87
+ end
88
+
89
+ end
@@ -0,0 +1,65 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Asset do
4
+
5
+ describe '#path' do
6
+ let(:path) { '/some/path/to/asset' }
7
+ let(:asset) { build(:asset, :path => path) }
8
+ subject { asset.path }
9
+
10
+ it 'is the expected value' do
11
+ is_expected.to eq path
12
+ end
13
+
14
+ it 'is frozen' do
15
+ is_expected.to be_frozen
16
+ end
17
+ end
18
+
19
+ describe '#size' do
20
+ let(:size) { 4096 }
21
+ let(:asset) { build(:asset, :size => size) }
22
+ subject { asset.size }
23
+
24
+ it 'is the expected value' do
25
+ is_expected.to eq size
26
+ end
27
+ end
28
+
29
+ describe '#sha1' do
30
+ let(:sha1) { Digest::SHA1.hexdigest('foobar') }
31
+ let(:asset) { build(:asset, :sha1 => sha1) }
32
+ subject { asset.sha1 }
33
+
34
+ it 'is the expected value' do
35
+ is_expected.to eq sha1
36
+ end
37
+
38
+ it 'is frozen' do
39
+ is_expected.to be_frozen
40
+ end
41
+ end
42
+
43
+ describe '#==' do
44
+ subject { asset_1 == asset_2 }
45
+
46
+ context 'with identical assets' do
47
+ let(:asset_1) { build(:asset) }
48
+ let(:asset_2) { Lapis::Minecraft::Versioning::Asset.new(asset_1.size, asset_1.sha1, asset_1.path) }
49
+
50
+ it 'is true' do
51
+ is_expected.to be true
52
+ end
53
+ end
54
+
55
+ context 'with different assets' do
56
+ let(:asset_1) { build(:asset) }
57
+ let(:asset_2) { build(:asset, :path => asset_1.path + '-foobar') }
58
+
59
+ it 'is false' do
60
+ is_expected.to be false
61
+ end
62
+ end
63
+ end
64
+
65
+ end
@@ -0,0 +1,75 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Basic do
4
+
5
+ describe '#id' do
6
+ let(:id) { 'beta1.8' }
7
+ let(:basic) { build(:basic, :id => id) }
8
+ subject { basic.id }
9
+
10
+ it 'is the expected value' do
11
+ is_expected.to eq id
12
+ end
13
+
14
+ it 'is frozen' do
15
+ is_expected.to be_frozen
16
+ end
17
+ end
18
+
19
+ describe '#type' do
20
+ let(:type) { :beta }
21
+ let(:basic) { build(:basic, :type => type) }
22
+ subject { basic.type }
23
+
24
+ it 'is the expected value' do
25
+ is_expected.to eq type
26
+ end
27
+ end
28
+
29
+ describe '#time' do
30
+ let(:time) { 3.years.ago }
31
+ let(:basic) { build(:basic, :time => time) }
32
+ subject { basic.time }
33
+
34
+ it 'is the expected value' do
35
+ is_expected.to eq time
36
+ end
37
+ end
38
+
39
+ describe '#url' do
40
+ let(:url) { 'https://example.com/minecraft/versions/beta1.8.json' }
41
+ let(:basic) { build(:basic, :url => url) }
42
+ subject { basic.url }
43
+
44
+ it 'is the expected value' do
45
+ is_expected.to eq url
46
+ end
47
+
48
+ it 'is frozen' do
49
+ is_expected.to be_frozen
50
+ end
51
+ end
52
+
53
+ describe '#==' do
54
+ subject { version_1 == version_2 }
55
+
56
+ context 'with identical versions' do
57
+ let(:version_1) { build(:basic) }
58
+ let(:version_2) { Lapis::Minecraft::Versioning::Basic.new(version_1.id, version_1.type, version_1.time, version_1.url) }
59
+
60
+ it 'is true' do
61
+ is_expected.to be true
62
+ end
63
+ end
64
+
65
+ context 'with different versions' do
66
+ let(:version_1) { build(:basic, :release) }
67
+ let(:version_2) { build(:basic, :snapshot) }
68
+
69
+ it 'is false' do
70
+ is_expected.to be false
71
+ end
72
+ end
73
+ end
74
+
75
+ end
@@ -0,0 +1,175 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::Detailed do
4
+
5
+ describe '#id' do
6
+ let(:id) { 'beta1.8' }
7
+ let(:detailed) { build(:detailed, :id => id) }
8
+ subject { detailed.id }
9
+
10
+ it 'is the expected value' do
11
+ is_expected.to eq id
12
+ end
13
+
14
+ it 'is frozen' do
15
+ is_expected.to be_frozen
16
+ end
17
+ end
18
+
19
+ describe '#type' do
20
+ let(:type) { :beta }
21
+ let(:detailed) { build(:detailed, :type => type) }
22
+ subject { detailed.type }
23
+
24
+ it 'is the expected value' do
25
+ is_expected.to eq type
26
+ end
27
+ end
28
+
29
+ describe '#time' do
30
+ let(:time) { 3.years.ago }
31
+ let(:detailed) { build(:detailed, :time => time) }
32
+ subject { detailed.time }
33
+
34
+ it 'is the expected value' do
35
+ is_expected.to eq time
36
+ end
37
+ end
38
+
39
+ describe '#url' do
40
+ let(:url) { 'https://example.com/minecraft/versions/beta1.8.json' }
41
+ let(:detailed) { build(:detailed, :url => url) }
42
+ subject { detailed.url }
43
+
44
+ it 'is the expected value' do
45
+ is_expected.to eq url
46
+ end
47
+
48
+ it 'is frozen' do
49
+ is_expected.to be_frozen
50
+ end
51
+ end
52
+
53
+ describe '#asset_index' do
54
+ let(:asset_index) { build(:asset_index) }
55
+ let(:detailed) { build(:detailed, :asset_index => asset_index) }
56
+ subject { detailed.asset_index }
57
+
58
+ it 'is the expected value' do
59
+ is_expected.to eq asset_index
60
+ end
61
+ end
62
+
63
+ describe '#downloads' do
64
+ let(:downloads) { build_list(:download, 5) }
65
+ let(:detailed) { build(:detailed, :downloads => downloads) }
66
+ subject { detailed.downloads }
67
+
68
+ it 'cloned the array' do
69
+ is_expected.not_to be downloads
70
+ end
71
+
72
+ it 'has the same elements' do
73
+ is_expected.to contain_exactly(*downloads)
74
+ end
75
+
76
+ it 'is frozen' do
77
+ is_expected.to be_frozen
78
+ end
79
+ end
80
+
81
+ describe '#client_download' do
82
+ let(:detailed) { build(:detailed, :downloads => downloads) }
83
+ subject { detailed.client_download }
84
+
85
+ context 'with a client provided' do
86
+ let(:client) { build(:download, :client) }
87
+ let(:downloads) { build_list(:download, 3) << client }
88
+
89
+ it 'finds the client' do
90
+ is_expected.to be client
91
+ end
92
+ end
93
+
94
+ context 'without a client provided' do
95
+ let(:downloads) { build_list(:download, 3) }
96
+
97
+ it 'returns nil' do
98
+ is_expected.to eq nil
99
+ end
100
+ end
101
+ end
102
+
103
+ describe '#server_download' do
104
+ let(:detailed) { build(:detailed, :downloads => downloads) }
105
+ subject { detailed.server_download }
106
+
107
+ context 'with a server provided' do
108
+ let(:server) { build(:download, :server) }
109
+ let(:downloads) { build_list(:download, 3) << server }
110
+
111
+ it 'finds the server' do
112
+ is_expected.to be server
113
+ end
114
+ end
115
+
116
+ context 'without a server provided' do
117
+ let(:downloads) { build_list(:download, 3) }
118
+
119
+ it 'returns nil' do
120
+ is_expected.to eq nil
121
+ end
122
+ end
123
+ end
124
+
125
+ describe '#libraries' do
126
+ let(:libraries) { build_list(:library, 5) }
127
+ let(:detailed) { build(:detailed, :libraries => libraries) }
128
+ subject { detailed.libraries }
129
+
130
+ it 'cloned the array' do
131
+ is_expected.not_to be libraries
132
+ end
133
+
134
+ it 'has the same elements' do
135
+ is_expected.to contain_exactly(*libraries)
136
+ end
137
+
138
+ it 'is frozen' do
139
+ is_expected.to be_frozen
140
+ end
141
+ end
142
+
143
+ describe '#launcher_properties' do
144
+ let(:launcher) { build(:launcher) }
145
+ let(:detailed) { build(:detailed, :launcher_properties => launcher) }
146
+ subject { detailed.launcher_properties }
147
+
148
+ it 'is the expected value' do
149
+ is_expected.to eq launcher
150
+ end
151
+ end
152
+
153
+ describe '#==' do
154
+ subject { version_1 == version_2 }
155
+
156
+ context 'with identical versions' do
157
+ let(:version_1) { build(:detailed) }
158
+ let(:version_2) { Lapis::Minecraft::Versioning::Detailed.new(version_1, version_1.asset_index, version_1.downloads, version_1.libraries, version_1.launcher_properties) }
159
+
160
+ it 'is true' do
161
+ is_expected.to be true
162
+ end
163
+ end
164
+
165
+ context 'with different versions' do
166
+ let(:version_1) { build(:detailed) }
167
+ let(:version_2) { build(:detailed, :id => version_1.id + '-foobar') }
168
+
169
+ it 'is false' do
170
+ is_expected.to be false
171
+ end
172
+ end
173
+ end
174
+
175
+ end
@@ -0,0 +1,73 @@
1
+ require_relative '../../../spec_helper'
2
+
3
+ RSpec.describe Lapis::Minecraft::Versioning::LauncherProperties do
4
+
5
+ describe '#main_class' do
6
+ let(:main_class) { 'com.example.minceraft.client' }
7
+ let(:launcher) { build(:launcher, :main_class => main_class) }
8
+ subject { launcher.main_class }
9
+
10
+ it 'is the expected value' do
11
+ is_expected.to eq main_class
12
+ end
13
+
14
+ it 'is frozen' do
15
+ is_expected.to be_frozen
16
+ end
17
+ end
18
+
19
+ describe '#arguments' do
20
+ let(:arguments) { %w(-foo bar -user ${auth_user}) }
21
+ let(:launcher) { build(:launcher, :arguments => arguments) }
22
+ subject { launcher.arguments }
23
+
24
+ it 'cloned the array' do
25
+ is_expected.not_to be arguments
26
+ end
27
+
28
+ it 'has the same elements' do
29
+ is_expected.to match_array arguments
30
+ end
31
+
32
+ it 'has frozen contents' do
33
+ is_expected.to all( be_frozen )
34
+ end
35
+
36
+ it 'is frozen' do
37
+ is_expected.to be_frozen
38
+ end
39
+ end
40
+
41
+ describe '#minimum_version' do
42
+ let(:minimum_version) { 16 }
43
+ let(:launcher) { build(:launcher, :minimum_version => minimum_version) }
44
+ subject { launcher.minimum_version }
45
+
46
+ it 'is the expected value' do
47
+ is_expected.to eq minimum_version
48
+ end
49
+ end
50
+
51
+ describe '#==' do
52
+ subject { launcher_1 == launcher_2 }
53
+
54
+ context 'with identical properties' do
55
+ let(:launcher_1) { build(:launcher) }
56
+ let(:launcher_2) { Lapis::Minecraft::Versioning::LauncherProperties.new(launcher_1.main_class, launcher_1.arguments, launcher_1.minimum_version) }
57
+
58
+ it 'is true' do
59
+ is_expected.to be true
60
+ end
61
+ end
62
+
63
+ context 'with different properties' do
64
+ let(:launcher_1) { build(:launcher) }
65
+ let(:launcher_2) { build(:launcher, :main_class => launcher_1.main_class + '.foobar') }
66
+
67
+ it 'is false' do
68
+ is_expected.to be false
69
+ end
70
+ end
71
+ end
72
+
73
+ end