expressly 2.0.34.rc1 → 2.0.35.rc1

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.
data/.travis.yml CHANGED
@@ -2,3 +2,7 @@ rvm:
2
2
  - 1.9.3
3
3
  - 2.1.6
4
4
  - 2.2.2
5
+
6
+ addons:
7
+ code_climate:
8
+ repo_token: 4b7cb0837c0bcb22501262f1c463f02f189dbb510001c68e2e498db0e80f24bb
data/Gemfile CHANGED
@@ -3,10 +3,11 @@ gem 'rake'
3
3
 
4
4
  group :development do
5
5
  require 'rbconfig'
6
- #gem 'fakeweb'
6
+ gem "fakeweb", "~> 1.3"
7
7
  gem 'awesome_print', '~> 1.2.0'
8
8
  gem 'guard-rspec'
9
9
  gem 'guard'
10
10
  gem "rdoc", "~> 3.12"
11
+ gem "codeclimate-test-reporter", group: :test, require: nil
11
12
  #gem 'wdm', '>= 0.1.0' if RbConfig::CONFIG['target_os'] =~ /mswin|mingw/i
12
13
  end
data/Gemfile.lock CHANGED
@@ -4,8 +4,12 @@ GEM
4
4
  awesome_print (1.2.0)
5
5
  celluloid (0.15.2)
6
6
  timers (~> 1.1.0)
7
+ codeclimate-test-reporter (0.4.8)
8
+ simplecov (>= 0.7.1, < 1.0.0)
7
9
  coderay (1.1.0)
8
10
  diff-lcs (1.2.5)
11
+ docile (1.1.5)
12
+ fakeweb (1.3.0)
9
13
  ffi (1.9.3)
10
14
  ffi (1.9.3-x64-mingw32)
11
15
  formatador (0.2.4)
@@ -43,6 +47,11 @@ GEM
43
47
  rspec-expectations (2.14.4)
44
48
  diff-lcs (>= 1.1.3, < 2.0)
45
49
  rspec-mocks (2.14.4)
50
+ simplecov (0.11.1)
51
+ docile (~> 1.1.0)
52
+ json (~> 1.8)
53
+ simplecov-html (~> 0.10.0)
54
+ simplecov-html (0.10.0)
46
55
  slop (3.4.7)
47
56
  thor (0.18.1)
48
57
  timers (1.1.0)
@@ -54,6 +63,8 @@ PLATFORMS
54
63
  DEPENDENCIES
55
64
  awesome_print (~> 1.2.0)
56
65
  bundler
66
+ codeclimate-test-reporter
67
+ fakeweb (~> 1.3)
57
68
  guard
58
69
  guard-rspec
59
70
  rake
