your_membership 1.1.5 → 1.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 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