genba-ruby 0.1.4 → 0.1.11
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.
- checksums.yaml +5 -5
- data/.circleci/config.yml +29 -0
- data/.gitignore +3 -0
- data/.rspec +0 -0
- data/.travis.yml +0 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +9 -7
- data/LICENSE.txt +0 -0
- data/README.md +152 -28
- data/Rakefile +0 -0
- data/circle.yml +0 -0
- data/{genba-ruby.gemspec → genba.gemspec} +1 -2
- data/lib/genba.rb +53 -3
- data/lib/genba/client.rb +80 -14
- data/lib/genba/client/direct_entitlements.rb +58 -0
- data/lib/genba/client/keys.rb +13 -14
- data/lib/genba/client/prices.rb +5 -5
- data/lib/genba/client/products.rb +20 -7
- data/lib/genba/client/reports.rb +19 -0
- data/lib/genba/client/restrictions.rb +7 -2
- data/lib/genba/key_black_list_request.rb +0 -0
- data/lib/genba/key_report_request.rb +26 -9
- data/lib/genba/util.rb +106 -0
- data/lib/genba/version.rb +1 -1
- metadata +21 -18
- data/lib/genba/engine.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b26858cbcdf74806c55c285a886a950f147311c4c0551315e7b5ab4953c38176
|
4
|
+
data.tar.gz: a328a76b1d1165e4ccecc2c9d44b5623321a461a060d81114fdb7e7edd5a8909
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a7139d2357bae3b9771d5adcdd5fbece38f9e0f07a42e4df4c434bafa093832698b9f947a1987ae7d9a0a7be2545be3ae2a9678dcfb78da049dff3274addfbe
|
7
|
+
data.tar.gz: 87256758cf9225fa6465306ccb9012daae5d6436618404ec23ecbeff5d06fa04d2db07e7a7c55eaee539b6014afe6b3fc69ec295a3e36a98566c7d4f7642e109
|
@@ -0,0 +1,29 @@
|
|
1
|
+
version: 2
|
2
|
+
|
3
|
+
.build_template: &build_definition
|
4
|
+
steps:
|
5
|
+
- checkout
|
6
|
+
- run:
|
7
|
+
name: Install libmcrypt-dev
|
8
|
+
command: apt-get update && apt-get install libmcrypt-dev -y
|
9
|
+
- run:
|
10
|
+
name: Bundle version
|
11
|
+
command: gem install bundler
|
12
|
+
- run:
|
13
|
+
name: Bundle Install
|
14
|
+
command: bundle check || bundle install
|
15
|
+
- run:
|
16
|
+
name: Run tests
|
17
|
+
command: |
|
18
|
+
bundle exec rspec
|
19
|
+
working_directory: ~/app
|
20
|
+
workflows:
|
21
|
+
version: 2
|
22
|
+
build_ruby_versions:
|
23
|
+
jobs:
|
24
|
+
- build_ruby2_5
|
25
|
+
jobs:
|
26
|
+
build_ruby2_5:
|
27
|
+
<<: *build_definition
|
28
|
+
docker:
|
29
|
+
- image: ruby:2.3.8-jessie
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
File without changes
|
data/.travis.yml
CHANGED
File without changes
|
data/CODE_OF_CONDUCT.md
CHANGED
File without changes
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
genba-ruby (0.1.
|
5
|
-
oj (~>
|
4
|
+
genba-ruby (0.1.11)
|
5
|
+
oj (~> 3.5)
|
6
6
|
rest-client (~> 2.0)
|
7
7
|
ruby-mcrypt (= 0.2.0)
|
8
8
|
|
@@ -32,12 +32,12 @@ GEM
|
|
32
32
|
i18n (1.0.1)
|
33
33
|
concurrent-ruby (~> 1.0)
|
34
34
|
method_source (0.9.0)
|
35
|
-
mime-types (3.
|
35
|
+
mime-types (3.2.2)
|
36
36
|
mime-types-data (~> 3.2015)
|
37
|
-
mime-types-data (3.
|
37
|
+
mime-types-data (3.2019.0331)
|
38
38
|
minitest (5.11.3)
|
39
39
|
netrc (0.11.0)
|
40
|
-
oj (
|
40
|
+
oj (3.7.12)
|
41
41
|
pry (0.11.3)
|
42
42
|
coderay (~> 1.1.0)
|
43
43
|
method_source (~> 0.9.0)
|
@@ -70,7 +70,8 @@ GEM
|
|
70
70
|
thread_safe (~> 0.1)
|
71
71
|
unf (0.1.4)
|
72
72
|
unf_ext
|
73
|
-
unf_ext (0.0.7.
|
73
|
+
unf_ext (0.0.7.6)
|
74
|
+
uuidtools (2.1.5)
|
74
75
|
webmock (3.4.1)
|
75
76
|
addressable (>= 2.3.6)
|
76
77
|
crack (>= 0.3.2)
|
@@ -88,7 +89,8 @@ DEPENDENCIES
|
|
88
89
|
pry-byebug
|
89
90
|
rake
|
90
91
|
rspec (~> 3.0)
|
92
|
+
uuidtools
|
91
93
|
webmock
|
92
94
|
|
93
95
|
BUNDLED WITH
|
94
|
-
1.
|
96
|
+
1.17.3
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -1,68 +1,94 @@
|
|
1
1
|
# Genba Ruby
|
2
2
|
|
3
3
|
[](https://travis-ci.org/iscreen/genba-ruby)
|
4
|
-
[](https://circleci.com/gh/iscreen/genba-ruby)
|
5
5
|
[](https://badge.fury.io/rb/genba-ruby)
|
6
6
|
|
7
|
-
The Genba Library provides convenient access to the [Genba API](https://api.genbagames.com/doc/) from applications written in the Ruby language.
|
7
|
+
The Genba Library provides convenient access to the [Genba API](https://api.genbagames.com/doc/) from applications written in the Ruby language.
|
8
8
|
|
9
9
|
## Basic Usage
|
10
10
|
|
11
|
+
```ruby
|
11
12
|
require 'genba'
|
12
13
|
|
13
14
|
genba_client = Genba.client(
|
14
15
|
username: 'api_genba_user',
|
15
|
-
app_id: '
|
16
|
-
api_key: '
|
16
|
+
app_id: '00000000-0000-0000-0000-000000000000',
|
17
|
+
api_key: '00000000000000000000000000000000',
|
18
|
+
customer_account_id: '00000000-0000-0000-0000-000000000000'
|
17
19
|
)
|
20
|
+
```
|
18
21
|
|
19
22
|
## Products
|
20
23
|
[Genba Products API](https://api.genbagames.com/doc/#api-Product)
|
21
24
|
|
22
|
-
|
25
|
+
### Product - Changes
|
26
|
+
|
27
|
+
Return a list of products which have changed since a given date, including basic or advanced metadata.
|
23
28
|
|
24
29
|
```ruby
|
25
30
|
payload = {
|
26
|
-
|
27
|
-
|
31
|
+
from_date: DateTime.now - 1,
|
32
|
+
country_iso: 'US',
|
33
|
+
include_meta: false
|
34
|
+
}
|
35
|
+
|
36
|
+
response = genba_client.products.get_changes(payload)
|
37
|
+
```
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
payload = {
|
41
|
+
include_meta: false
|
42
|
+
}
|
43
|
+
|
44
|
+
response = genba_client.products.get_changes(payload)
|
45
|
+
```
|
46
|
+
|
47
|
+
### Product - Get
|
48
|
+
|
49
|
+
Return a list of product objects, including basic or advanced metadata.
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
payload = {
|
53
|
+
include_meta: false
|
28
54
|
}
|
29
55
|
|
30
56
|
response = genba_client.products.get_products(payload)
|
31
57
|
```
|
32
58
|
|
33
|
-
|
59
|
+
Return a list of product objects with countryISO
|
34
60
|
|
35
61
|
```ruby
|
36
62
|
payload = {
|
37
|
-
|
38
|
-
|
39
|
-
includeMeta: false
|
63
|
+
country_iso: 'US',
|
64
|
+
include_meta: false
|
40
65
|
}
|
41
|
-
|
42
|
-
|
66
|
+
|
67
|
+
response = genba_client.products.get_products(payload)
|
43
68
|
```
|
44
69
|
|
45
|
-
|
70
|
+
Retrieve an existing product
|
46
71
|
|
47
72
|
```ruby
|
48
73
|
payload = {
|
49
|
-
|
50
|
-
|
51
|
-
includeMeta: false
|
74
|
+
sku_id: '79cf9bb2-e7f5-448f-b996-c52e4b2bb351',
|
75
|
+
include_meta: true
|
52
76
|
}
|
53
|
-
|
54
|
-
|
77
|
+
|
78
|
+
product = genba_client.products.get_products(payload)
|
55
79
|
```
|
56
80
|
|
81
|
+
### Product - Removed
|
82
|
+
|
57
83
|
Return a list of products which have been removed since a given date.
|
58
84
|
|
59
85
|
```ruby
|
60
86
|
payload = {
|
61
|
-
|
62
|
-
|
63
|
-
|
87
|
+
from_date: DateTime.now - 1,
|
88
|
+
country_iso: 'US',
|
89
|
+
include_meta: false
|
64
90
|
}
|
65
|
-
|
91
|
+
|
66
92
|
response = genba_client.products.get_removed(payload)
|
67
93
|
```
|
68
94
|
|
@@ -78,22 +104,39 @@ response = genba_client.prices.get_prices
|
|
78
104
|
## Restrictions
|
79
105
|
[Genba Restrictions API](https://api.genbagames.com/doc/#api-Restrictions)
|
80
106
|
|
107
|
+
### Restrictions - Get
|
108
|
+
|
81
109
|
Returns a list of product sku restrictions, whitelist - can only sold in countries, blacklist - cannot be sold in countries.
|
82
110
|
|
111
|
+
Returns a list of product sku restrictions by countryISO
|
112
|
+
|
83
113
|
```ruby
|
84
114
|
payload = {
|
85
|
-
|
86
|
-
fromDate: 1.days.ago.strftime('%FT%T'),
|
87
|
-
countryISO: 'US'
|
115
|
+
country_iso: 'US'
|
88
116
|
}
|
89
117
|
|
90
|
-
response = genba_client.restrictions.get_restrictions
|
118
|
+
response = genba_client.restrictions.get_restrictions(payload)
|
119
|
+
response[:productRestriction]
|
120
|
+
```
|
121
|
+
|
122
|
+
Returns a list of product sku restrictions by countryISO, productID and fromDate
|
123
|
+
|
124
|
+
```ruby
|
125
|
+
payload = {
|
126
|
+
product_id: '84d90a06-f458-4ed8-8f3d-91aa84cc6577',
|
127
|
+
from_date: 1.days.ago.strftime('%FT%T'),
|
128
|
+
country_iso: 'US'
|
129
|
+
}
|
130
|
+
|
131
|
+
response = genba_client.restrictions.get_restrictions(payload)
|
91
132
|
response[:productRestriction]
|
92
133
|
```
|
93
134
|
|
94
135
|
## Keys
|
95
136
|
[Genba Keys API](https://api.genbagames.com/doc/#api-Keys)
|
96
137
|
|
138
|
+
### Keys - Get Test Keys
|
139
|
+
|
97
140
|
Request Product Test Keys for a SKU
|
98
141
|
|
99
142
|
```ruby
|
@@ -106,8 +149,89 @@ response[:keys]
|
|
106
149
|
Request Product Keys for a SKU
|
107
150
|
|
108
151
|
```ruby
|
109
|
-
|
152
|
+
|
153
|
+
response = genba_client.keys.get_keys('84d90a06-f458-4ed8-8f3d-91aa84cc6577', 1, customerAccountId)
|
110
154
|
|
111
155
|
response[:status]
|
112
156
|
response[:keys]
|
113
157
|
```
|
158
|
+
|
159
|
+
### Keys - Report Usage
|
160
|
+
|
161
|
+
Report usage with keyCode
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
key = KeyReportRequest.new(
|
165
|
+
key: '00000000000000000000000000000000',
|
166
|
+
country_iso: 'US',
|
167
|
+
sale_date: DateTime.now,
|
168
|
+
user_ip_address: '182.212.212.22',
|
169
|
+
e_tailer_buying_price: 3.8,
|
170
|
+
e_tailer_buying_price_currency_code: 'USD',
|
171
|
+
e_tailer_selling_price_net: 3.2,
|
172
|
+
e_tailer_selling_price_gross: 3.8,
|
173
|
+
e_tailer_selling_price_currency_code: 'USD'
|
174
|
+
)
|
175
|
+
|
176
|
+
response = genba_client.keys.get_report_usage([key])
|
177
|
+
|
178
|
+
response[:acceptedCount]
|
179
|
+
response[:rejectedCount]
|
180
|
+
```
|
181
|
+
|
182
|
+
Report usage with key
|
183
|
+
```ruby
|
184
|
+
key = KeyReportRequest.new(
|
185
|
+
key_id: '00000000-ffff-2222-3333-444444444444',
|
186
|
+
country_iso: 'US',
|
187
|
+
sale_date: DateTime.now,
|
188
|
+
user_ip_address: '182.212.212.22',
|
189
|
+
e_tailer_buying_price: 3.8,
|
190
|
+
e_tailer_buying_price_currency_code: 'USD',
|
191
|
+
e_tailer_selling_price_net: 3.2,
|
192
|
+
e_tailer_selling_price_gross: 3.8,
|
193
|
+
e_tailer_selling_price_currency_code: 'USD'
|
194
|
+
)
|
195
|
+
key_res = @client.keys.get_report_usage([key])
|
196
|
+
response = genba_client.keys.get_report_usage([key])
|
197
|
+
|
198
|
+
response[:acceptedCount]
|
199
|
+
response[:rejectedCount]
|
200
|
+
```
|
201
|
+
|
202
|
+
## DirectEntitlement
|
203
|
+
|
204
|
+
### DirectEntitlement - Activate
|
205
|
+
|
206
|
+
Use this method to get and activate keys for a Direct Entitlement SKU. You will be charged at the point of calling this method.
|
207
|
+
|
208
|
+
```ruby
|
209
|
+
payload = {
|
210
|
+
sku_id: 'd972e0c7-5ddb-4e0d-9138-a78a6b269e99',
|
211
|
+
country_iso: 'US',
|
212
|
+
end_user_ip_address: '182.212.212.22',
|
213
|
+
sale_date: DateTime.now,
|
214
|
+
end_user_id: '0000001',
|
215
|
+
end_user_ticket: 'ticket0000001',
|
216
|
+
e_tailer_buying_price: 18.29,
|
217
|
+
e_tailer_buying_price_currency_code: 'USD',
|
218
|
+
e_tailer_selling_price_net: 19.89,
|
219
|
+
e_tailer_selling_price_gross: 20.29,
|
220
|
+
e_tailer_selling_price_currency_code: 'USD',
|
221
|
+
}
|
222
|
+
key_res = @client.direct_entitlements.activate(payload)
|
223
|
+
```
|
224
|
+
|
225
|
+
### DirectEntitlement - Redeem
|
226
|
+
|
227
|
+
Use this method to redeem keys already sold for a Direct Entitlement SKU and link them to the end-user's account. You will not be charged at the point of calling this method.
|
228
|
+
|
229
|
+
```ruby
|
230
|
+
payload = {
|
231
|
+
sku_id: 'd972e0c7-5ddb-4e0d-9138-a78a6b269e99',
|
232
|
+
key_id: '00000000-0000-0000-0000-000000000000',
|
233
|
+
end_user_id: '00001',
|
234
|
+
end_user_ticket: 'ticket00001'
|
235
|
+
}
|
236
|
+
key_res = @client.direct_entitlements.redeem(payload)
|
237
|
+
```
|
data/Rakefile
CHANGED
File without changes
|
data/circle.yml
CHANGED
File without changes
|
@@ -30,10 +30,9 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
31
|
spec.require_paths = ['lib']
|
32
32
|
|
33
|
+
spec.add_runtime_dependency 'oj', '~> 3.5'
|
33
34
|
spec.add_runtime_dependency 'rest-client', '~> 2.0'
|
34
35
|
spec.add_runtime_dependency 'ruby-mcrypt', '0.2.0'
|
35
|
-
spec.add_runtime_dependency 'oj', '~> 2.18'
|
36
|
-
|
37
36
|
|
38
37
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
39
38
|
spec.add_development_dependency 'rake', '~> 10.0'
|
data/lib/genba.rb
CHANGED
@@ -2,24 +2,74 @@ require 'base64'
|
|
2
2
|
require 'digest'
|
3
3
|
require 'mcrypt'
|
4
4
|
require 'rest-client'
|
5
|
+
require 'logger'
|
5
6
|
require 'oj'
|
6
7
|
require 'active_model'
|
7
8
|
|
8
|
-
# Engine (for rails)
|
9
|
-
require 'genba/engine' if defined?(Rails)
|
10
|
-
|
11
9
|
require 'genba/version'
|
12
10
|
require 'genba/key_black_list_request'
|
13
11
|
require 'genba/key_report_request'
|
12
|
+
require 'genba/util'
|
13
|
+
require 'genba/client/direct_entitlements'
|
14
14
|
require 'genba/client/keys'
|
15
15
|
require 'genba/client/prices'
|
16
16
|
require 'genba/client/products'
|
17
|
+
require 'genba/client/reports'
|
17
18
|
require 'genba/client/restrictions'
|
18
19
|
require 'genba/client'
|
19
20
|
|
20
21
|
# Genba API module
|
21
22
|
module Genba
|
23
|
+
@logger = nil
|
24
|
+
|
25
|
+
# map to the same values as the standard library's logger
|
26
|
+
LEVEL_DEBUG = Logger::DEBUG
|
27
|
+
LEVEL_ERROR = Logger::ERROR
|
28
|
+
LEVEL_INFO = Logger::INFO
|
29
|
+
|
22
30
|
def self.client(credentials = {})
|
23
31
|
Client.new(credentials)
|
24
32
|
end
|
33
|
+
|
34
|
+
# When set prompts the library to log some extra information to $stdout and
|
35
|
+
# $stderr about what it's doing. For example, it'll produce information about
|
36
|
+
# requests, responses, and errors that are received. Valid log levels are
|
37
|
+
# `debug` and `info`, with `debug` being a little more verbose in places.
|
38
|
+
#
|
39
|
+
# Use of this configuration is only useful when `.logger` is _not_ set. When
|
40
|
+
# it is, the decision what levels to print is entirely deferred to the logger.
|
41
|
+
def self.log_level
|
42
|
+
@log_level
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.log_level=(val)
|
46
|
+
# Backwards compatibility for values that we briefly allowed
|
47
|
+
if val == 'debug'
|
48
|
+
val = LEVEL_DEBUG
|
49
|
+
elsif val == 'info'
|
50
|
+
val = LEVEL_INFO
|
51
|
+
end
|
52
|
+
|
53
|
+
if !val.nil? && ![LEVEL_DEBUG, LEVEL_ERROR, LEVEL_INFO].include?(val)
|
54
|
+
raise ArgumentError, "log_level should only be set to `nil`, `debug` or `info`"
|
55
|
+
end
|
56
|
+
@log_level = val
|
57
|
+
end
|
58
|
+
|
59
|
+
# Sets a logger to which logging output will be sent. The logger should
|
60
|
+
# support the same interface as the `Logger` class that's part of Ruby's
|
61
|
+
# standard library (hint, anything in `Rails.logger` will likely be
|
62
|
+
# suitable).
|
63
|
+
#
|
64
|
+
# If `.logger` is set, the value of `.log_level` is ignored. The decision on
|
65
|
+
# what levels to print is entirely deferred to the logger.
|
66
|
+
def self.logger
|
67
|
+
@logger
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.logger=(val)
|
71
|
+
@logger = val
|
72
|
+
end
|
25
73
|
end
|
74
|
+
|
75
|
+
Genba.log_level = ENV['GENBA_LOG'] unless ENV['GENBA_LOG'].nil?
|
data/lib/genba/client.rb
CHANGED
@@ -3,6 +3,9 @@
|
|
3
3
|
module Genba
|
4
4
|
# Genba API Client
|
5
5
|
class Client
|
6
|
+
attr_accessor :customer_account_id,
|
7
|
+
:open_timeout, :read_timeout, :max_retry, :retry_delay
|
8
|
+
|
6
9
|
API_URL = 'https://api.genbagames.com/api'.freeze
|
7
10
|
|
8
11
|
@expires_on = nil
|
@@ -15,10 +18,15 @@ module Genba
|
|
15
18
|
# * +config+ - Genba API credential attribute
|
16
19
|
#
|
17
20
|
# ==== Options
|
18
|
-
def initialize(
|
19
|
-
@app_id =
|
20
|
-
@username =
|
21
|
-
@api_key =
|
21
|
+
def initialize(app_id:, username:, api_key:, customer_account_id:, options: {})
|
22
|
+
@app_id = app_id.strip
|
23
|
+
@username = username.strip
|
24
|
+
@api_key = api_key.strip
|
25
|
+
@customer_account_id = customer_account_id.strip
|
26
|
+
@open_timeout = options[:open_timeout] || 15
|
27
|
+
@read_timeout = options[:read_timeout] || 60
|
28
|
+
@max_retry = options[:max_retry] || 0
|
29
|
+
@retry_delay = options[:retry_delay] || 2
|
22
30
|
end
|
23
31
|
|
24
32
|
def generate_token
|
@@ -27,7 +35,7 @@ module Genba
|
|
27
35
|
response = RestClient.post(
|
28
36
|
"#{API_URL}/token",
|
29
37
|
body,
|
30
|
-
headers: { accept: 'application/json' }
|
38
|
+
headers: { accept: 'application/json', 'Content-Type': 'application/json' }
|
31
39
|
)
|
32
40
|
parsed_response = decode_json(response.body)
|
33
41
|
@id_token = parsed_response['token']
|
@@ -36,25 +44,71 @@ module Genba
|
|
36
44
|
raw_token
|
37
45
|
end
|
38
46
|
|
39
|
-
def rest_get_with_token(path, query_params = {}, headers = {})
|
47
|
+
def rest_get_with_token(path, query_params = {}, headers = {}, options = {})
|
40
48
|
genba_headers = token.merge(headers)
|
41
|
-
|
42
|
-
|
49
|
+
api_url = "#{API_URL}#{path}"
|
50
|
+
api_url += "?#{query_params.to_query}" unless query_params.empty?
|
51
|
+
response = execute_request(method: :get, url: api_url,
|
52
|
+
headers: genba_headers, options: options)
|
43
53
|
from_rest_client_response(response)
|
44
54
|
end
|
45
55
|
|
46
|
-
def rest_put_with_token(path, body = {}, headers = {})
|
56
|
+
def rest_put_with_token(path, body = {}, headers = {}, options = {})
|
47
57
|
genba_headers = token.merge(headers)
|
48
|
-
response =
|
58
|
+
response = execute_request(method: :put, url: "#{API_URL}#{path}",
|
59
|
+
payload: encode_json(body), headers: genba_headers, options: options)
|
49
60
|
from_rest_client_response(response)
|
50
61
|
end
|
51
62
|
|
52
|
-
def rest_post_with_token(path, body = {}, headers = {})
|
63
|
+
def rest_post_with_token(path, body = {}, headers = {}, options = {})
|
53
64
|
genba_headers = token.merge(headers)
|
54
|
-
response =
|
65
|
+
response = execute_request(method: :post, url: "#{API_URL}#{path}",
|
66
|
+
payload: encode_json(body), headers: genba_headers, options: options)
|
55
67
|
from_rest_client_response(response)
|
56
68
|
end
|
57
69
|
|
70
|
+
def execute_request(method:, url:, payload: {}, headers: {}, options: {})
|
71
|
+
request_opts = {
|
72
|
+
headers: headers,
|
73
|
+
method: method,
|
74
|
+
payload: payload,
|
75
|
+
url: url
|
76
|
+
}
|
77
|
+
other_opts = {
|
78
|
+
open_timeout: options[:open_timeout] || @open_timeout,
|
79
|
+
read_timeout: options[:read_timeout] || @read_timeout,
|
80
|
+
max_retry: options[:max_retry] || @max_retry
|
81
|
+
}
|
82
|
+
|
83
|
+
Genba::Util.log_debug "API Headers: #{headers.inspect}"
|
84
|
+
Genba::Util.log_debug "Options: #{other_opts}"
|
85
|
+
Genba::Util.log_info "#{method.upcase}: #{url}"
|
86
|
+
Genba::Util.log_info "payload: #{payload}" if payload.present?
|
87
|
+
|
88
|
+
request_opts.merge! other_opts
|
89
|
+
execute_request_with_rescues(request_opts, other_opts[:max_retry])
|
90
|
+
end
|
91
|
+
|
92
|
+
def execute_request_with_rescues(request_opts, max_retry)
|
93
|
+
num_try = 0
|
94
|
+
begin
|
95
|
+
response = RestClient::Request.execute(request_opts)
|
96
|
+
rescue StandardError => e
|
97
|
+
Genba::Util.log_error "#{e.class} => #{e.message}"
|
98
|
+
|
99
|
+
num_try += 1
|
100
|
+
sleep @retry_delay
|
101
|
+
|
102
|
+
if num_try <= max_retry
|
103
|
+
Genba::Util.log_error "retry ====> #{num_try}"
|
104
|
+
retry
|
105
|
+
end
|
106
|
+
|
107
|
+
raise e
|
108
|
+
end
|
109
|
+
response
|
110
|
+
end
|
111
|
+
|
58
112
|
def products
|
59
113
|
Products.new(self)
|
60
114
|
end
|
@@ -71,6 +125,14 @@ module Genba
|
|
71
125
|
Keys.new(self)
|
72
126
|
end
|
73
127
|
|
128
|
+
def direct_entitlements
|
129
|
+
DirectEntitlements.new(self)
|
130
|
+
end
|
131
|
+
|
132
|
+
def reports
|
133
|
+
Reports.new(self)
|
134
|
+
end
|
135
|
+
|
74
136
|
private
|
75
137
|
|
76
138
|
def encode_json(data)
|
@@ -97,7 +159,8 @@ module Genba
|
|
97
159
|
{
|
98
160
|
token: @id_token,
|
99
161
|
appId: @app_id,
|
100
|
-
accept: 'application/json'
|
162
|
+
accept: 'application/json',
|
163
|
+
'Content-Type': 'application/json'
|
101
164
|
}
|
102
165
|
else
|
103
166
|
{}
|
@@ -116,12 +179,15 @@ module Genba
|
|
116
179
|
def from_rest_client_response(response)
|
117
180
|
if response.code < 200 &&
|
118
181
|
response.code >= 400
|
182
|
+
Genba::Util.log_error "Invalid response object from API: #{response.body}" \
|
183
|
+
"(HTTP response code was #{response.code})"
|
119
184
|
raise "Invalid response object from API: #{response.body}" \
|
120
185
|
"(HTTP response code was #{response.code})"
|
121
186
|
end
|
122
187
|
# default decode by json
|
123
188
|
return decode_json(response.body) unless response.headers[:content_type]
|
124
|
-
if (response.headers[:content_type] =~ %r{application\/json})
|
189
|
+
if (response.headers[:content_type] =~ %r{application\/json}) >= 0
|
190
|
+
Genba::Util.log_info "response body\n#{response.body}"
|
125
191
|
decode_json(response.body)
|
126
192
|
end
|
127
193
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Genba
|
4
|
+
class Client
|
5
|
+
# DirectEntitlements client
|
6
|
+
class DirectEntitlements
|
7
|
+
def initialize(client)
|
8
|
+
@client = client
|
9
|
+
end
|
10
|
+
|
11
|
+
def activate(
|
12
|
+
sku_id:,
|
13
|
+
country_iso:,
|
14
|
+
end_user_ip_address:,
|
15
|
+
sale_date: DateTime.now,
|
16
|
+
end_user_id: nil,
|
17
|
+
end_user_ticket: nil,
|
18
|
+
e_tailer_buying_price:,
|
19
|
+
e_tailer_buying_price_currency_code:,
|
20
|
+
e_tailer_selling_price_net:,
|
21
|
+
e_tailer_selling_price_gross:,
|
22
|
+
e_tailer_selling_price_currency_code:,
|
23
|
+
headers: {},
|
24
|
+
options: {}
|
25
|
+
)
|
26
|
+
params = {
|
27
|
+
skuId: sku_id,
|
28
|
+
customerAccountId: @client.customer_account_id,
|
29
|
+
countryISO: country_iso,
|
30
|
+
endUserIpAddress: end_user_ip_address,
|
31
|
+
endUserId: end_user_id,
|
32
|
+
endUserTicket: end_user_ticket,
|
33
|
+
ETailerBuyingPrice: e_tailer_buying_price,
|
34
|
+
ETailerBuyingPriceCurrencyCode: e_tailer_buying_price_currency_code,
|
35
|
+
ETailerSellingPriceNet: e_tailer_selling_price_net,
|
36
|
+
ETailerSellingPriceGross: e_tailer_selling_price_gross,
|
37
|
+
ETailerSellingPriceCurrencyCode: e_tailer_selling_price_currency_code
|
38
|
+
}.select { |_, v| !v.nil? }
|
39
|
+
params[:saleDate] = sale_date.strftime('%FT%T') if sale_date
|
40
|
+
Genba::Util.log_debug "DirectEntitlements activate payload: #{params.inspect}"
|
41
|
+
@client.rest_get_with_token('/directentitlement/activate', params, headers, options)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Use this method to redeem keys already sold for a Direct Entitlement SKU and link them to the
|
45
|
+
# end-user's account. You will not be charged at the point of calling this method.
|
46
|
+
def redeem(sku_id:, key_id:, end_user_id:, end_user_ticket:, headers: {}, options: {})
|
47
|
+
params = {
|
48
|
+
customerAccountId: @client.customer_account_id,
|
49
|
+
skuId: sku_id,
|
50
|
+
keyId: key_id,
|
51
|
+
endUserId: end_user_id,
|
52
|
+
endUserTicket: end_user_ticket
|
53
|
+
}
|
54
|
+
@client.rest_get_with_token('/directentitlement/redeem', params, headers, options)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/genba/client/keys.rb
CHANGED
@@ -15,36 +15,35 @@ module Genba
|
|
15
15
|
@client.rest_get_with_token('/testKeys', params, headers)
|
16
16
|
end
|
17
17
|
|
18
|
-
def get_keys(sku_id, quantity = 1, params = {}, headers = {})
|
18
|
+
def get_keys(sku_id, quantity = 1, params = {}, headers = {}, options: {})
|
19
19
|
payload = params.merge(
|
20
20
|
skuId: sku_id,
|
21
|
-
quantity: quantity
|
21
|
+
quantity: quantity,
|
22
|
+
customerAccountId: @client.customer_account_id
|
22
23
|
)
|
23
|
-
@client.rest_get_with_token('/keys', payload, headers)
|
24
|
+
@client.rest_get_with_token('/keys', payload, headers, options)
|
24
25
|
end
|
25
26
|
|
26
|
-
def get_key_code_status(key_code, params = {}, headers = {})
|
27
|
+
def get_key_code_status(key_code, params = {}, headers = {}, options: {})
|
27
28
|
payload = params.merge(
|
28
29
|
keyCode: key_code
|
29
30
|
)
|
30
|
-
@client.rest_get_with_token('/keys', payload, headers)
|
31
|
+
@client.rest_get_with_token('/keys', payload, headers, options)
|
31
32
|
end
|
32
33
|
|
33
|
-
def get_key_status(key_id, params = {}, headers = {})
|
34
|
-
|
35
|
-
id: key_id
|
36
|
-
)
|
37
|
-
@client.rest_get_with_token('/keys', payload, headers)
|
34
|
+
def get_key_status(key_id, params = {}, headers = {}, options: {})
|
35
|
+
@client.rest_get_with_token("/keys/#{key_id}", params, headers, options)
|
38
36
|
end
|
39
37
|
|
40
|
-
def get_report_usage(keys = nil, headers = {})
|
38
|
+
def get_report_usage(keys = nil, headers = {}, options: {})
|
41
39
|
raise 'ReportUsage keys should be array' unless keys.is_a?(Array)
|
42
40
|
raise 'ReportUseag keys should be a KeyReportRequest class' unless key_report_request?(keys)
|
43
41
|
payload = keys.map(&:to_genba_json_payload)
|
44
|
-
|
42
|
+
Genba::Util.log_debug "get_report_usage payload: #{payload.inspect}"
|
43
|
+
@client.rest_post_with_token('/keyReport', payload, headers, options)
|
45
44
|
end
|
46
45
|
|
47
|
-
def black_list(keys = nil, headers = {})
|
46
|
+
def black_list(keys = nil, headers = {}, options: {})
|
48
47
|
raise 'Blacklist keys should be array' unless keys.is_a?(Array)
|
49
48
|
raise 'Blacklist keys should be a KeyBlackListRequest class' unless key_black_list_request?(keys)
|
50
49
|
|
@@ -53,7 +52,7 @@ module Genba
|
|
53
52
|
end
|
54
53
|
|
55
54
|
payload = keys.map(&:to_genba_json_payload)
|
56
|
-
@client.rest_post_with_token('/blackListKeys', payload, headers)
|
55
|
+
@client.rest_post_with_token('/blackListKeys', payload, headers, options)
|
57
56
|
end
|
58
57
|
|
59
58
|
private
|
data/lib/genba/client/prices.rb
CHANGED
@@ -8,11 +8,11 @@ module Genba
|
|
8
8
|
@client = client
|
9
9
|
end
|
10
10
|
|
11
|
-
def get_prices(
|
12
|
-
|
13
|
-
customerAccountId: customer_account_id
|
14
|
-
|
15
|
-
@client.rest_get_with_token('/prices',
|
11
|
+
def get_prices(params = {}, headers = {})
|
12
|
+
payload = params.merge(
|
13
|
+
customerAccountId: @client.customer_account_id
|
14
|
+
)
|
15
|
+
@client.rest_get_with_token('/prices', payload, headers)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -8,19 +8,32 @@ module Genba
|
|
8
8
|
@client = client
|
9
9
|
end
|
10
10
|
|
11
|
-
def get_products(
|
12
|
-
|
11
|
+
def get_products(sku_id: nil, country_iso: nil, include_meta: false, headers: {})
|
12
|
+
payload = {
|
13
|
+
skuId: sku_id,
|
14
|
+
countryISO: country_iso,
|
15
|
+
includeMeta: include_meta
|
16
|
+
}.select { |_, v| !v.nil? }
|
17
|
+
|
18
|
+
@client.rest_get_with_token('/product', payload, headers)
|
13
19
|
end
|
14
20
|
|
15
|
-
def get_changes(from_date, params
|
21
|
+
def get_changes(from_date: nil, country_iso: nil, include_meta: false, params: {}, headers: {})
|
16
22
|
payload = params.merge(
|
17
|
-
|
18
|
-
|
23
|
+
countryISO: country_iso,
|
24
|
+
includeMeta: include_meta
|
25
|
+
).select { |_, v| !v.nil? }
|
26
|
+
payload[:fromDate] = from_date.strftime('%FT%T') if from_date
|
19
27
|
@client.rest_get_with_token('/product/changes', payload, headers)
|
20
28
|
end
|
21
29
|
|
22
|
-
def get_removed(params
|
23
|
-
|
30
|
+
def get_removed(from_date: nil, country_iso: nil, params: {}, headers: {})
|
31
|
+
payload = params.merge(
|
32
|
+
countryISO: country_iso,
|
33
|
+
customerAccountId: @client.customer_account_id
|
34
|
+
).select { |_, v| !v.nil? }
|
35
|
+
payload[:fromDate] = from_date.strftime('%FT%T') if from_date
|
36
|
+
@client.rest_get_with_token('/product/removed', payload, headers)
|
24
37
|
end
|
25
38
|
end
|
26
39
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Genba
|
4
|
+
class Client
|
5
|
+
# Reports client
|
6
|
+
class Reports
|
7
|
+
def initialize(client)
|
8
|
+
@client = client
|
9
|
+
end
|
10
|
+
|
11
|
+
def publisher_raw_data(year = nil, params = {}, headers = {})
|
12
|
+
payload = params.merge({
|
13
|
+
Year: year || Time.now.strftime('%Y')
|
14
|
+
})
|
15
|
+
@client.rest_get_with_token('/report/publisher/rawdata', payload, headers)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -8,8 +8,13 @@ module Genba
|
|
8
8
|
@client = client
|
9
9
|
end
|
10
10
|
|
11
|
-
def get_restrictions(params
|
12
|
-
|
11
|
+
def get_restrictions(product_id: nil, country_iso: nil, from_date: nil, params: {}, headers: {})
|
12
|
+
payload = params.merge(
|
13
|
+
productId: product_id,
|
14
|
+
countryISO: country_iso
|
15
|
+
).select { |_, v| !v.nil? }
|
16
|
+
payload[:fromDate] = from_date.strftime('%FT%T') if from_date
|
17
|
+
@client.rest_get_with_token('/restrictions', payload, headers)
|
13
18
|
end
|
14
19
|
end
|
15
20
|
end
|
File without changes
|
@@ -5,27 +5,44 @@ class KeyReportRequest
|
|
5
5
|
attr_accessor :key, :key_id, :country_iso, :sale_date, :user_ip_address,
|
6
6
|
:e_tailer_buying_price, :e_tailer_buying_price_currency_code,
|
7
7
|
:e_tailer_selling_price_net, :e_tailer_selling_price_gross,
|
8
|
-
:e_tailer_selling_price_currency_code
|
8
|
+
:e_tailer_selling_price_currency_code,
|
9
|
+
:e_tailer_subsidiary
|
9
10
|
|
10
|
-
def initialize(
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
def initialize(
|
12
|
+
key: nil, key_id: nil, country_iso:, user_ip_address:, sale_date: nil,
|
13
|
+
e_tailer_buying_price:, e_tailer_buying_price_currency_code:,
|
14
|
+
e_tailer_selling_price_net:, e_tailer_selling_price_gross:, e_tailer_selling_price_currency_code:,
|
15
|
+
e_tailer_subsidiary: nil
|
16
|
+
)
|
17
|
+
@key = key
|
18
|
+
@key_id = key_id
|
19
|
+
@country_iso = country_iso
|
20
|
+
@user_ip_address = user_ip_address
|
21
|
+
@sale_date = sale_date
|
22
|
+
@e_tailer_buying_price = e_tailer_buying_price
|
23
|
+
@e_tailer_buying_price_currency_code = e_tailer_buying_price_currency_code
|
24
|
+
@e_tailer_selling_price_net = e_tailer_selling_price_net
|
25
|
+
@e_tailer_selling_price_gross = e_tailer_selling_price_gross
|
26
|
+
@e_tailer_selling_price_currency_code = e_tailer_selling_price_currency_code
|
27
|
+
@e_tailer_subsidiary = e_tailer_subsidiary
|
28
|
+
raise 'at least one of key or key_id' if key.nil? && key_id.nil?
|
15
29
|
end
|
16
30
|
|
17
31
|
def to_genba_json_payload
|
18
|
-
{
|
32
|
+
payload ={
|
19
33
|
key: @key,
|
20
34
|
keyId: @key_id,
|
21
35
|
countryISO: @country_iso,
|
22
|
-
saleDate: @sale_date,
|
23
36
|
userIpAddress: @user_ip_address,
|
24
37
|
ETailerBuyingPrice: @e_tailer_buying_price,
|
25
38
|
ETailerBuyingPriceCurrencyCode: @e_tailer_buying_price_currency_code,
|
26
39
|
ETailerSellingPriceNet: @e_tailer_selling_price_net,
|
27
40
|
ETailerSellingPriceGross: @e_tailer_selling_price_gross,
|
28
|
-
ETailerSellingPriceCurrencyCode: @e_tailer_selling_price_currency_code
|
41
|
+
ETailerSellingPriceCurrencyCode: @e_tailer_selling_price_currency_code,
|
42
|
+
EtailerSubsidiary: @e_tailer_subsidiary
|
29
43
|
}.select { |_, v| !v.nil? }
|
44
|
+
|
45
|
+
payload[:saleDate] = @sale_date.strftime('%FT%T') if @sale_date
|
46
|
+
payload
|
30
47
|
end
|
31
48
|
end
|
data/lib/genba/util.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module Genba
|
4
|
+
module Util
|
5
|
+
def self.log_error(message, data = {})
|
6
|
+
if !Genba.log_level.nil? && Genba.log_level <= Genba::LEVEL_ERROR
|
7
|
+
log_internal(message, data, color: :cyan,
|
8
|
+
level: Genba::LEVEL_ERROR, logger: Genba.logger, out: $stderr)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.log_info(message, data = {})
|
13
|
+
if !Genba.log_level.nil? && Genba.log_level <= Genba::LEVEL_INFO
|
14
|
+
log_internal(message, data, color: :cyan,
|
15
|
+
level: Genba::LEVEL_INFO, logger: Genba.logger, out: $stdout)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.log_debug(message, data = {})
|
20
|
+
if !Genba.log_level.nil? && Genba.log_level <= Genba::LEVEL_DEBUG
|
21
|
+
log_internal(message, data, color: :blue,
|
22
|
+
level: Genba::LEVEL_DEBUG, logger: Genba.logger, out: $stdout)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
COLOR_CODES = {
|
27
|
+
black: 0, light_black: 60,
|
28
|
+
red: 1, light_red: 61,
|
29
|
+
green: 2, light_green: 62,
|
30
|
+
yellow: 3, light_yellow: 63,
|
31
|
+
blue: 4, light_blue: 64,
|
32
|
+
magenta: 5, light_magenta: 65,
|
33
|
+
cyan: 6, light_cyan: 66,
|
34
|
+
white: 7, light_white: 67,
|
35
|
+
default: 9
|
36
|
+
}.freeze
|
37
|
+
private_constant :COLOR_CODES
|
38
|
+
|
39
|
+
# Uses an ANSI escape code to colorize text if it's going to be sent to a
|
40
|
+
# TTY.
|
41
|
+
def self.colorize(val, color, isatty)
|
42
|
+
return val unless isatty
|
43
|
+
|
44
|
+
mode = 0 # default
|
45
|
+
foreground = 30 + COLOR_CODES.fetch(color)
|
46
|
+
background = 40 + COLOR_CODES.fetch(:default)
|
47
|
+
|
48
|
+
"\033[#{mode};#{foreground};#{background}m#{val}\033[0m"
|
49
|
+
end
|
50
|
+
private_class_method :colorize
|
51
|
+
|
52
|
+
# Turns an integer log level into a printable name.
|
53
|
+
def self.level_name(level)
|
54
|
+
case level
|
55
|
+
when LEVEL_DEBUG then 'debug'
|
56
|
+
when LEVEL_ERROR then 'error'
|
57
|
+
when LEVEL_INFO then 'info'
|
58
|
+
else level
|
59
|
+
end
|
60
|
+
end
|
61
|
+
private_class_method :level_name
|
62
|
+
|
63
|
+
# TODO: Make these named required arguments when we drop support for Ruby
|
64
|
+
# 2.0.
|
65
|
+
def self.log_internal(message, data = {}, color: nil, level: nil, logger: nil, out: nil)
|
66
|
+
data_str = data.reject { |_k, v| v.nil? }
|
67
|
+
.map do |(k, v)|
|
68
|
+
format("%s=%s", colorize(k, color, logger.nil? && !out.nil? && out.isatty), wrap_logfmt_value(v))
|
69
|
+
end.join(' ')
|
70
|
+
|
71
|
+
if !logger.nil?
|
72
|
+
# the library's log levels are mapped to the same values as the
|
73
|
+
# standard library's logger
|
74
|
+
logger.log(level, message)
|
75
|
+
elsif out.isatty
|
76
|
+
out.puts format("%s %s %s", colorize(level_name(level)[0, 4].upcase, color, out.isatty), message, data_str)
|
77
|
+
else
|
78
|
+
out.puts format("message=%s level=%s %s", wrap_logfmt_value(message), level_name(level), data_str)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
private_class_method :log_internal
|
82
|
+
|
83
|
+
# Wraps a value in double quotes if it looks sufficiently complex so that
|
84
|
+
# it can be read by logfmt parsers.
|
85
|
+
def self.wrap_logfmt_value(val)
|
86
|
+
# If value is any kind of number, just allow it to be formatted directly
|
87
|
+
# to a string (this will handle integers or floats).
|
88
|
+
return val if val.is_a?(Numeric)
|
89
|
+
|
90
|
+
# Hopefully val is a string, but protect in case it's not.
|
91
|
+
val = val.to_s
|
92
|
+
|
93
|
+
if %r{[^\w\-/]} =~ val
|
94
|
+
# If the string contains any special characters, escape any double
|
95
|
+
# quotes it has, remove newlines, and wrap the whole thing in quotes.
|
96
|
+
format(%("%s"), val.gsub('"', '\"').delete("\n"))
|
97
|
+
else
|
98
|
+
# Otherwise use the basic value if it looks like a standard set of
|
99
|
+
# characters (and allow a few special characters like hyphens, and
|
100
|
+
# slashes)
|
101
|
+
val
|
102
|
+
end
|
103
|
+
end
|
104
|
+
private_class_method :wrap_logfmt_value
|
105
|
+
end
|
106
|
+
end
|
data/lib/genba/version.rb
CHANGED
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genba-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dean Lin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: oj
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '3.5'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '3.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rest-client
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '2.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '2.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: ruby-mcrypt
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.2.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.2.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,6 +101,7 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
+
- ".circleci/config.yml"
|
104
105
|
- ".gitignore"
|
105
106
|
- ".rspec"
|
106
107
|
- ".travis.yml"
|
@@ -113,16 +114,18 @@ files:
|
|
113
114
|
- bin/console
|
114
115
|
- bin/setup
|
115
116
|
- circle.yml
|
116
|
-
- genba
|
117
|
+
- genba.gemspec
|
117
118
|
- lib/genba.rb
|
118
119
|
- lib/genba/client.rb
|
120
|
+
- lib/genba/client/direct_entitlements.rb
|
119
121
|
- lib/genba/client/keys.rb
|
120
122
|
- lib/genba/client/prices.rb
|
121
123
|
- lib/genba/client/products.rb
|
124
|
+
- lib/genba/client/reports.rb
|
122
125
|
- lib/genba/client/restrictions.rb
|
123
|
-
- lib/genba/engine.rb
|
124
126
|
- lib/genba/key_black_list_request.rb
|
125
127
|
- lib/genba/key_report_request.rb
|
128
|
+
- lib/genba/util.rb
|
126
129
|
- lib/genba/version.rb
|
127
130
|
homepage: https://api.genbagames.com/doc/
|
128
131
|
licenses:
|
@@ -145,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
148
|
version: '0'
|
146
149
|
requirements: []
|
147
150
|
rubyforge_project:
|
148
|
-
rubygems_version: 2.
|
151
|
+
rubygems_version: 2.7.8
|
149
152
|
signing_key:
|
150
153
|
specification_version: 4
|
151
154
|
summary: genba api for ruby version
|