futureshop 0.1.1 → 0.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e7656d0cc9f40144256020b14e6f45bf161851ec1b3487901662efb8c741f869
4
- data.tar.gz: f3b18e8fd1bb8ad58c10c42216ff219123fde61e869827ed31876ecc1b9ebdfb
3
+ metadata.gz: de1dda6ccfb095050e2c4555103dcf79fbc9bb816230671a43d03ebd2ab8ce7b
4
+ data.tar.gz: 8f9c5ce46b616c378f131a769709256d3e02753179966495f1b6da797da7cdf8
5
5
  SHA512:
6
- metadata.gz: 77627e2b9030c438e1b4891a1957129bbd9ab027fcebf97b85e041f52fd19602711a2a85f58555ea7e93cb7ff8d3016672db7a5dcf254fef92bcd6e1d45808ae
7
- data.tar.gz: bf8ec9076b7ed937d41e0ee67823f47f2100008d209f51a47ff78eb76ae13a33f65d54169ead5f9e854a6eab54112be746645d731138a5b0eb68364d298b1f90
6
+ metadata.gz: c16675ddac87f365e25bd71661900a81731b1b390112e58c98e0d31cb7a0afcd7f824bb98b5cc92bed40c109a36a735d464f5c2acc6ddd78e378ed09afd2e692
7
+ data.tar.gz: 93b8ae4040cfa6f496871a4aa84c815a94da50f24a99a4b44f974efa06bcf1b7f0289256ac7b282841e23e380ec5732c174b49a2c99ed778f6535b43d81ecac9
data/.gitlab-ci.yml CHANGED
@@ -4,6 +4,6 @@ before_script:
4
4
  - gem install bundler -v 2.2.21
5
5
  - bundle install
6
6
 
7
- example_job:
7
+ test:
8
8
  script:
9
9
  - bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.5] - 2021-10-21
4
+
5
+ - Add `Futureshop::Inventory` class
6
+ - Add `inventories` subcommand
7
+
8
+ ## [0.1.4] - 2021-10-11
9
+
10
+ - Handle order's couponList field, which was introduced on 2021-09-29
11
+
12
+ ## [0.1.3] - 2021-08-25
13
+
14
+ - Fix option passing
15
+ - Fix handling of nextUrl
16
+
17
+ ## [0.1.2] - 2021-08-06
18
+
19
+ - Fix command-line option name
20
+
3
21
  ## [0.1.1] - 2021-08-05
4
22
 
5
23
  - Fix CSV conversion for optionPriceList and optionList
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
 
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
 
@@ -40,34 +42,33 @@ def orders(global_options, argv)
40
42
  opt.on "--order-date-start=DATE", Time
41
43
  opt.on "--order-date-end=DATE", Time
42
44
  })
43
- Futureshop.orders(**options)
45
+ Futureshop.orders(order_date_start: options[:"order-date-start"], order_date_end: options[:"order-date-end"], format: options[:format])
44
46
  end
45
47
 
46
- def client
47
- Futureshop::Client.new(
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
48
+ def inventories(global_options, argv)
49
+ require "futureshop/inventory"
54
50
 
55
- def aggregate_headers(obj, headers = [])
56
- obj.each_pair do |key, value|
57
- unless %w[buyerInfo addressInfo shippingInfo shipmentList productList].include? key
58
- headers << key
59
- end
60
- case value
61
- when Hash
62
- headers.concat aggregate_headers(value).collect {|header| "#{key}.#{header}"}
63
- when Array
64
- sample = value[0]
65
- if sample
66
- headers.concat aggregate_headers(sample).collect {|header| "#{key}.#{header}"}
67
- end
51
+ options = {
52
+ type: ["regular"],
53
+ product_no: [],
54
+ jan_code: []
55
+ }
56
+ options = options.update(parse_options(argv) {|opt|
57
+ opt.on "--type=TYPE", Array
58
+ opt.on "--create-date-start=DATE", Time
59
+ opt.on "--create-date-end=DATE", Time
60
+ opt.on "--product-no=NUMBER", Array
61
+ opt.on "--jan-code=CODE", Array
62
+ })
63
+ if options[:type]
64
+ unknown_types = options[:type].select {|type| ! %w[regular preorder planned realstore].include?(type)}
65
+ unless unknown_types.empty?
66
+ raise "Unknown type(s): #{unknown_types.join(', ')}"
68
67
  end
69
68
  end
70
- headers
69
+ 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|
70
+ puts inventory.to_json
71
+ end
71
72
  end
72
73
 
73
74
  main ARGV
@@ -42,10 +42,7 @@ module Futureshop
42
42
  }
43
43
  end
44
44
 
45
- def request(method, path = "/", params: {}, data: {})
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
- nextUrl = res["nextUrl"]
82
- while nextUrl
85
+ next_url = res["nextUrl"]
86
+ while next_url
83
87
  sleep INTERVAL
84
- res = get(nextUrl, params: params) # TODO: check spec to see whether it's okay to pass params in this form
88
+ url = URI.parse(next_url)
89
+ res = request_by_uri(:get, url)
85
90
  yield res["orderList"]
86
- nextUrl = res["nextUrl"]
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
@@ -1,3 +1,3 @@
1
1
  module Futureshop
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.5"
3
3
  end
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.each_value.with_object([]) {|value, values|
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
- # only shipmentList is an Array and its length is 0
36
- shipment.each_value do |v|
37
- case v
38
- when Hash
39
- v.each_value do |ov|
40
- values << ov
41
- end
42
- when Array
43
- product.each_pair do |k, v|
44
- case k
45
- when "optionPriceList"
46
- v = v.collect {|optionPrice| "#{optionPrice['name']}:#{optionPrice['selectionName']}(#{optionPrice['price']})"}.join("/")
47
- when "optionList"
48
- v = v.collect {|option| [option["name"], option["selectionItem"]].join(":")}.join(",")
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.1
4
+ version: 0.1.5
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-08-05 00:00:00.000000000 Z
11
+ date: 2021-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -73,6 +73,7 @@ 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
78
  homepage: https://gitlab.com/KitaitiMakoto/futuresohp
78
79
  licenses: