futureshop 0.1.2 → 0.1.6
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 +4 -4
- data/.gitlab-ci.yml +1 -1
- data/CHANGELOG.md +19 -0
- data/README.md +2 -1
- data/exe/futureshop +34 -27
- data/futureshop.gemspec +3 -3
- data/lib/futureshop/client.rb +13 -8
- data/lib/futureshop/inventory.rb +51 -0
- data/lib/futureshop/version.rb +1 -1
- data/lib/futureshop.rb +26 -17
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c7319b9455fdd1e3d74f600e88bb4412ae18cb9bc44dd21ae9f0b3cf973abf2
|
4
|
+
data.tar.gz: 442ee86969ef328888583a4161342d872a17414581a0e7ce2e160c7aa8437f6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4255adf63d28af1d55988b826d8be1c0f791ef805163fa193a869a3e41d902c4534a94fbcb73f4572e92d2d897f211208c32973ccae2ab4ef159c19850d8e70b
|
7
|
+
data.tar.gz: fac3eaece886d91a44021dc688c3e6cd196334fba574f4956dc6403bf53c04677041f96cd71f27abe2de7d39a1f79f31f361422bf59e841562168dd868ad039b
|
data/.gitlab-ci.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.1.6] - 2021-11-04
|
4
|
+
|
5
|
+
- Change required Ruby version from 3.0.0 to 2.7.0
|
6
|
+
- Complete command options
|
7
|
+
|
8
|
+
## [0.1.5] - 2021-10-21
|
9
|
+
|
10
|
+
- Add `Futureshop::Inventory` class
|
11
|
+
- Add `inventories` subcommand
|
12
|
+
|
13
|
+
## [0.1.4] - 2021-10-11
|
14
|
+
|
15
|
+
- Handle order's couponList field, which was introduced on 2021-09-29
|
16
|
+
|
17
|
+
## [0.1.3] - 2021-08-25
|
18
|
+
|
19
|
+
- Fix option passing
|
20
|
+
- Fix handling of nextUrl
|
21
|
+
|
3
22
|
## [0.1.2] - 2021-08-06
|
4
23
|
|
5
24
|
- Fix command-line option name
|
data/README.md
CHANGED
@@ -21,6 +21,7 @@ Or install it yourself as:
|
|
21
21
|
## Usage
|
22
22
|
|
23
23
|
futureshop orders -fcsv --order-date-start=2016-07-05 --order-date-end=2021-07-20 > orders.2021-07-20.csv
|
24
|
+
futureshop inventories --type=regular,preorder
|
24
25
|
|
25
26
|
## Development
|
26
27
|
|
@@ -30,4 +31,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
30
31
|
|
31
32
|
## Contributing
|
32
33
|
|
33
|
-
Bug reports and merge requests are welcome on GitHub at https://gitlab.com/KitaitiMakoto/
|
34
|
+
Bug reports and merge requests are welcome on GitHub at https://gitlab.com/KitaitiMakoto/futureshop
|
data/exe/futureshop
CHANGED
@@ -4,7 +4,7 @@ require "optparse"
|
|
4
4
|
require "optparse/time"
|
5
5
|
require "futureshop"
|
6
6
|
|
7
|
-
SUPPORTED_COMMANDS = %w[orders]
|
7
|
+
SUPPORTED_COMMANDS = %w[orders inventories]
|
8
8
|
|
9
9
|
def main(argv)
|
10
10
|
global_options = parse_global_options(argv)
|
@@ -14,6 +14,8 @@ def main(argv)
|
|
14
14
|
case subcommand
|
15
15
|
when "orders"
|
16
16
|
orders global_options, argv
|
17
|
+
when "inventories"
|
18
|
+
inventories global_options, argv
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -27,6 +29,11 @@ end
|
|
27
29
|
|
28
30
|
def parse_global_options(argv)
|
29
31
|
parse_options(argv) {|opt|
|
32
|
+
opt.banner = "Usage:\n" + SUPPORTED_COMMANDS.collect {|command|
|
33
|
+
" #{opt.program_name} [global options] #{command} [options]"
|
34
|
+
}.join("\n")
|
35
|
+
opt.version = Futureshop::VERSION
|
36
|
+
opt.separator "Global options:"
|
30
37
|
opt.on "--verbose" do
|
31
38
|
$VERBOSE = true
|
32
39
|
end
|
@@ -36,38 +43,38 @@ end
|
|
36
43
|
def orders(global_options, argv)
|
37
44
|
options = {format: "json"}
|
38
45
|
options.update(parse_options(argv) {|opt|
|
39
|
-
|
40
|
-
opt.on "--
|
41
|
-
opt.on "--order-date-
|
46
|
+
formats = %w[json csv]
|
47
|
+
opt.on "-f", "--format=FORMAT", ["json", "csv"], "Output format. Available: #{formats.join(', ')}"
|
48
|
+
opt.on "--order-date-start=YYYY-MM-DD", Time, "Retrieve orders whose date is newer than or equal to argument."
|
49
|
+
opt.on "--order-date-end=YYYY-MM-DD", Time, "Retrieve orders whose date is older than or equal to argument."
|
42
50
|
})
|
43
|
-
Futureshop.orders(order_date_start: options["order-date-start"], order_date_end: options["order-date-end"], format: options[
|
51
|
+
Futureshop.orders(order_date_start: options[:"order-date-start"], order_date_end: options[:"order-date-end"], format: options[:format])
|
44
52
|
end
|
45
53
|
|
46
|
-
def
|
47
|
-
|
48
|
-
shop_key: ENV["FUTURESHOP_SHOP_KEY"],
|
49
|
-
client_id: ENV["FUTURESHOP_CLIENT_ID"],
|
50
|
-
client_secret: ENV["FUTURESHOP_CLIENT_SECRET"],
|
51
|
-
api_domain: ENV["FUTURESHOP_API_DOMAIN"]
|
52
|
-
)
|
53
|
-
end
|
54
|
+
def inventories(global_options, argv)
|
55
|
+
require "futureshop/inventory"
|
54
56
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
57
|
+
options = {
|
58
|
+
type: ["regular"],
|
59
|
+
product_no: [],
|
60
|
+
jan_code: []
|
61
|
+
}
|
62
|
+
options = options.update(parse_options(argv) {|opt|
|
63
|
+
opt.on "--type=TYPE", Array, "Type. Available: regular, preorder, planned, realstore"
|
64
|
+
opt.on "--create-date-start=DATE", Time, "Retrieve products whose registration date is newer than or equal to argument."
|
65
|
+
opt.on "--create-date-end=DATE", Time, "Retrieve products whose registration date is older than or equal to argument."
|
66
|
+
opt.on "--product-no=NUMBER", Array, "Product number."
|
67
|
+
opt.on "--jan-code=CODE", Array, "JAN code."
|
68
|
+
})
|
69
|
+
if options[:type]
|
70
|
+
unknown_types = options[:type].select {|type| ! %w[regular preorder planned realstore].include?(type)}
|
71
|
+
unless unknown_types.empty?
|
72
|
+
raise "Unknown type(s): #{unknown_types.join(', ')}"
|
68
73
|
end
|
69
74
|
end
|
70
|
-
|
75
|
+
Futureshop::Inventory.each types: options[:type].collect(&:to_sym), create_date_start: options[:"create-date-start"], create_date_end: options[:"create-date-end"], product_no: options[:"product-no"], jan_code: options[:"jan-code"] do |inventory|
|
76
|
+
puts inventory.to_json
|
77
|
+
end
|
71
78
|
end
|
72
79
|
|
73
80
|
main ARGV
|
data/futureshop.gemspec
CHANGED
@@ -8,13 +8,13 @@ Gem::Specification.new do |spec|
|
|
8
8
|
|
9
9
|
spec.summary = "futureshop APIv2 client and tools"
|
10
10
|
spec.description = "futureshop APIv2 client and tools"
|
11
|
-
spec.homepage = "https://gitlab.com/KitaitiMakoto/
|
12
|
-
spec.required_ruby_version = ">=
|
11
|
+
spec.homepage = "https://gitlab.com/KitaitiMakoto/futureshop"
|
12
|
+
spec.required_ruby_version = ">= 2.7.0"
|
13
13
|
spec.license = "AGPL-3.0-or-later"
|
14
14
|
|
15
15
|
spec.metadata["homepage_uri"] = spec.homepage
|
16
16
|
spec.metadata["source_code_uri"] = spec.homepage
|
17
|
-
spec.metadata["changelog_uri"] = "https://gitlab.com/KitaitiMakoto/
|
17
|
+
spec.metadata["changelog_uri"] = "https://gitlab.com/KitaitiMakoto/futureshop/-/blob/main/CHANGELOG.md"
|
18
18
|
|
19
19
|
# Specify which files should be added to the gem when it is released.
|
20
20
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
data/lib/futureshop/client.rb
CHANGED
@@ -42,10 +42,7 @@ module Futureshop
|
|
42
42
|
}
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
46
|
-
raise "Unsupported method: #{method}" unless [:get, :post].include?(method)
|
47
|
-
query = params.empty? ? nil : build_query(params)
|
48
|
-
uri = URI::HTTPS.build(host: @api_domain, port: @port, path: path, query: query)
|
45
|
+
def request_by_uri(method, uri, data: {})
|
49
46
|
request = Net::HTTP.const_get(method.capitalize).new(uri)
|
50
47
|
headers.each_pair do |field, value|
|
51
48
|
request[field] = value
|
@@ -56,6 +53,13 @@ module Futureshop
|
|
56
53
|
JSON.parse(response.body)
|
57
54
|
end
|
58
55
|
|
56
|
+
def request(method, path = "/", params: {}, data: {})
|
57
|
+
raise "Unsupported method: #{method}" unless [:get, :post].include?(method)
|
58
|
+
query = params.empty? ? nil : build_query(params)
|
59
|
+
uri = URI::HTTPS.build(host: @api_domain, port: @port, path: path, query: query)
|
60
|
+
request_by_uri(method, uri, data: data)
|
61
|
+
end
|
62
|
+
|
59
63
|
def get(path = "/", params: {})
|
60
64
|
request(:get, path, params: params)
|
61
65
|
end
|
@@ -78,12 +82,13 @@ module Futureshop
|
|
78
82
|
res = get("/admin-api/v1/shipping", params: params)
|
79
83
|
yield res["orderList"]
|
80
84
|
|
81
|
-
|
82
|
-
while
|
85
|
+
next_url = res["nextUrl"]
|
86
|
+
while next_url
|
83
87
|
sleep INTERVAL
|
84
|
-
|
88
|
+
url = URI.parse(next_url)
|
89
|
+
res = request_by_uri(:get, url)
|
85
90
|
yield res["orderList"]
|
86
|
-
|
91
|
+
next_url = res["nextUrl"]
|
87
92
|
end
|
88
93
|
end
|
89
94
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Futureshop
|
2
|
+
class Inventory
|
3
|
+
class << self
|
4
|
+
def each_batch(types: [:regular], create_date_start: nil, create_date_end: nil, product_no: [], jan_code: [])
|
5
|
+
params = {
|
6
|
+
types: types,
|
7
|
+
product_no: product_no,
|
8
|
+
jan_code: jan_code
|
9
|
+
}
|
10
|
+
params[:create_date_start] = create_date_start.strftime("%FT%T") if create_date_start
|
11
|
+
params[:create_date_end] = create_date_end.strftime("%FT%T") if create_date_end
|
12
|
+
res = client.get("/admin-api/v1/inventory", params: params)
|
13
|
+
yield res["productList"]
|
14
|
+
|
15
|
+
next_url = res["nextUrl"]
|
16
|
+
while next_url
|
17
|
+
sleep Client::INTERVAL
|
18
|
+
url = URI.parse(next_url)
|
19
|
+
res = client.request_by_uri(:get, url)
|
20
|
+
yield res["productList"]
|
21
|
+
next_url = res["nextUrl"]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def each(**args)
|
26
|
+
return enum_for(__method__, **args) unless block_given?
|
27
|
+
|
28
|
+
each_batch **args do |inventories|
|
29
|
+
inventories.each do |inventory|
|
30
|
+
yield inventory
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def all(**args)
|
36
|
+
return each.to_a
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def client
|
42
|
+
@client ||= Futureshop::Client.new(
|
43
|
+
shop_key: ENV["FUTURESHOP_SHOP_KEY"],
|
44
|
+
client_id: ENV["FUTURESHOP_CLIENT_ID"],
|
45
|
+
client_secret: ENV["FUTURESHOP_CLIENT_SECRET"],
|
46
|
+
api_domain: ENV["FUTURESHOP_API_DOMAIN"]
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/futureshop/version.rb
CHANGED
data/lib/futureshop.rb
CHANGED
@@ -25,33 +25,40 @@ module Futureshop
|
|
25
25
|
raise "Multiple shipmentList. orderNo: #{order["orderNo"]}" if order["shipmentList"].length > 1
|
26
26
|
order["shipmentList"].each do |shipment|
|
27
27
|
shipment["productList"].each do |product|
|
28
|
-
csv << order.
|
28
|
+
csv << order.each_pair.with_object([]) {|(key, value), values|
|
29
29
|
case value
|
30
30
|
when Hash
|
31
31
|
value.each_value do |v|
|
32
32
|
values << v
|
33
33
|
end
|
34
34
|
when Array
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
v
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
35
|
+
case key
|
36
|
+
when "shipmentList"
|
37
|
+
# shipmentList's length is 1
|
38
|
+
shipment.each_value do |v|
|
39
|
+
case v
|
40
|
+
when Hash
|
41
|
+
v.each_value do |ov|
|
42
|
+
values << ov
|
43
|
+
end
|
44
|
+
when Array
|
45
|
+
product.each_pair do |k, v|
|
46
|
+
case k
|
47
|
+
when "optionPriceList"
|
48
|
+
v = v.collect {|optionPrice| "#{optionPrice['name']}:#{optionPrice['selectionName']}(#{optionPrice['price']})"}.join("/")
|
49
|
+
when "optionList"
|
50
|
+
v = v.collect {|option| [option["name"], option["selectionItem"]].join(":")}.join(",")
|
51
|
+
end
|
52
|
+
values << v
|
49
53
|
end
|
54
|
+
else
|
50
55
|
values << v
|
51
56
|
end
|
52
|
-
else
|
53
|
-
values << v
|
54
57
|
end
|
58
|
+
when "couponList"
|
59
|
+
values << value.collect {|coupon| [coupon["id"], coupon["name"]].join(":")}.join("/")
|
60
|
+
else
|
61
|
+
raise "Unknown array field: #{key}"
|
55
62
|
end
|
56
63
|
else
|
57
64
|
values << value
|
@@ -60,6 +67,8 @@ module Futureshop
|
|
60
67
|
end
|
61
68
|
end
|
62
69
|
end
|
70
|
+
else
|
71
|
+
raise RuntimeError("unsupported format: #{format}")
|
63
72
|
end
|
64
73
|
end
|
65
74
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: futureshop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kitaiti Makoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -73,14 +73,15 @@ files:
|
|
73
73
|
- futureshop.gemspec
|
74
74
|
- lib/futureshop.rb
|
75
75
|
- lib/futureshop/client.rb
|
76
|
+
- lib/futureshop/inventory.rb
|
76
77
|
- lib/futureshop/version.rb
|
77
|
-
homepage: https://gitlab.com/KitaitiMakoto/
|
78
|
+
homepage: https://gitlab.com/KitaitiMakoto/futureshop
|
78
79
|
licenses:
|
79
80
|
- AGPL-3.0-or-later
|
80
81
|
metadata:
|
81
|
-
homepage_uri: https://gitlab.com/KitaitiMakoto/
|
82
|
-
source_code_uri: https://gitlab.com/KitaitiMakoto/
|
83
|
-
changelog_uri: https://gitlab.com/KitaitiMakoto/
|
82
|
+
homepage_uri: https://gitlab.com/KitaitiMakoto/futureshop
|
83
|
+
source_code_uri: https://gitlab.com/KitaitiMakoto/futureshop
|
84
|
+
changelog_uri: https://gitlab.com/KitaitiMakoto/futureshop/-/blob/main/CHANGELOG.md
|
84
85
|
post_install_message:
|
85
86
|
rdoc_options: []
|
86
87
|
require_paths:
|
@@ -89,14 +90,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
90
|
requirements:
|
90
91
|
- - ">="
|
91
92
|
- !ruby/object:Gem::Version
|
92
|
-
version:
|
93
|
+
version: 2.7.0
|
93
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
95
|
requirements:
|
95
96
|
- - ">="
|
96
97
|
- !ruby/object:Gem::Version
|
97
98
|
version: '0'
|
98
99
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
100
|
+
rubygems_version: 3.1.6
|
100
101
|
signing_key:
|
101
102
|
specification_version: 4
|
102
103
|
summary: futureshop APIv2 client and tools
|