nexus_mods 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/nexus_mods/api/mod_updates.rb +49 -0
- data/lib/nexus_mods/api_client.rb +31 -17
- data/lib/nexus_mods/version.rb +1 -1
- data/lib/nexus_mods.rb +31 -1
- data/spec/nexus_mods_test/factories/mod_files.rb +2 -2
- data/spec/nexus_mods_test/factories/mod_updates.rb +49 -0
- data/spec/nexus_mods_test/helpers.rb +3 -1
- data/spec/nexus_mods_test/scenarios/nexus_mods/api/mod_updates_spec.rb +91 -0
- data/spec/nexus_mods_test/scenarios/nexus_mods/nexus_mods_caching_spec.rb +63 -15
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac9b76be57a989b2cd00cb120912dc8360fc926e76589769b725879f582e7d82
|
4
|
+
data.tar.gz: 61342738bb1678bdbbbf350bf645b90210c55c8b53a63bdbb9cc755ca6f146bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ad0436dd7917b94ebbedaa26e7f943a92520b0336413730e273108849b7f2659e026954ad1a68570e99c27ad6654a6c970be208ec500078a4490e65930ce896
|
7
|
+
data.tar.gz: 67a49c5e42db887253894726eed4b7ff3adde7f6da0f31d123ce6587117abb99d80a26e9a0db69bb541368fec4c6561b3b0a9564a8fe5ac27a412b0fb3c0173e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# [v2.1.0](https://github.com/Muriel-Salvan/nexus_mods/compare/v2.0.1...v2.1.0) (2023-04-11 18:24:04)
|
2
|
+
|
3
|
+
### Features
|
4
|
+
|
5
|
+
* [[Feature] Add API entry point to retrieve last updated mods](https://github.com/Muriel-Salvan/nexus_mods/commit/cf702fc2c146cc7d61aadca005aa0e784b807c44)
|
6
|
+
|
7
|
+
# [v2.0.1](https://github.com/Muriel-Salvan/nexus_mods/compare/v2.0.0...v2.0.1) (2023-04-11 10:22:54)
|
8
|
+
|
9
|
+
### Patches
|
10
|
+
|
11
|
+
* [Added NexusMods version in the user agent](https://github.com/Muriel-Salvan/nexus_mods/commit/41092e06db91d1dc3e3badb66aeccf85d62a2d00)
|
12
|
+
|
1
13
|
# [v2.0.0](https://github.com/Muriel-Salvan/nexus_mods/compare/v1.1.1...v2.0.0) (2023-04-11 10:15:58)
|
2
14
|
|
3
15
|
### Breaking changes
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class NexusMods
|
2
|
+
|
3
|
+
module Api
|
4
|
+
|
5
|
+
# A NexusMods mod updates.
|
6
|
+
class ModUpdates
|
7
|
+
|
8
|
+
attr_reader(
|
9
|
+
*%i[
|
10
|
+
mod_id
|
11
|
+
latest_file_update
|
12
|
+
latest_mod_activity
|
13
|
+
]
|
14
|
+
)
|
15
|
+
|
16
|
+
# Constructor
|
17
|
+
#
|
18
|
+
# Parameters::
|
19
|
+
# * *mod_id* (Integer): The mod's id
|
20
|
+
# * *latest_file_update* (Time): The mod's latest file update
|
21
|
+
# * *latest_mod_activity* (Time): The mod's latest activity
|
22
|
+
def initialize(
|
23
|
+
mod_id:,
|
24
|
+
latest_file_update:,
|
25
|
+
latest_mod_activity:
|
26
|
+
)
|
27
|
+
@mod_id = mod_id
|
28
|
+
@latest_file_update = latest_file_update
|
29
|
+
@latest_mod_activity = latest_mod_activity
|
30
|
+
end
|
31
|
+
|
32
|
+
# Equality operator
|
33
|
+
#
|
34
|
+
# Parameters::
|
35
|
+
# * *other* (Object): Other object to compare with
|
36
|
+
# Result::
|
37
|
+
# * Boolean: Are objects equal?
|
38
|
+
def ==(other)
|
39
|
+
other.is_a?(ModUpdates) &&
|
40
|
+
@mod_id == other.mod_id &&
|
41
|
+
@latest_file_update == other.latest_file_update &&
|
42
|
+
@latest_mod_activity == other.latest_mod_activity
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'faraday'
|
3
|
+
require 'nexus_mods/version'
|
3
4
|
require 'nexus_mods/cacheable_api'
|
4
5
|
|
5
6
|
class NexusMods
|
@@ -49,27 +50,29 @@ class NexusMods
|
|
49
50
|
#
|
50
51
|
# Parameters::
|
51
52
|
# * *path* (String): API path to contact (from v1/ and without .json)
|
53
|
+
# * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
|
52
54
|
# * *verb* (Symbol): Verb to be used (:get, :post...) [default: :get]
|
53
55
|
# * *clear_cache* (Boolean): Should we clear the API cache for this resource? [default: false]
|
54
56
|
# Result::
|
55
57
|
# * Object: The JSON response
|
56
|
-
def api(path, verb: :get, clear_cache: false)
|
57
|
-
clear_cached_api_cache(path, verb:) if clear_cache
|
58
|
-
cached_api(path, verb:)
|
58
|
+
def api(path, parameters: {}, verb: :get, clear_cache: false)
|
59
|
+
clear_cached_api_cache(path, parameters:, verb:) if clear_cache
|
60
|
+
cached_api(path, parameters:, verb:)
|
59
61
|
end
|
60
62
|
|
61
63
|
# Send an HTTP request to the API and get back the HTTP response
|
62
64
|
#
|
63
65
|
# Parameters::
|
64
66
|
# * *path* (String): API path to contact (from v1/ and without .json)
|
67
|
+
# * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
|
65
68
|
# * *verb* (Symbol): Verb to be used (:get, :post...) [default: :get]
|
66
69
|
# Result::
|
67
70
|
# * Faraday::Response: The HTTP response
|
68
|
-
def http(path, verb: :get)
|
71
|
+
def http(path, parameters: {}, verb: :get)
|
69
72
|
@http_client.send(verb) do |req|
|
70
|
-
req.url api_uri(path)
|
73
|
+
req.url api_uri(path, parameters:)
|
71
74
|
req.headers['apikey'] = @api_key
|
72
|
-
req.headers['User-Agent'] = "nexus_mods (#{RUBY_PLATFORM}) Ruby/#{RUBY_VERSION}"
|
75
|
+
req.headers['User-Agent'] = "nexus_mods/#{NexusMods::VERSION} (#{RUBY_PLATFORM}) Ruby/#{RUBY_VERSION}"
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
@@ -105,11 +108,12 @@ class NexusMods
|
|
105
108
|
#
|
106
109
|
# Parameters::
|
107
110
|
# * *path* (String): API path to contact (from v1/ and without .json)
|
111
|
+
# * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
|
108
112
|
# * *verb* (Symbol): Verb to be used (:get, :post...) [default: :get]
|
109
113
|
# Result::
|
110
114
|
# * Object: The JSON response
|
111
|
-
def cached_api(path, verb: :get)
|
112
|
-
res = http(path, verb:)
|
115
|
+
def cached_api(path, parameters: {}, verb: :get)
|
116
|
+
res = http(path, parameters:, verb:)
|
113
117
|
json = JSON.parse(res.body)
|
114
118
|
uri = api_uri(path)
|
115
119
|
@logger.debug "[API call] - #{verb} #{uri} => #{res.status}\n#{
|
@@ -138,11 +142,14 @@ class NexusMods
|
|
138
142
|
cacheable_api(
|
139
143
|
:cached_api,
|
140
144
|
key_format: proc do |_target, _method_name, method_args, method_kwargs|
|
141
|
-
"#{method_kwargs[:verb]}/#{method_args.first}
|
145
|
+
"#{method_kwargs[:verb]}/#{method_args.first}#{
|
146
|
+
method_kwargs[:parameters].empty? ? '' : "/#{method_kwargs[:parameters].map { |param, value| "#{param}=#{value}" }.sort.join('/')}"
|
147
|
+
}"
|
142
148
|
end,
|
143
149
|
expiry_from_key: proc do |key|
|
144
150
|
# Example of keys:
|
145
151
|
# get/games
|
152
|
+
# get/games/skyrimspecialedition/mods/updated/period=1d
|
146
153
|
# get/games/skyrimspecialedition/mods/2014
|
147
154
|
# get/games/skyrimspecialedition/mods/2014/files
|
148
155
|
# get/users/validate
|
@@ -154,13 +161,19 @@ class NexusMods
|
|
154
161
|
else
|
155
162
|
case key_components[2]
|
156
163
|
when 'mods'
|
157
|
-
case key_components[
|
158
|
-
when
|
159
|
-
|
160
|
-
|
161
|
-
ApiClient.api_client.api_cache_expiry[:mod_files]
|
164
|
+
case key_components[3]
|
165
|
+
when 'updated'
|
166
|
+
# According to the API doc, this is updated every 5 minutes
|
167
|
+
5 * 60
|
162
168
|
else
|
163
|
-
|
169
|
+
case key_components[4]
|
170
|
+
when nil
|
171
|
+
ApiClient.api_client.api_cache_expiry[:mod]
|
172
|
+
when 'files'
|
173
|
+
ApiClient.api_client.api_cache_expiry[:mod_files]
|
174
|
+
else
|
175
|
+
raise "Unknown API path: #{key}"
|
176
|
+
end
|
164
177
|
end
|
165
178
|
else
|
166
179
|
raise "Unknown API path: #{key}"
|
@@ -182,10 +195,11 @@ class NexusMods
|
|
182
195
|
#
|
183
196
|
# Parameters::
|
184
197
|
# * *path* (String): API path to contact (from v1/ and without .json)
|
198
|
+
# * *parameters* (Hash<Symbol,Object>): Optional parameters to add to the path [default: {}]
|
185
199
|
# Result::
|
186
200
|
# * String: The URI
|
187
|
-
def api_uri(path)
|
188
|
-
"https://api.nexusmods.com/v1/#{path}.json"
|
201
|
+
def api_uri(path, parameters: {})
|
202
|
+
"https://api.nexusmods.com/v1/#{path}.json#{parameters.empty? ? '' : "?#{parameters.map { |param, value| "#{param}=#{value}" }.join('&')}"}"
|
189
203
|
end
|
190
204
|
|
191
205
|
end
|
data/lib/nexus_mods/version.rb
CHANGED
data/lib/nexus_mods.rb
CHANGED
@@ -8,6 +8,7 @@ require 'nexus_mods/api/game'
|
|
8
8
|
require 'nexus_mods/api/user'
|
9
9
|
require 'nexus_mods/api/mod'
|
10
10
|
require 'nexus_mods/api/mod_file'
|
11
|
+
require 'nexus_mods/api/mod_updates'
|
11
12
|
|
12
13
|
# Ruby API to access NexusMods REST API
|
13
14
|
class NexusMods
|
@@ -130,7 +131,7 @@ class NexusMods
|
|
130
131
|
nexusmods_url: game_json['nexusmods_url'],
|
131
132
|
genre: game_json['genre'],
|
132
133
|
domain_name: game_json['domain_name'],
|
133
|
-
approved_date: Time.at(game_json['approved_date']),
|
134
|
+
approved_date: Time.at(game_json['approved_date']).utc,
|
134
135
|
files_count: game_json['file_count'],
|
135
136
|
files_views: game_json['file_views'],
|
136
137
|
files_endorsements: game_json['file_endorsements'],
|
@@ -213,4 +214,33 @@ class NexusMods
|
|
213
214
|
end
|
214
215
|
end
|
215
216
|
|
217
|
+
# Get a list of updated mod ids since a given time
|
218
|
+
#
|
219
|
+
# Parameters::
|
220
|
+
# * *game_domain_name* (String): Game domain name to query by default [default: @game_domain_name]
|
221
|
+
# * *since* (Symbol): The time from which we look for updated mods [default: :one_day]
|
222
|
+
# Possible values are:
|
223
|
+
# * *one_day*: Since 1 day
|
224
|
+
# * *one_week*: Since 1 week
|
225
|
+
# * *one_month*: Since 1 month
|
226
|
+
# * *clear_cache* (Boolean): Should we clear the API cache for this resource? [default: false]
|
227
|
+
# Result::
|
228
|
+
# * Array<ModUpdates>: Mod's updates information
|
229
|
+
def updated_mods(game_domain_name: @game_domain_name, since: :one_day, clear_cache: false)
|
230
|
+
nexus_mods_period = {
|
231
|
+
one_day: '1d',
|
232
|
+
one_week: '1w',
|
233
|
+
one_month: '1m'
|
234
|
+
}[since]
|
235
|
+
raise "Unknown time stamp: #{since}" if nexus_mods_period.nil?
|
236
|
+
|
237
|
+
@api_client.api("games/#{game_domain_name}/mods/updated", parameters: { period: nexus_mods_period }, clear_cache:).map do |updated_mod_json|
|
238
|
+
Api::ModUpdates.new(
|
239
|
+
mod_id: updated_mod_json['mod_id'],
|
240
|
+
latest_file_update: Time.at(updated_mod_json['latest_file_update']).utc,
|
241
|
+
latest_mod_activity: Time.at(updated_mod_json['latest_mod_activity']).utc
|
242
|
+
)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
216
246
|
end
|
@@ -63,7 +63,7 @@ module NexusModsTest
|
|
63
63
|
# Expect a mod's file to be the example one with id 2472
|
64
64
|
#
|
65
65
|
# Parameters::
|
66
|
-
# * *mod_file* (NexusMods::Api::
|
66
|
+
# * *mod_file* (NexusMods::Api::ModFile): Mod file to validate
|
67
67
|
def expect_mod_file_to_be2472(mod_file)
|
68
68
|
expect(mod_file.ids).to eq [2472, 1704]
|
69
69
|
expect(mod_file.uid).to eq 7_318_624_274_856
|
@@ -87,7 +87,7 @@ module NexusModsTest
|
|
87
87
|
# Expect a mod's file to be the example one with id 2487
|
88
88
|
#
|
89
89
|
# Parameters::
|
90
|
-
# * *mod_file* (NexusMods::Api::
|
90
|
+
# * *mod_file* (NexusMods::Api::ModFile): Mod file to validate
|
91
91
|
def expect_mod_file_to_be2487(mod_file)
|
92
92
|
expect(mod_file.ids).to eq [2487, 1705]
|
93
93
|
expect(mod_file.uid).to eq 7_318_624_274_857
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module NexusModsTest
|
2
|
+
|
3
|
+
module Factories
|
4
|
+
|
5
|
+
module ModUpdates
|
6
|
+
|
7
|
+
# Test mod updates with id 2014
|
8
|
+
def json_mod_updates2014
|
9
|
+
{
|
10
|
+
'mod_id' => 2014,
|
11
|
+
'latest_file_update' => 1_655_813_855,
|
12
|
+
'latest_mod_activity' => 1_681_169_675
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Test mod updates with id 100
|
17
|
+
def json_mod_updates100
|
18
|
+
{
|
19
|
+
'mod_id' => 100,
|
20
|
+
'latest_file_update' => 1_681_143_964,
|
21
|
+
'latest_mod_activity' => 1_681_143_964
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
# Expect a mod's updates to be the example one with id 2014
|
26
|
+
#
|
27
|
+
# Parameters::
|
28
|
+
# * *mod_updates* (NexusMods::Api::ModUpdates): Mod updates to validate
|
29
|
+
def expect_mod_file_to_be2014(mod_updates)
|
30
|
+
expect(mod_updates.mod_id).to eq 2014
|
31
|
+
expect(mod_updates.latest_file_update).to eq Time.parse('2022-06-21 12:17:35 UTC')
|
32
|
+
expect(mod_updates.latest_mod_activity).to eq Time.parse('2023-04-10 23:34:35 UTC')
|
33
|
+
end
|
34
|
+
|
35
|
+
# Expect a mod's updates to be the example one with id 100
|
36
|
+
#
|
37
|
+
# Parameters::
|
38
|
+
# * *mod_updates* (NexusMods::Api::ModUpdates): Mod updates to validate
|
39
|
+
def expect_mod_file_to_be100(mod_updates)
|
40
|
+
expect(mod_updates.mod_id).to eq 100
|
41
|
+
expect(mod_updates.latest_file_update).to eq Time.parse('2023-04-10 16:26:04 UTC')
|
42
|
+
expect(mod_updates.latest_mod_activity).to eq Time.parse('2023-04-10 16:26:04 UTC')
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -4,6 +4,7 @@ require 'rspec/support/object_formatter'
|
|
4
4
|
require 'nexus_mods_test/factories/games'
|
5
5
|
require 'nexus_mods_test/factories/mods'
|
6
6
|
require 'nexus_mods_test/factories/mod_files'
|
7
|
+
require 'nexus_mods_test/factories/mod_updates'
|
7
8
|
require 'nexus_mods'
|
8
9
|
|
9
10
|
module NexusModsTest
|
@@ -111,7 +112,7 @@ module NexusModsTest
|
|
111
112
|
json_as_str = json.to_json
|
112
113
|
mocked_etag = "W/\"#{Digest::MD5.hexdigest("#{path}|#{json_as_str}")}\""
|
113
114
|
expected_request_headers = {
|
114
|
-
'User-Agent' => "nexus_mods (#{RUBY_PLATFORM}) Ruby/#{RUBY_VERSION}",
|
115
|
+
'User-Agent' => "nexus_mods/#{NexusMods::VERSION} (#{RUBY_PLATFORM}) Ruby/#{RUBY_VERSION}",
|
115
116
|
'apikey' => api_key
|
116
117
|
}
|
117
118
|
@expected_stubs << [
|
@@ -180,6 +181,7 @@ RSpec.configure do |config|
|
|
180
181
|
config.include NexusModsTest::Factories::Games
|
181
182
|
config.include NexusModsTest::Factories::Mods
|
182
183
|
config.include NexusModsTest::Factories::ModFiles
|
184
|
+
config.include NexusModsTest::Factories::ModUpdates
|
183
185
|
config.before do
|
184
186
|
@nexus_mods = nil
|
185
187
|
# Reload the ApiClient as it stores caches at class level
|
@@ -0,0 +1,91 @@
|
|
1
|
+
describe NexusMods::Api::ModUpdates do
|
2
|
+
|
3
|
+
context 'when testing mod updates' do
|
4
|
+
|
5
|
+
before do
|
6
|
+
expect_validate_user
|
7
|
+
end
|
8
|
+
|
9
|
+
# Expect the given array of mod updates to be the ones of examples (for mods 100 and 2014)
|
10
|
+
#
|
11
|
+
# Parameters::
|
12
|
+
# * *mod_updates* (Array<NexusMods::Api::ModUpdates>): The list of mod updates to validate
|
13
|
+
def expect_mod_updates_to_be_example(mod_updates)
|
14
|
+
sorted_mod_updates = mod_updates.sort_by(&:mod_id)
|
15
|
+
expect_mod_file_to_be100(sorted_mod_updates.first)
|
16
|
+
expect_mod_file_to_be2014(sorted_mod_updates[1])
|
17
|
+
end
|
18
|
+
|
19
|
+
{
|
20
|
+
'last day' => {
|
21
|
+
since: :one_day,
|
22
|
+
expected_url_params: 'period=1d'
|
23
|
+
},
|
24
|
+
'last week' => {
|
25
|
+
since: :one_week,
|
26
|
+
expected_url_params: 'period=1w'
|
27
|
+
},
|
28
|
+
'last month' => {
|
29
|
+
since: :one_month,
|
30
|
+
expected_url_params: 'period=1m'
|
31
|
+
}
|
32
|
+
}.each do |since, since_config|
|
33
|
+
|
34
|
+
context "when testing updated months since #{since}" do
|
35
|
+
|
36
|
+
it 'returns updated mods' do
|
37
|
+
expect_http_call_to(
|
38
|
+
path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
|
39
|
+
json: [
|
40
|
+
json_mod_updates2014,
|
41
|
+
json_mod_updates100
|
42
|
+
]
|
43
|
+
)
|
44
|
+
expect_mod_updates_to_be_example(nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since]))
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'returns updated mods information for the default game' do
|
48
|
+
expect_http_call_to(
|
49
|
+
path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
|
50
|
+
json: [
|
51
|
+
json_mod_updates2014,
|
52
|
+
json_mod_updates100
|
53
|
+
]
|
54
|
+
)
|
55
|
+
expect_mod_updates_to_be_example(nexus_mods(game_domain_name: 'skyrimspecialedition').updated_mods(since: since_config[:since]))
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'returns updated mods information for the default game set using accessor' do
|
59
|
+
expect_http_call_to(
|
60
|
+
path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
|
61
|
+
json: [
|
62
|
+
json_mod_updates2014,
|
63
|
+
json_mod_updates100
|
64
|
+
]
|
65
|
+
)
|
66
|
+
nexus_mods.game_domain_name = 'skyrimspecialedition'
|
67
|
+
expect_mod_updates_to_be_example(nexus_mods.updated_mods(since: since_config[:since]))
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'compares objects for equality' do
|
71
|
+
expect_http_call_to(
|
72
|
+
path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
|
73
|
+
json: [json_mod_updates2014]
|
74
|
+
)
|
75
|
+
mod_updates1 = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
|
76
|
+
mod_updates2 = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
|
77
|
+
expect(mod_updates1.object_id).not_to eq mod_updates2.object_id
|
78
|
+
expect(mod_updates1).to eq mod_updates2
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'fails to fetch updated mods for an unknown period' do
|
86
|
+
expect { nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: :unknown_since) }.to raise_error 'Unknown time stamp: unknown_since'
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -20,7 +20,7 @@ describe NexusMods do
|
|
20
20
|
]
|
21
21
|
)
|
22
22
|
games = nexus_mods.games
|
23
|
-
expect(nexus_mods.games).to eq
|
23
|
+
expect(nexus_mods.games).to eq games
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'does not cache games queries if asked' do
|
@@ -34,7 +34,7 @@ describe NexusMods do
|
|
34
34
|
times: 2
|
35
35
|
)
|
36
36
|
games = nexus_mods.games
|
37
|
-
expect(nexus_mods.games(clear_cache: true)).to eq
|
37
|
+
expect(nexus_mods.games(clear_cache: true)).to eq games
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'caches mod queries' do
|
@@ -44,7 +44,7 @@ describe NexusMods do
|
|
44
44
|
json: json_complete_mod
|
45
45
|
)
|
46
46
|
mod = nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
|
47
|
-
expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq
|
47
|
+
expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'does not cache mod queries if asked' do
|
@@ -55,7 +55,7 @@ describe NexusMods do
|
|
55
55
|
times: 2
|
56
56
|
)
|
57
57
|
mod = nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
|
58
|
-
expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq
|
58
|
+
expect(nexus_mods.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq mod
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'caches mod files queries' do
|
@@ -65,7 +65,7 @@ describe NexusMods do
|
|
65
65
|
json: { files: [json_mod_file2472, json_mod_file2487] }
|
66
66
|
)
|
67
67
|
mod_files = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
|
68
|
-
expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq
|
68
|
+
expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod_files
|
69
69
|
end
|
70
70
|
|
71
71
|
it 'does not cache mod files queries if asked' do
|
@@ -76,7 +76,55 @@ describe NexusMods do
|
|
76
76
|
times: 2
|
77
77
|
)
|
78
78
|
mod_files = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
|
79
|
-
expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq
|
79
|
+
expect(nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)).to eq mod_files
|
80
|
+
end
|
81
|
+
|
82
|
+
{
|
83
|
+
'last day' => {
|
84
|
+
since: :one_day,
|
85
|
+
expected_url_params: 'period=1d'
|
86
|
+
},
|
87
|
+
'last week' => {
|
88
|
+
since: :one_week,
|
89
|
+
expected_url_params: 'period=1w'
|
90
|
+
},
|
91
|
+
'last month' => {
|
92
|
+
since: :one_month,
|
93
|
+
expected_url_params: 'period=1m'
|
94
|
+
}
|
95
|
+
}.each do |since, since_config|
|
96
|
+
|
97
|
+
context "when testing updated months since #{since}" do
|
98
|
+
|
99
|
+
it 'caches mod updates queries' do
|
100
|
+
expect_validate_user
|
101
|
+
expect_http_call_to(
|
102
|
+
path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
|
103
|
+
json: [
|
104
|
+
json_mod_updates2014,
|
105
|
+
json_mod_updates100
|
106
|
+
]
|
107
|
+
)
|
108
|
+
mod_updates = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
|
109
|
+
expect(nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])).to eq mod_updates
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'does not cache mod updates queries if asked' do
|
113
|
+
expect_validate_user
|
114
|
+
expect_http_call_to(
|
115
|
+
path: "/v1/games/skyrimspecialedition/mods/updated.json?#{since_config[:expected_url_params]}",
|
116
|
+
json: [
|
117
|
+
json_mod_updates2014,
|
118
|
+
json_mod_updates100
|
119
|
+
],
|
120
|
+
times: 2
|
121
|
+
)
|
122
|
+
mod_updates = nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since])
|
123
|
+
expect(nexus_mods.updated_mods(game_domain_name: 'skyrimspecialedition', since: since_config[:since], clear_cache: true)).to eq mod_updates
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
80
128
|
end
|
81
129
|
|
82
130
|
it 'expires games queries cache' do
|
@@ -92,7 +140,7 @@ describe NexusMods do
|
|
92
140
|
nexus_mods_instance = nexus_mods(api_cache_expiry: { games: 1 })
|
93
141
|
games = nexus_mods_instance.games
|
94
142
|
sleep 2
|
95
|
-
expect(nexus_mods_instance.games).to eq
|
143
|
+
expect(nexus_mods_instance.games).to eq games
|
96
144
|
end
|
97
145
|
|
98
146
|
it 'expires mod queries cache' do
|
@@ -105,7 +153,7 @@ describe NexusMods do
|
|
105
153
|
nexus_mods_instance = nexus_mods(api_cache_expiry: { mod: 1 })
|
106
154
|
mod = nexus_mods_instance.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
|
107
155
|
sleep 2
|
108
|
-
expect(nexus_mods_instance.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq
|
156
|
+
expect(nexus_mods_instance.mod(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod
|
109
157
|
end
|
110
158
|
|
111
159
|
it 'expires mod files queries cache' do
|
@@ -118,7 +166,7 @@ describe NexusMods do
|
|
118
166
|
nexus_mods_instance = nexus_mods(api_cache_expiry: { mod_files: 1 })
|
119
167
|
mod_files = nexus_mods_instance.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
|
120
168
|
sleep 2
|
121
|
-
expect(nexus_mods_instance.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq
|
169
|
+
expect(nexus_mods_instance.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)).to eq mod_files
|
122
170
|
end
|
123
171
|
|
124
172
|
it 'only clears the cache of the wanted resource' do
|
@@ -136,8 +184,8 @@ describe NexusMods do
|
|
136
184
|
mod_files20151 = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2015)
|
137
185
|
mod_files20142 = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014, clear_cache: true)
|
138
186
|
mod_files20152 = nexus_mods.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2015)
|
139
|
-
expect(mod_files20141).to eq
|
140
|
-
expect(mod_files20151).to eq
|
187
|
+
expect(mod_files20141).to eq mod_files20142
|
188
|
+
expect(mod_files20151).to eq mod_files20152
|
141
189
|
end
|
142
190
|
|
143
191
|
context 'with file persistence' do
|
@@ -276,10 +324,10 @@ describe NexusMods do
|
|
276
324
|
nexus_mods_instance3 = nexus_mods(api_cache_file:)
|
277
325
|
mod_files20143 = nexus_mods_instance3.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2014)
|
278
326
|
mod_files20153 = nexus_mods_instance3.mod_files(game_domain_name: 'skyrimspecialedition', mod_id: 2015)
|
279
|
-
expect(mod_files20141).to eq
|
280
|
-
expect(mod_files20141).to eq
|
281
|
-
expect(mod_files20151).to eq
|
282
|
-
expect(mod_files20151).to eq
|
327
|
+
expect(mod_files20141).to eq mod_files20142
|
328
|
+
expect(mod_files20141).to eq mod_files20143
|
329
|
+
expect(mod_files20151).to eq mod_files20152
|
330
|
+
expect(mod_files20151).to eq mod_files20153
|
283
331
|
end
|
284
332
|
end
|
285
333
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexus_mods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Muriel Salvan
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- lib/nexus_mods/api/game.rb
|
138
138
|
- lib/nexus_mods/api/mod.rb
|
139
139
|
- lib/nexus_mods/api/mod_file.rb
|
140
|
+
- lib/nexus_mods/api/mod_updates.rb
|
140
141
|
- lib/nexus_mods/api/user.rb
|
141
142
|
- lib/nexus_mods/api_client.rb
|
142
143
|
- lib/nexus_mods/cacheable_api.rb
|
@@ -146,12 +147,14 @@ files:
|
|
146
147
|
- lib/nexus_mods/version.rb
|
147
148
|
- spec/nexus_mods_test/factories/games.rb
|
148
149
|
- spec/nexus_mods_test/factories/mod_files.rb
|
150
|
+
- spec/nexus_mods_test/factories/mod_updates.rb
|
149
151
|
- spec/nexus_mods_test/factories/mods.rb
|
150
152
|
- spec/nexus_mods_test/helpers.rb
|
151
153
|
- spec/nexus_mods_test/scenarios/nexus_mods/api/api_limits_spec.rb
|
152
154
|
- spec/nexus_mods_test/scenarios/nexus_mods/api/game_spec.rb
|
153
155
|
- spec/nexus_mods_test/scenarios/nexus_mods/api/mod_file_spec.rb
|
154
156
|
- spec/nexus_mods_test/scenarios/nexus_mods/api/mod_spec.rb
|
157
|
+
- spec/nexus_mods_test/scenarios/nexus_mods/api/mod_updates_spec.rb
|
155
158
|
- spec/nexus_mods_test/scenarios/nexus_mods/nexus_mods_access_spec.rb
|
156
159
|
- spec/nexus_mods_test/scenarios/nexus_mods/nexus_mods_caching_spec.rb
|
157
160
|
- spec/nexus_mods_test/scenarios/nexus_mods/nexus_mods_common_spec.rb
|