your_membership 1.1.5 → 1.1.6

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
  SHA256:
3
- metadata.gz: 7cf7ce568f97cc07ebbd93245692f48882bbb6262475d67efc526f94056c28ca
4
- data.tar.gz: be41c68cf27208e5e88a86966160b8aee5a53f14514d69e602eb280f9f87c6e3
3
+ metadata.gz: 0414125b59ee2d25c40031650648bc7c0b7cafe877f40df5509a49ea0b05f7d9
4
+ data.tar.gz: f72d79722d4dae7e6b1d93e2301a076ebba515ad7c2e50cc454fff04d22305a0
5
5
  SHA512:
6
- metadata.gz: bc4d496cc508adbe61890f56de6d3ff80c21286befa6f1cd8c9370ed9d5267211e09ffa0f0ac1a1e0e07271bfedeafb5b674093e305e0f289230beafebff911a
7
- data.tar.gz: ed4087bf859628bc964745afdd8582113c0c8576a56a272398fbfc5da34ec9030a75a0d4b32032ec8f67b66bebd1cfea36994a8afbcab27aa3ffb6667e97812f
6
+ metadata.gz: b7b76af5088d8cf1d24f09f041252efff15453112c1ef60559a53a570c67591c2bd4501fbc238570ca1ae9b2e7ee1aeff53c1fe207ea5fbde3ad0c285221b52a
7
+ data.tar.gz: 58ca1793293a33e92625f237c9480b72ce901d09863fa0dc43f82433a1a240dce653e9520f13138ea8682a23c4c9690ceb3d9d681b653bb7a935689824230915
data/CHANGELOG.md CHANGED
@@ -4,6 +4,10 @@ This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.1.6] - 2021-02-17
8
+ ### Added
9
+ - Allow httparty v0.18.x
10
+
7
11
  ## [1.1.5] - 2018-03-21
8
12
  ### Added
9
13
  - Allow httparty v0.16.x
@@ -0,0 +1,29 @@
1
+ require 'httparty/parser'
2
+
3
+ module HTTParty
4
+ # Bug Fix for HTML encoded < and > in XML body. In order to parse the HTML
5
+ # encoded documents returned by the YourMembership API we need to HTML decode
6
+ # the <![CDATA[ tags.
7
+ #
8
+ # @api private
9
+ class YMXMLParser < HTTParty::Parser
10
+ # @api private
11
+ # @override
12
+ def body
13
+ decode(@body)
14
+ end
15
+
16
+ private
17
+
18
+ # @api private
19
+ def decode(body)
20
+ # <![CDATA[ = &lt;![CDATA[
21
+ # ]]> = ]]&gt;
22
+ if !body.nil? && body.include?('&lt;![CDATA[')
23
+ body.gsub! '&lt;![CDATA[', '<![CDATA['
24
+ body.gsub! ']]&gt;', ']]>'
25
+ end
26
+ body
27
+ end
28
+ end
29
+ end
@@ -2,8 +2,6 @@ require "httparty"
2
2
  require "nokogiri"
3
3
  require "yaml"
4
4
 
5
- require "httparty/patch"
6
-
7
5
  require "your_membership/error"
8
6
  require "your_membership/config"
9
7
  require "your_membership/base"
@@ -1,3 +1,5 @@
1
+ require 'httparty/ym_xml_parser'
2
+
1
3
  module YourMembership
2
4
  # Base Class inherited by all Your Membership SDK Classes.
3
5
  class Base
@@ -22,6 +24,15 @@ module YourMembership
22
24
  end
23
25
  # rubocop:enable Style/ClassVars
24
26
 
27
+ # Fix bad XML from YM API by using custom parser.
28
+ # @api private
29
+ # @override HTTParty::ClassMethods#post
30
+ # @return [HTTParty::Response]
31
+ def self.post(path, options = {}, &block)
32
+ opt = options.merge(parser: ::HTTParty::YMXMLParser)
33
+ super(path, opt, &block)
34
+ end
35
+
25
36
  # A Guard Method that returns true if the response from the API can be processed and raises an exception if not.