data/README.rdoc CHANGED
@@ -1,27 +1,35 @@
1
- {<img src="https://buyexpressly.com/assets/img/expressly-logo-sm-gray.png" alt="Expressly" />}[https://buyexpressly.com]
2
- {<img src="https://badge.fury.io/rb/expressly.svg" alt="Gem Version" />}[https://badge.fury.io/rb/expressly]
3
- {<img src="https://api.travis-ci.org/expressly/expressly-plugin-sdk-ruby-core.png" alt="Build Status" />}[https://api.travis-ci.org/expressly/expressly-plugin-sdk-ruby-core]
4
- = Expressly Plug-in Ruby SDK
5
-
6
- The Expressly Ruby SDK provides as much of the heavy-lifting of the Expressly Network API to help developers wishing to
7
- integrate their rails e-commerce platform with the {Expressly network}[https://buyexpressly.com].
8
-
9
- == Getting Started
10
-
11
- gemfile::
12
- gem 'expressly', '~> 2.0'
13
-
14
- install::
15
- gem install expressly --pre
16
-
17
- You can find a Rails reference implementation {here}[https://github.com/expressly/expressly-plugin-rails-reference-implementation]
18
- to help you get started.
19
-
20
- == More Info
21
-
22
- Further resources can be found on the {Expressly developer portal}[http://developer.buyexpressly.com].
23
-
24
- == License
25
-
26
- Copyright (c) 2015 Expressly. See LICENSE.txt for further details.
27
-
1
+ {<img src="https://buyexpressly.com/assets/img/expressly-logo-sm-gray.png" alt="Expressly" />}[https://buyexpressly.com]
2
+
3
+ = Expressly Plug-in Ruby SDK
4
+
5
+ {<img src="https://badge.fury.io/rb/expressly.svg" alt="Gem Version" />}[https://badge.fury.io/rb/expressly]
6
+ {<img src="https://api.travis-ci.org/expressly/expressly-plugin-sdk-ruby-core.png" alt="Build Status" />}[https://travis-ci.org/expressly/expressly-plugin-sdk-ruby-core]
7
+ {<img src="https://codeclimate.com/github/expressly/expressly-plugin-sdk-ruby-core/badges/gpa.svg" />}[https://codeclimate.com/github/expressly/expressly-plugin-sdk-ruby-core]
8
+ {<img src="https://codeclimate.com/github/expressly/expressly-plugin-sdk-ruby-core/coverage.png" />}[https://codeclimate.com/github/expressly/expressly-plugin-sdk-ruby-core/coverage]
9
+
10
+ The Expressly Ruby SDK provides as much of the heavy-lifting of the Expressly Network API to help developers wishing to
11
+ integrate their rails e-commerce platform with the {Expressly network}[https://buyexpressly.com].
12
+
13
+ == Getting Started
14
+
15
+ gemfile::
16
+ gem 'expressly', '~> 2.0'
17
+
18
+ install::
19
+ gem install expressly --pre
20
+
21
+ You can find a Rails reference implementation {here}[https://github.com/expressly/expressly-plugin-rails-reference-implementation]
22
+ to help you get started.
23
+
24
+ == More Info
25
+
26
+ Further resources can be found on the {Expressly developer portal}[http://developer.buyexpressly.com].
27
+
28
+ == License
29
+
30
+ Copyright (c) 2015 Expressly. See LICENSE.txt for further details.
31
+
32
+ == One-click customer acquisition
33
+
34
+ Expressly helps merchants grow by attracting new quality visitors from other online shops where people already buy,
35
+ while making it extremely convenient for them to convert to the new shop.
@@ -33,7 +33,6 @@ module Expressly
33
33
  end
34
34
 
35
35
  def display_popup
36
- campaign_customer_uuid = params[:campaign_customer_uuid]
37
36
  provider.popup_handler(self, params[:campaign_customer_uuid])
38
37
  end
39
38
 
@@ -50,7 +49,7 @@ module Expressly
50
49
 
51
50
  begin
52
51
  config.expressly_provider.confirm_migration_success?(campaign_customer_uuid)
53
- rescue Exception => e
52
+ rescue StandardError => e
54
53
  Expressly::logger.warn(self) {
55
54
  "couldn't finalise migration campaign_customer_uuid=[#{campaign_customer_uuid}], email=[#{import.primary_email}], error=[#{e.message}]"
56
55
  }
@@ -62,9 +61,9 @@ module Expressly
62
61
  end
63
62
 
64
63
  def authenticate
65
- partitionedApiKey = config.api_key.partition(':')
64
+ partitioned_api_key = config.api_key.partition(':')
66
65
  authenticate_or_request_with_http_basic('expressly') do |username, password|
67
- username == partitionedApiKey[0] && password == partitionedApiKey[2]
66
+ username == partitioned_api_key[0] && password == partitioned_api_key[2]
68
67
  end
69
68
  end
70
69
 
data/expressly.gemspec CHANGED
@@ -26,4 +26,5 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency(%q<guard-rspec>, ["~> 0"])
27
27
  s.add_development_dependency(%q<guard>, ["~> 0"])
28
28
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
29
+ s.add_development_dependency(%q<fakeweb>, ["~> 1.3"])
29
30
  end
data/lib/expressly.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'logger'
2
+ require 'base64'
2
3
 
3
4
  module Expressly
4
5
  @@logger = Logger.new(STDERR)
@@ -6,13 +7,14 @@ module Expressly
6
7
 
7
8
  def self.logger() @@logger end
8
9
  def self.logger=(logger) @@logger = logger end
9
-
10
+
11
+ @@default_configuration = nil
10
12
  def self.default_configuration()
11
13
  @@default_configuration
12
14
  end
13
15
 
14
16
  def self.default_configuration?()
15
- !@@default_configuration.nil?
17
+ @@default_configuration != nil
16
18
  end
17
19
 
18
20
  ##
@@ -46,7 +48,7 @@ module Expressly
46
48
  # * +expressly_endpoint+ - the Expressly server endpoint. Defaults to the Expressly production service.
47
49
  #
48
50
  def initialize(api_key, merchant_plugin_provider, merchant_plugin_endpoint, merchant_metadata = {}, expressly_endpoint = 'https://prod.expresslyapp.com/api')
49
- @api_key = api_key
51
+ @api_key = api_key.include?(":") ? api_key : Base64.strict_decode64(api_key)
50
52
  @merchant_plugin_provider = merchant_plugin_provider
51
53
  @merchant_plugin_endpoint = merchant_plugin_endpoint
52
54
  @expressly_endpoint = expressly_endpoint
data/lib/expressly/api.rb CHANGED
@@ -2,67 +2,67 @@ module Expressly
2
2
  class Api
3
3
 
4
4
  def initialize(apikey, endpoint = 'https://prod.expresslyapp.com/api')
5
- partitionedApiKey = apikey.partition(':')
6
- @merchantUuid = partitionedApiKey[0]
7
- @secretKey = partitionedApiKey[2]
5
+ partitioned_api_key = apikey.partition(':')
6
+ @merchant_uuid = partitioned_api_key[0]
7
+ @secret_key = partitioned_api_key[2]
8
8
  @endpoint = endpoint
9
9
  end
10
10
 
11
11
  def ping?
12
12
  response = execute('/v1/merchant/ping', 'GET')
13
- return JSON.parse(response.body)['success']
13
+ JSON.parse(response.body)['success']
14
14
  end
15
15
 
16
- def install(baseUrl)
17
- apiKey = Base64.strict_encode64("#{@merchantUuid}:#{@secretKey}")
18
- response = execute(
16
+ def install(base_url)
17
+ api_key = Base64.strict_encode64("#{@merchant_uuid}:#{@secret_key}")
18
+ execute(
19
19
  '/v2/plugin/merchant',
20
20
  'POST',
21
- "{\"apiBaseUrl\":\"#{baseUrl}\", \"apiKey\":\"#{apiKey}\"}")
21
+ "{\"apiBaseUrl\":\"#{base_url}\", \"apiKey\":\"#{api_key}\"}")
22
22
  end
23
23
 
24
24
  def uninstall?
25
25
  response = execute(
26
- "/v2/plugin/merchant/#{@merchantUuid}",
26
+ "/v2/plugin/merchant/#{@merchant_uuid}",
27
27
  'DELETE')
28
- return JSON.parse(response.body)['success']
28
+ JSON.parse(response.body)['success']
29
29
  end
30
30
 
31
31
  def fetch_migration_confirmation_html(campaign_customer_uuid)
32
32
  response = execute(
33
33
  "/v2/migration/#{campaign_customer_uuid}",
34
34
  'GET')
35
- return response.body
35
+ response.body
36
36
  end
37
37
 
38
38
  def fetch_customer_data(campaign_customer_uuid)
39
39
  response = execute(
40
40
  "/v2/migration/#{campaign_customer_uuid}/user",
41
41
  'GET')
42
- return CustomerImport.from_json(JSON.parse(response.body))
42
+ CustomerImport.from_json(JSON.parse(response.body))
43
43
  end
44
44
 
45
45
  def confirm_migration_success?(campaign_customer_uuid)
46
46
  response = execute(
47
47
  "/v2/migration/#{campaign_customer_uuid}/success",
48
48
  'POST')
49
- return JSON.parse(response.body)['success']
49
+ JSON.parse(response.body)['success']
50
50
  end
51
51
 
52
- def execute(methodUri, httpVerb, body = nil)
53
- uri = URI.parse("#{@endpoint}#{methodUri}")
52
+ def execute(method_uri, http_verb, body = nil)
53
+ uri = URI.parse("#{@endpoint}#{method_uri}")
54
54
  http = Net::HTTP.new(uri.host, uri.port)
55
55
  http.use_ssl = @endpoint.start_with?('https')
56
56
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
57
57
 
58
58
  request =
59
- if httpVerb == 'GET' then Net::HTTP::Get.new(uri.request_uri)
60
- elsif httpVerb == 'POST' then Net::HTTP::Post.new(uri.request_uri)
61
- elsif httpVerb == 'DELETE' then Net::HTTP::Delete.new(uri.request_uri)
62
- else raise "unexpected http verb [#{httpVerb}]"
59
+ if http_verb == 'GET' then Net::HTTP::Get.new(uri.request_uri)
60
+ elsif http_verb == 'POST' then Net::HTTP::Post.new(uri.request_uri)
61
+ elsif http_verb == 'DELETE' then Net::HTTP::Delete.new(uri.request_uri)
62
+ else raise "unexpected http verb [#{http_verb}]"
63
63
  end
64
64
 
65
- request.basic_auth(@merchantUuid, @secretKey)
65
+ request.basic_auth(@merchant_uuid, @secret_key)
66
66
  if body != nil then
67
67
  request["Content-Type"] = 'application/json'
68
68
  request.body = body
@@ -74,16 +74,14 @@ module Expressly
74
74
  handle_error(response)
75
75
  end
76
76
 
77
- return response
77
+ response
78
78
  end
79
79
 
80
80
  def handle_error(response)
81
81
  is_json = response.content_type == "application/json"
82
82
  body = is_json ? JSON.parse(response.body) : response.body
83
83
 
84
- raise (if is_json && !body['id'].nil? then
85
- ExpresslyError.new(body) else
86
- HttpError.new(response) end)
84
+ raise (if is_json && !body['id'].nil? then ExpresslyError.new(body) else HttpError.new(response) end)
87
85
  end
88
86
 
89
87
  private :execute, :handle_error
@@ -31,7 +31,7 @@ module Expressly
31
31
  ObjectHelper.equals(self,object)
32
32
  end
33
33
 
34
- def to_json(state = nil)
34
+ def to_json(_state = nil)
35
35
  JSON.generate({
36
36
  :meta => @metadata,
37
37
  :data => {
@@ -126,7 +126,7 @@ module Expressly
126
126
  datetime.nil? ? nil : DateTime.parse(datetime)
127
127
  end
128
128
 
129
- def to_json(state = nil)
129
+ def to_json(_state = nil)
130
130
  JSON.generate({
131
131
  :firstName => @first_name,
132
132
  :lastName => @last_name,
@@ -194,7 +194,7 @@ module Expressly
194
194
  return list
195
195
  end
196
196
 
197
- def to_json(state = nil)
197
+ def to_json(_state = nil)
198
198
  JSON.generate({
199
199
  :firstName => @first_name,
200
200
  :lastName => @last_name,
@@ -253,7 +253,7 @@ module Expressly
253
253
  return list
254
254
  end
255
255
 
256
- def to_json(state = nil)
256
+ def to_json(_state = nil)
257
257
  JSON.generate({
258
258
  :type => @type.to_s,
259
259
  :number => @number,
@@ -298,7 +298,7 @@ module Expressly
298
298
  return list
299
299
  end
300
300
 
301
- def to_json(state = nil)
301
+ def to_json(_state = nil)
302
302
  JSON.generate({
303
303
  :email => @email,
304
304
  :alias => @alias
@@ -339,7 +339,7 @@ module Expressly
339
339
  return list
340
340
  end
341
341
 
342
- def to_json(state = nil)
342
+ def to_json(_state = nil)
343
343
  JSON.generate({
344
344
  :field => @type.to_s,
345
345
  :value => @identity
@@ -432,7 +432,7 @@ module Expressly
432
432
  @tax += order.tax.to_f
433
433
  end
434
434
 
435
- def to_json(state = nil)
435
+ def to_json(_state = nil)
436
436
  JSON.generate(json_attribute_map)
437
437
  end
438
438
 
@@ -464,7 +464,7 @@ module Expressly
464
464
  @order_date = if order_date.is_a? Date then order_date else Date.parse(order_date) end
465
465
  end
466
466
 
467
- def to_json(state = nil)
467
+ def to_json(_state = nil)
468
468
  JSON.generate({
469
469
  :id => @order_id,
470
470
  :date => @order_date,
@@ -66,12 +66,11 @@ module Expressly
66
66
 
67
67
  end
68
68
 
69
- protected
69
+
70
70
  def Enumeration.add_item(key,value)
71
71
  @hash ||= {}
72
72
  @hash[key]=value
73
73
  end
74
-
75
74
  end
76
75
 
77
76
  module AbstractInterface
@@ -2,7 +2,7 @@ module Expressly
2
2
  module Version
3
3
  MAJOR = 2
4
4
  MINOR = 0
5
- PATCH = 34
5
+ PATCH = 35
6
6
  BUILD = 'rc1'
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
@@ -0,0 +1,117 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ module Expressly
4
+ merchant_uuid = '61c8c55e-9365-11e5-ac6c-281878baaac8'
5
+ campaign_customer_uuid = '140d190c-b73c-4e59-aa01-c838c4ddde9d'
6
+ api_key = '61c8c55e-9365-11e5-ac6c-281878baaac8:d62e517165bf86562d7fe0dbf8ac2076'
7
+ api_url = 'http://localhost:8080/api'
8
+ api = Expressly::Api.new(api_key, api_url)
9
+ #FakeWeb.allow_net_connect = false
10
+
11
+ describe "Api" do
12
+
13
+ it "can ping" do
14
+ FakeWeb.register_uri(:get, "http://#{api_key}@localhost:8080/api/v1/merchant/ping",
15
+ :body => '{"success":true,"msg":"61c8c55e-9365-11e5-ac6c-281878baaac8"}')
16
+ api.ping?.should == true
17
+ end
18
+
19
+ it "it can install" do
20
+ FakeWeb.register_uri(:post, "http://#{api_key}@localhost:8080/api/v2/plugin/merchant",
21
+ :status => ["204", "No Content"])
22
+ api.install("http://localhost:3000")
23
+ end
24
+
25
+ it "it can uninstall" do
26
+ FakeWeb.register_uri(:delete, "http://#{api_key}@localhost:8080/api/v2/plugin/merchant/#{merchant_uuid}",
27
+ :body => '{"success":true,"msg":"Merchant uninstalled"}')
28
+ api.uninstall?.should == true
29
+ end
30
+
31
+ it "it can fetch poup html" do
32
+ FakeWeb.register_uri(:get, "http://#{api_key}@localhost:8080/api/v2/migration/#{campaign_customer_uuid}",
33
+ :body => '<b>pop</b>')
34
+ response = api.fetch_migration_confirmation_html(campaign_customer_uuid)
35
+ response.should == '<b>pop</b>'
36
+ end
37
+
38
+ it "it can fetch customer data" do
39
+ FakeWeb.register_uri(:get, "http://#{api_key}@localhost:8080/api/v2/migration/#{campaign_customer_uuid}/user",
40
+ :body => '{ "migration":{"meta":{"sender":"2"},"data":{"email":"m@9ls.com","customerData":' +
41
+ '{"firstName":"Marc","lastName":"Smith","gender":"M","billingAddress":0,"shippingAddress":0,' +
42
+ '"dateUpdated":"2015-11-25T13:21:04.000Z","numberOrdered":0,' +
43
+ '"onlinePresence":[{"field":"twitter","value":"mgsmith57"}],"emails":[{"email":"someone@test.com"}],' +
44
+ '"phones":[{"type":"L","number":"020 7946 0975","countryCode":44}],' +
45
+ '"addresses":[{"firstName":"Marc","lastName":"SMith","address1":"61 Wellfield Road","city":"Roath","zip":"CF24 3DG","phone":0,"stateProvince":"Cardiff","country":"GB"}]}}},' +
46
+ '"cart":{"couponCode":"coupon","productId":"product"}}')
47
+ customer_import = api.fetch_customer_data(campaign_customer_uuid)
48
+ customer_import.metadata.should == {"sender" => "2"}
49
+ customer_import.cart.coupon_code.should == 'coupon'
50
+ customer_import.cart.product_id.should == 'product'
51
+ customer_import.primary_email.should == 'm@9ls.com'
52
+ customer_import.customer.first_name.should == 'Marc'
53
+ customer_import.customer.last_name.should == 'Smith'
54
+ customer_import.customer.gender.should == Gender::Male
55
+ customer_import.customer.billing_address_index.should == 0
56
+ customer_import.customer.shipping_address_index.should == 0
57
+ customer_import.customer.last_updated.should == DateTime.parse('2015-11-25T13:21:04+00:00')
58
+ customer_import.customer.online_identity_list[0].type.should == OnlineIdentityType::Twitter
59
+ customer_import.customer.online_identity_list[0].identity.should == 'mgsmith57'
60
+ customer_import.customer.email_list[0].email.should == 'someone@test.com'
61
+ customer_import.customer.phone_list[0].number.should == '020 7946 0975'
62
+ customer_import.customer.phone_list[0].type.should == PhoneType::Landline
63
+ customer_import.customer.phone_list[0].country_code.should == 44
64
+ customer_import.customer.address_list[0].first_name.should == 'Marc'
65
+ customer_import.customer.address_list[0].last_name.should == 'SMith'
66
+ customer_import.customer.address_list[0].address_1.should == '61 Wellfield Road'
67
+ customer_import.customer.address_list[0].city.should == 'Roath'
68
+ customer_import.customer.address_list[0].zip.should == 'CF24 3DG'
69
+ customer_import.customer.address_list[0].phone_index.should == 0
70
+ customer_import.customer.address_list[0].state_province.should == 'Cardiff'
71
+ customer_import.customer.address_list[0].country.should == 'GB'
72
+ end
73
+
74
+ it "it can report the migration was successful" do
75
+ FakeWeb.register_uri(:post, "http://#{api_key}@localhost:8080/api/v2/migration/#{campaign_customer_uuid}/success",
76
+ :body => '{"success":true,"msg":"User registered as migrated"}')
77
+ response = api.confirm_migration_success?(campaign_customer_uuid)
78
+ response.should == true
79
+ end
80
+
81
+ it "it can parse the expressly error payload" do
82
+ FakeWeb.register_uri(:get, "http://#{api_key}@localhost:8080/api/v1/merchant/ping",
83
+ :status => ["400", "Bad Request"],
84
+ :content_type => "application/json",
85
+ :body => '{' +
86
+ '"id":"tid",' +
87
+ '"message":"Bad Request",' +
88
+ '"code":"USER_ALREADY_MIGRATED",' +
89
+ '"description":"ON NO",' +
90
+ '"causes":["cause"],' +
91
+ '"actions":["action"]}')
92
+ begin
93
+ api.ping?
94
+ rescue ExpresslyError => e
95
+ e.id.should == 'tid'
96
+ e.message.should == 'Bad Request'
97
+ e.code.should == 'USER_ALREADY_MIGRATED'
98
+ e.description.should == 'ON NO'
99
+ e.causes[0].should == 'cause'
100
+ e.actions[0].should == 'action'
101
+ end
102
+ end
103
+
104
+ it "if it can parse the expressly error payload it will throw an http error" do
105
+ FakeWeb.register_uri(:get, "http://#{api_key}@localhost:8080/api/v1/merchant/ping",
106
+ :status => ["400", "Bad Request"],
107
+ :body => 'WOW')
108
+ begin
109
+ api.ping?
110
+ rescue HttpError => e
111
+ e.code.should == "400"
112
+ e.body.should == 'WOW'
113
+ end
114
+ end
115
+ end
116
+ end
117
+