dech 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db8a51d0bc99784877dd3a64ecd77bbf791dfe90
4
- data.tar.gz: d49ce44554b96aadbac97896b7823b09c2178b97
3
+ metadata.gz: a298dba8dc5995a1a411bb5c7f51a46cf9e97a61
4
+ data.tar.gz: d1c7288d35568fc22f1b91f58cf435c8daa00288
5
5
  SHA512:
6
- metadata.gz: c41234c2d6c9396580925ab3dbc18b2190b10af298e84315290fc47fe055549450376633fb2a21cad764b3eba3f6f94cb850f2bad3cf12925bf492f96c372f39
7
- data.tar.gz: ba3b53b0e18b8beffc71e0bea37ff2c9e96c533fa23c06d528904d423f21f029c1b9317b107107b89eced51c5b8e79d1bb5243c69c7ba6992f8c24487ecf6b9c
6
+ metadata.gz: fe95dfc6dc917b601e92a453ad8d4a414733702d08ce18df8698ab8b93cf81bdc9fbc83e2075af8ad9348560571d7be20c0e29b0bde0f00ea5472ab58645f0c6
7
+ data.tar.gz: 10aece1245ad3cf0eba3a0e29ddc2bed670a3e70b25ab33445b2ab1bba92b1b2e314430115fe9ce82ed1f733426c5e8fbe10ad665560cb392f44d2bb500723b1
@@ -4,6 +4,7 @@ require "dech/hash_key_mapper"
4
4
  require "dech/version"
5
5
 
6
6
  require "dech/dena"
7
+ require "dech/ponpare"
7
8
  require "dech/rakuten"
8
9
  require "dech/yahoo"
9
10
 
@@ -0,0 +1,7 @@
1
+ # coding: utf-8
2
+ require "dech/ponpare/ftps"
3
+
4
+ module Dech
5
+ class Ponpare
6
+ end
7
+ end
@@ -0,0 +1,57 @@
1
+ # coding: utf-8
2
+ require 'emmental'
3
+ require 'dech/csv'
4
+ require 'dech/hash_key_mapper'
5
+
6
+ module Dech
7
+ class Ponpare
8
+ class CSV < Dech::CSV
9
+ ENCODING = Encoding::Windows_31J
10
+
11
+ HEADER_MAPPINGS = {
12
+ id: "商品管理ID(商品URL)",
13
+ price: "販売価格"
14
+ }
15
+
16
+ REQUIRED_HEADERS = [
17
+ "コントロールカラム",
18
+ "商品管理ID(商品URL)"
19
+ ]
20
+
21
+ STATIC_COLUMNS = {"コントロールカラム" => "u"}
22
+
23
+ def initialize(products)
24
+ @products = products
25
+ super(formatted_products)
26
+ end
27
+
28
+ def valid?
29
+ validate! rescue false
30
+ end
31
+
32
+ def validate!
33
+ translated_products.each do |product|
34
+ REQUIRED_HEADERS.each do |header|
35
+ raise "#{header} is missing in #{product}" unless product.keys.include?(header)
36
+ end
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def formatted_products
43
+ emmental = Emmental.new
44
+ translated_products.each{|product| emmental << product }
45
+ emmental.to_a
46
+ end
47
+
48
+ def translated_products
49
+ merged_products.map{|product| Dech::HashKeyMapper.map(product, HEADER_MAPPINGS) }
50
+ end
51
+
52
+ def merged_products
53
+ @products.map{|product| STATIC_COLUMNS.merge(product) }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,53 @@
1
+ # coding: utf-8
2
+ require 'net/ftp'
3
+ require 'dech/ponpare/csv'
4
+
5
+ module Dech
6
+ class Ponpare
7
+ class FTPS
8
+ DEFAULT_HOST = "ftps.ponparemall.com"
9
+ DEFAULT_PATH = "/item.csv"
10
+
11
+ attr_accessor :products, :username, :host, :path
12
+
13
+ def initialize(args={})
14
+ @products = args[:products] || []
15
+ @username = args[:username]
16
+ @password = args[:password]
17
+ @host = args[:host] || DEFAULT_HOST
18
+ @path = args[:path] || DEFAULT_PATH
19
+ end
20
+
21
+ def csv
22
+ Dech::Ponpare::CSV.new(@products)
23
+ end
24
+
25
+ def ready?
26
+ ftps_connection{|ftps| !ftps.nlst(File.dirname(@path)).include?(@path) }
27
+ end
28
+
29
+ def upload!
30
+ ftps_connection{|ftps| ftps.storlines("STOR #{@path}", csv) }
31
+ true
32
+ end
33
+
34
+ def upload
35
+ ready? && upload!
36
+ end
37
+
38
+ private
39
+
40
+ def ftps_connection(&block)
41
+ ftps = DoubleBagFTPS.new
42
+ ftps.passive = true
43
+ ftps.ssl_context = DoubleBagFTPS.create_ssl_context(verify_mode: OpenSSL::SSL::VERIFY_NONE)
44
+ ftps.connect(@host)
45
+ ftps.login(@username, @password)
46
+
47
+ yield(ftps)
48
+ ensure
49
+ ftps.close
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  # coding: utf-8
2
2
 