26
37
  # @param [Hash] response
27
38
  # @return [Boolean] true if no errors found.
@@ -1,3 +1,3 @@
1
1
  module YourMembership
2
- VERSION = "1.1.5"
2
+ VERSION = "1.1.6"
3
3
  end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ module HTTParty
4
+ RSpec.describe YMXMLParser do
5
+ it 'decodes HTML entities, eg. less-than, greater-than signs' do
6
+ body = <<~XML
7
+ <?xml version="1.0" encoding="utf-8" ?>
8
+ <YourMembership_Response>
9
+ <ErrCode>0</ErrCode>
10
+ <ExtendedErrorInfo>&lt;![CDATA[Text information here]]&gt;</ExtendedErrorInfo>
11
+ <Sa.Members.All.GetIDs>
12
+ <ServerGmtBias>-5</ServerGmtBias>
13
+ <ServerTime>2015-12-16 15:54:12</ServerTime>
14
+ <Members>
15
+ <ID>57EEB598-CB44-4D85-B0D6-377F393AF5B4</ID>
16
+ <ID>1C0CE647-FAA5-4EB0-ADF0-5B669B36378E</ID>
17
+ </Members>
18
+ </Sa.Members.All.GetIDs>
19
+ </YourMembership_Response>
20
+ XML
21
+ parser = described_class.new(body, :xml)
22
+ parsed = parser.parse
23
+ expect(parsed).to be_a(Hash)
24
+ ymr = parsed['YourMembership_Response']
25
+ expect(ymr['ErrCode']).to eq('0')
26
+ expect(ymr['ExtendedErrorInfo']).to eq('Text information here')
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ module YourMembership
4
+ RSpec.describe Base do
5
+ describe '.post' do
6
+ it 'uses YMXMLParser' do
7
+ mock_parser = instance_double(
8
+ ::HTTParty::YMXMLParser,
9
+ parse: { 'YourMembership_Response' => { 'ErrCode' => 999 } }
10
+ )
11
+ allow(::HTTParty::YMXMLParser).to receive(:new).and_return(mock_parser)
12
+ # It doesn't matter which cassette we use for this test.
13
+ VCR.use_cassette 'sa_members_all_getids_timestamp_single' do
14
+ response = described_class.post('/')
15
+ expect(response).to be_an(::HTTParty::Response)
16
+ expect(response['YourMembership_Response']).to eq('ErrCode' => 999)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -77,6 +77,7 @@ describe YourMembership::Profile do
77
77
  }
78
78
  }
79
79
  end
80
+
80
81
  it "accepts and sets required parameters for new profiles" do
81
82
  profile = YourMembership::Profile.create_new('afirstname', 'alastname', 'amembertypecode', 'aemail', 'ausername', 'apassword', {})
82
83
  profile.data['FirstName'].should == 'afirstname'
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'dotenv'
2
- require 'pry'
2
+ require 'byebug'
3
3
  require 'vcr'
4
4
  require 'your_membership'
5
5
  require 'webmock/rspec'
@@ -21,12 +21,12 @@ Gem::Specification.new do |spec|
21
21
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_dependency "httparty", ">=0.13.1", "<0.17"
24
+ spec.add_dependency "httparty", ">=0.13.1", "<0.19"
25
25
  spec.add_dependency "nokogiri", "~>1.6"
26
26
 
27
- spec.add_development_dependency "bundler", "~> 1.6"
27
+ spec.add_development_dependency "bundler", "<3"
28
+ spec.add_development_dependency "byebug"
28
29
  spec.add_development_dependency "dotenv"
29
- spec.add_development_dependency "pry"
30
30
  spec.add_development_dependency "rake"
31
31
  spec.add_development_dependency "rspec"