3
3
  module Dech
4
- VERSION = "0.0.6"
4
+ VERSION = "0.0.7"
5
5
  end
@@ -0,0 +1,60 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Dech::Ponpare::CSV do
5
+ describe "initialize" do
6
+ products = [
7
+ {id: "ABC-001", price: 12800},
8
+ {id: "xyz-123", price: 9800}
9
+ ]
10
+
11
+ subject{ Dech::Ponpare::CSV.new(products) }
12
+ it { is_expected.to be_an_instance_of(Dech::Ponpare::CSV) }
13
+ it { is_expected.to be_a(Dech::CSV) }
14
+ it { is_expected.to be_a(StringIO) }
15
+ end
16
+
17
+ describe "#valid?" do
18
+ context "with valid columns" do
19
+ products = [
20
+ {id: "ABC-001", price: 12800},
21
+ {id: "xyz-123", price: 9800}
22
+ ]
23
+
24
+ subject{ Dech::Ponpare::CSV.new(products) }
25
+ it { is_expected.to be_valid }
26
+ end
27
+
28
+ context "with invalid columns" do
29
+ products = [
30
+ {price: 12800},
31
+ {price: 9800}
32
+ ]
33
+
34
+ subject{ Dech::Ponpare::CSV.new(products) }
35
+ it { is_expected.not_to be_valid }
36
+ end
37
+ end
38
+
39
+ describe "#validate!" do
40
+ context "valid columns" do
41
+ products = [
42
+ {id: "ABC-001", price: 12800},
43
+ {id: "xyz-123", price: 9800}
44
+ ]
45
+
46
+ subject{ lambda{ Dech::Ponpare::CSV.new(products).validate! } }
47
+ it { is_expected.not_to raise_error }
48
+ end
49
+
50
+ context "invalid columns" do
51
+ products = [
52
+ {price: 12800},
53
+ {price: 9800}
54
+ ]
55
+
56
+ subject{ lambda{ Dech::Ponpare::CSV.new(products).validate! } }
57
+ it { is_expected.to raise_error }
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,78 @@
1
+ # coding: utf-8
2
+
3
+ require "spec_helper"
4
+
5
+ describe Dech::Ponpare::FTPS do
6
+ let(:ftp) {
7
+ described_class.new(
8
+ products: [{id: "PRODUCT-CODE", price: 9800}],
9
+ username: "username",
10
+ password: "password",
11
+ host: "example.com"
12
+ )
13
+ }
14
+
15
+ let(:ftps) {
16
+ ftps = double("ftps")
17
+ allow(ftps).to receive(:passive=)
18
+ allow(ftps).to receive(:ssl_context=)
19
+ allow(ftps).to receive(:connect)
20
+ allow(ftps).to receive(:login)
21
+ allow(ftps).to receive(:close)
22
+ expect(DoubleBagFTPS).to receive(:new).and_return(ftps)
23
+ ftps
24
+ }
25
+
26
+ describe "initialize" do
27
+ subject { ftp }
28
+ it { is_expected.to be_an_instance_of(described_class) }
29
+ end
30
+
31
+ describe "#csv" do
32
+ subject { ftp.csv }
33
+ it { is_expected.to be_an_instance_of(Dech::Ponpare::CSV) }
34
+ end
35
+
36
+ describe "#ready?" do
37
+ subject { ftp.ready? }
38
+
39
+ context "CSV file exists in FTPS server" do
40
+ before { expect(ftps).to receive(:nlst).and_return([ftp.path]) }
41
+ it { is_expected.to be false }
42
+ end
43
+
44
+ context "CSV file does not exist in FTPS server" do
45
+ before { expect(ftps).to receive(:nlst).and_return([]) }
46
+ it { is_expected.to be true }
47
+ end
48
+ end
49
+
50
+ describe "#upload!" do
51
+ subject{ lambda{ ftp.upload! } }
52
+
53
+ it "should upload CSV file to the path on FTPS server" do
54
+ expect(ftps).to receive(:storlines)
55
+ subject.call
56
+ end
57
+ end
58
+
59
+ describe "#upload" do
60
+ subject{ lambda{ ftp.upload } }
61
+
62
+ context "FTPS server is ready" do
63
+ it "should call #upload!" do
64
+ expect(ftp).to receive(:ready?).and_return(true)
65
+ expect(ftp).to receive(:upload!).and_return(true)
66
+ subject.call
67
+ end
68
+ end
69
+
70
+ context "FTPS server is not ready" do
71
+ it "should not call #upload!" do
72
+ expect(ftp).to receive(:ready?).and_return(false)
73
+ expect(ftp).not_to receive(:upload!)
74
+ subject.call
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,5 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+
4
+ describe Dech::Ponpare do
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dech
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - OSA Shunsuke
@@ -117,6 +117,9 @@ files:
117
117
  - lib/dech/dena/csv.rb