32
32
  spec.add_development_dependency "vcr"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: your_membership
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.5
4
+ version: 1.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nate Flood
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-21 00:00:00.000000000 Z
11
+ date: 2021-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 0.13.1
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '0.17'
22
+ version: '0.19'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 0.13.1
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '0.17'
32
+ version: '0.19'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: nokogiri
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -48,18 +48,18 @@ dependencies:
48
48
  name: bundler
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "~>"
51
+ - - "<"
52
52
  - !ruby/object:Gem::Version
53
- version: '1.6'
53
+ version: '3'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - "~>"
58
+ - - "<"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.6'
60
+ version: '3'
61
61
  - !ruby/object:Gem::Dependency
62
- name: dotenv
62
+ name: byebug
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="
@@ -73,7 +73,7 @@ dependencies:
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  - !ruby/object:Gem::Dependency
76
- name: pry
76
+ name: dotenv
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - ">="
@@ -161,7 +161,7 @@ files:
161
161
  - LICENSE.txt
162
162
  - README.md
163
163
  - Rakefile
164
- - lib/httparty/patch.rb
164
+ - lib/httparty/ym_xml_parser.rb
165
165
  - lib/your_membership.rb
166
166
  - lib/your_membership/base.rb
167
167
  - lib/your_membership/commerce.rb
@@ -187,13 +187,11 @@ files:
187
187
  - lib/your_membership/sa_people.rb
188
188
  - lib/your_membership/session.rb
189
189
  - lib/your_membership/version.rb
190
- - spec/fixtures/vcr_cassettes/no_body_response.yml
191
190
  - spec/fixtures/vcr_cassettes/sa_members_all_getids_timestamp_multiple.yml
192
191
  - spec/fixtures/vcr_cassettes/sa_members_all_getids_timestamp_none.yml
193
192
  - spec/fixtures/vcr_cassettes/sa_members_all_getids_timestamp_single.yml
194
- - spec/fixtures/vcr_cassettes/sa_members_cdata.yml
195
- - spec/fixtures/vcr_cassettes/sa_members_no_body.yml
196
- - spec/lib/httparty/patch_spec.rb
193
+ - spec/lib/httparty/ym_xml_parser_spec.rb
194
+ - spec/lib/your_membership/base_spec.rb
197
195
  - spec/lib/your_membership/profile_spec.rb
198
196
  - spec/lib/your_membership/sa_members_spec.rb
199
197
  - spec/spec_helper.rb
@@ -217,19 +215,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
217
215
  - !ruby/object:Gem::Version
218
216
  version: '0'
219
217
  requirements: []
220
- rubyforge_project:
221
- rubygems_version: 2.7.6
218
+ rubygems_version: 3.0.3
222
219
  signing_key:
223
220
  specification_version: 4
224
221
  summary: Ruby SDK for interfacing with the YourMembership.com XML API
225
222
  test_files:
226
- - spec/fixtures/vcr_cassettes/no_body_response.yml
227
223
  - spec/fixtures/vcr_cassettes/sa_members_all_getids_timestamp_multiple.yml
228
224
  - spec/fixtures/vcr_cassettes/sa_members_all_getids_timestamp_none.yml
229
225
  - spec/fixtures/vcr_cassettes/sa_members_all_getids_timestamp_single.yml
230
- - spec/fixtures/vcr_cassettes/sa_members_cdata.yml
231
- - spec/fixtures/vcr_cassettes/sa_members_no_body.yml
232
- - spec/lib/httparty/patch_spec.rb
226
+ - spec/lib/httparty/ym_xml_parser_spec.rb
227
+ - spec/lib/your_membership/base_spec.rb
233
228
  - spec/lib/your_membership/profile_spec.rb
234
229
  - spec/lib/your_membership/sa_members_spec.rb
235
230
  - spec/spec_helper.rb