118
118
  - lib/dech/dena/ftp.rb
119
119
  - lib/dech/hash_key_mapper.rb
120
+ - lib/dech/ponpare.rb
121
+ - lib/dech/ponpare/csv.rb
122
+ - lib/dech/ponpare/ftps.rb
120
123
  - lib/dech/price_uploader.rb
121
124
  - lib/dech/price_uploader/dena.rb
122
125
  - lib/dech/price_uploader/dena/ftp.rb
@@ -135,6 +138,9 @@ files:
135
138
  - spec/dech/dena/ftp_spec.rb
136
139
  - spec/dech/dena_spec.rb
137
140
  - spec/dech/hash_key_mapper_spec.rb
141
+ - spec/dech/ponpare/csv_spec.rb
142
+ - spec/dech/ponpare/ftps_spec.rb
143
+ - spec/dech/ponpare_spec.rb
138
144
  - spec/dech/price_uploader/dena/ftp_spec.rb
139
145
  - spec/dech/price_uploader/ponpare/ftps_spec.rb
140
146
  - spec/dech/rakuten/csv_spec.rb
@@ -176,6 +182,9 @@ test_files:
176
182
  - spec/dech/dena/ftp_spec.rb
177
183
  - spec/dech/dena_spec.rb
178
184
  - spec/dech/hash_key_mapper_spec.rb
185
+ - spec/dech/ponpare/csv_spec.rb
186
+ - spec/dech/ponpare/ftps_spec.rb
187
+ - spec/dech/ponpare_spec.rb
179
188
  - spec/dech/price_uploader/dena/ftp_spec.rb
180
189
  - spec/dech/price_uploader/ponpare/ftps_spec.rb
181
190
  - spec/dech/rakuten/csv_spec.rb