@@ -1,33 +0,0 @@
1
- require 'cgi'
2
-
3
- # Monkey Patch for the HTTParty Gem
4
- module HTTParty
5
- # In order to parse the HTML encoded documents returned by the YourMembership
6
- # API we need to HTML decode the <![CDATA[ tags. This is a bug workaround.
7
- class Request
8
- # This is the encode_body method from HTTParty's Request Class adding an additional method call to fix
9
- # the CDATA elements that are improperly formatted in the YourMembership API's XML. This is done here to ensure that
10
- # the fix is in place before the data is parsed.
11
- def encode_body(body)
12
- body = fix_cdata body
13
- if ''.respond_to?(:encoding)
14
- _encode_body(body)
15
- else
16
- body
17
- end
18
- end
19
-
20
- # Bug Fix for HTML encoded < and > in XML body.
21
- # @param body [String] an XML document that needs to be checked for this specific issue.
22
- # @return [String] If the HTML encoding issue is found it is repaired and the document is returned.
23
- def fix_cdata(body)
24
- # <![CDATA[ = &lt;![CDATA[
25
- # ]]> = ]]&gt;
26
- if !body.nil? && body.include?('&lt;![CDATA[')
27
- body.gsub! '&lt;![CDATA[', '<![CDATA['
28
- body.gsub! ']]&gt', ']]>'
29
- end
30
- body
31
- end
32
- end
33
- end
@@ -1,48 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://api.yourmembership.com/
6
- body:
7
- encoding: UTF-8
8
- string: |
9
- <?xml version="1.0" encoding="UTF-8"?>
10
- <YourMembership>
11
- <Version>2.00</Version>
12
- <ApiKey><PRIVATE_KEY></ApiKey>
13
- <SaPasscode><SA_PASSCODE></SaPasscode>
14
- <CallID>10000</CallID>
15
- <Call Method="Sa.Members.All.GetIDs">
16
- <Timestamp>2015-12-02 15:54:11</Timestamp>
17
- </Call>
18
- </YourMembership>
19
- headers:
20
- Accept-Encoding:
21
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
22
- Accept:
23
- - "*/*"
24
- User-Agent:
25
- - Ruby
26
- response:
27
- status:
28
- code: 200
29
- message: OK
30
- headers:
31
- Cache-Control:
32
- - private
33
- Content-Length:
34
- - '24051'
35
- Content-Type:
36
- - text/xml; Charset=utf-8
37
- Set-Cookie:
38
- - "<ASP_SESSION_ID>"
39
- X-Powered-By:
40
- - ASP.NET
41
- Date:
42
- - Wed, 16 Dec 2015 20:54:12 GMT
43
- Connection:
44
- - Keep-alive
45
- string: null
46
- http_version:
47
- recorded_at: Wed, 16 Dec 2015 20:54:12 GMT
48
- recorded_with: VCR 3.0.0
@@ -1,51 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://api.yourmembership.com/
6
- body:
7
- encoding: UTF-8
8
- string: |
9
- <?xml version="1.0" encoding="UTF-8"?>
10
- <YourMembership>
11
- <Version>2.00</Version>
12
- <ApiKey><PRIVATE_KEY></ApiKey>
13
- <SaPasscode><SA_PASSCODE></SaPasscode>
14
- <CallID>10000</CallID>
15
- <Call Method="Sa.Members.All.GetIDs">
16
- <Timestamp>2015-12-02 15:54:11</Timestamp>
17
- </Call>
18
- </YourMembership>
19
- headers:
20
- Accept-Encoding:
21
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
22
- Accept:
23
- - "*/*"
24
- User-Agent:
25
- - Ruby
26
- response:
27
- status:
28
- code: 200
29
- message: OK
30
- headers:
31
- Cache-Control:
32
- - private
33
- Content-Length:
34
- - '24051'
35
- Content-Type:
36
- - text/xml; Charset=utf-8
37
- Set-Cookie:
38
- - "<ASP_SESSION_ID>"
39
- X-Powered-By:
40
- - ASP.NET
41
- Date:
42
- - Wed, 16 Dec 2015 20:54:12 GMT
43
- Connection:
44
- - Keep-alive
45
- body:
46
- encoding: UTF-8
47
- string: "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n\r\n<YourMembership_Response>\r\n<ErrCode>0</ErrCode>\r\n<ExtendedErrorInfo>&lt;![CDATA[Text information here]]&gt;</ExtendedErrorInfo>\r\n<Sa.Members.All.GetIDs>\r\n<ServerGmtBias>-5</ServerGmtBias>\r\n<ServerTime>2015-12-16
48
- 15:54:12</ServerTime>\r\n<Members>\r\n<ID>57EEB598-CB44-4D85-B0D6-377F393AF5B4</ID>\r\n<ID>1C0CE647-FAA5-4EB0-ADF0-5B669B36378E</ID>\r\n</Members>\r\n</Sa.Members.All.GetIDs>\r\n</YourMembership_Response>\r\n"
49
- http_version:
50
- recorded_at: Wed, 16 Dec 2015 20:54:12 GMT
51
- recorded_with: VCR 3.0.0
@@ -1,43 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://api.yourmembership.com/
6
- body:
7
- encoding: UTF-8
8
- string: ''
9
- headers:
10
- Accept-Encoding:
11
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
- Accept:
13
- - "*/*"
14
- User-Agent:
15
- - Ruby
16
- response:
17
- status:
18
- code: 200
19
- message: OK
20
- headers:
21
- Cache-Control:
22
- - private
23
- Content-Type:
24
- - text/xml; Charset=utf-8
25
- Vary:
26
- - Accept-Encoding
27
- Server:
28
- - Microsoft-IIS/8.5
29
- Set-Cookie:
30
- - "<ASP_SESSION_ID>"
31
- X-Powered-By:
32
- - ASP.NET
33
- Date:
34
- - Thu, 17 Aug 2017 20:18:09 GMT
35
- Content-Length:
36
- - '301'
37
- body:
38
- encoding: ASCII-8BIT
39
- string: "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n\r\n<YourMembership_Response>\r\n<ErrCode>902</ErrCode>\r\n<ExtendedErrorInfo></ExtendedErrorInfo>\r\n<ErrDesc>XML
40
- packet is malformed or otherwise unreadable.</ErrDesc>\r\n<XmlRequest>\r\n<unnamed></unnamed>\r\n</XmlRequest>\r\n</YourMembership_Response>\r\n"
41
- http_version:
42
- recorded_at: Thu, 17 Aug 2017 20:18:09 GMT
43
- recorded_with: VCR 3.0.3
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'FixCdata' do
4
- it 'string returned' do
5
- VCR.use_cassette 'sa_members_all_getids_timestamp_single' do
6
- response = HTTParty.post("https://api.yourmembership.com/")
7
- expect(response.body).to be_a(String)
8
- end
9
- end
10
-
11
- it 'replace &lt;![CDATA' do
12
- VCR.use_cassette 'sa_members_cdata' do
13
- response = HTTParty.post("https://api.yourmembership.com/")
14
- expect(response.body).to include("<![CDATA[")
15
- end
16
- end
17
-
18
- it 'replace ]]&gt' do
19
- VCR.use_cassette 'sa_members_cdata' do
20
- response = HTTParty.post("https://api.yourmembership.com/")
21
- expect(response.body).to include("]]>")
22
- end
23
- end
24
-
25
- it 'handle nil body response' do
26
- VCR.use_cassette 'no_body_response' do
27
- # The `null` in the cassette is being turned into a body of "" instead of a nil body. Stub it to be nil.
28
- expect_any_instance_of(HTTParty::Response).to receive_messages(body: nil)
29
- # Note that a nil body is unlikely (never) to occur within YM, but other non-YM APIs may respond with a nil body,
30
- # so we need to ensure that our patch can handle that.
31
- response = HTTParty.post("https://api.yourmembership.com/")
32
- expect(response.body).to be nil
33
- end
34
- end
35
- end