engaging-networks-rest 0.1.0 → 0.3.0

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: a101e8d9b06d5978ebd2c4dd6fb143b45d394e137c8e1f3bedbcf15c328e7c67
4
- data.tar.gz: 0d1ba97c6987799cf9dc9f451bbe1b4a2d0911687f83cb06d50b3c55ad5d694e
3
+ metadata.gz: 25a126fa7b16483ced7dfe2a92d73813f676c66e9023ac0441a511dca1a2cf2f
4
+ data.tar.gz: 3455f32e368b6f49915fb5429de01e62c2fa9514740e767ba4a43f02609f277f
5
5
  SHA512:
6
- metadata.gz: ed34e204939951c9982b7755628bf89286f5ec62070cf0eb4b19f2fd2de53242f06a2b09d1a42c32e08879c73d7bd0c7c89bf5c8206b5bf58b073e2c3588e218
7
- data.tar.gz: e3126e27996c77826e3e552bbe27bd316d53dbf953dfd59b01271132e412fc8a252798ab6dc4dc88dd4d1d3b84c43ee594d665115553bbc173600d5a542ac6ee
6
+ metadata.gz: 79c178cdc855862dd88c2393c20f08f3b58b65560fa46281c968945c9cd35423c0452588c5ff4b0f2fcd503f4edb2f0f3c28bd366b34d02b4fbaca49c07e1879
7
+ data.tar.gz: 9db9deb4c6b0d183697c8c209bbd8c0d69375f961b456a4ba3d93d3a4df8381e825dbaeea22d320cf5209992cd3b62859364979dc7e4b9a2e6078f37abfbc916
data/Gemfile CHANGED
@@ -1,6 +1,12 @@
1
1
  source "https://rubygems.org"
2
2
 
3
+ gem 'faraday', '~> 0.15'
4
+
3
5
  group :development do
4
6
  gem 'rspec', '>= 0'
5
7
  gem 'juwelier', '~> 2.1.0'
8
+ gem 'webmock', '~> 3.4'
9
+ gem 'faker', '~> 1.9'
10
+ gem 'pry-byebug', '~> 3.6'
11
+ gem 'faraday-detailed_logger', '~> 2.1', '>= 2.1.2'
6
12
  end
data/README.md CHANGED
@@ -1,2 +1,22 @@
1
1
  # engaging-networks-rest
2
2
  Client gem for the ENS API to Engaging Networks
3
+
4
+ ## Install
5
+
6
+ `gem install engaging-networks-rest`
7
+
8
+ ## Usage
9
+
10
+ ```
11
+ client = EngagingNetworksRest.new(api_key: 'YOUR API KEY HERE')
12
+
13
+ # get pages by type
14
+ pages = client.pages(type: 'dcf', status: 'live')
15
+
16
+ # process a page request
17
+ response = client.process_page_request(page_id: 12345, body: {supporter: {first_name: 'Alice'}})
18
+ ```
19
+
20
+ The client will call authentication endpoint behind the scenes the first time it makes a request.
21
+ Currently, it does not attempt to check if its token is still valid for later requests.
22
+ It is possible to force re-authentication with `client.authenticate!`.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.3.0
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: engaging-networks-rest 0.1.0 ruby lib
5
+ # stub: engaging-networks-rest 0.3.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "engaging-networks-rest".freeze
9
- s.version = "0.1.0"
9
+ s.version = "0.3.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Jacinda Moore".freeze]
14
- s.date = "2018-12-06"
14
+ s.date = "2019-01-08"
15
15
  s.description = "Client gem for the ENS API to Engaging Networks".freeze
16
16
  s.email = "jacinda@controlshiftlabs.com".freeze
17
17
  s.extra_rdoc_files = [
@@ -29,26 +29,47 @@ Gem::Specification.new do |s|
29
29
  "Rakefile",
30
30
  "VERSION",
31
31
  "engaging-networks-rest.gemspec",
32
- "lib/engaging_networks_rest.rb"
32
+ "example.rb",
33
+ "lib/engaging_networks_rest.rb",
34
+ "lib/engaging_networks_rest/client.rb",
35
+ "lib/engaging_networks_rest/client/pages.rb",
36
+ "spec/client/pages_spec.rb",
37
+ "spec/client_spec.rb",
38
+ "spec/spec_helper.rb"
33
39
  ]
34
40
  s.homepage = "http://github.com/controlshift/engaging-networks-rest".freeze
35
41
  s.licenses = ["MIT".freeze]
36
- s.rubygems_version = "2.7.6".freeze
42
+ s.rubygems_version = "2.7.7".freeze
37
43
  s.summary = "Client gem for the ENS API to Engaging Networks".freeze
38
44
 
39
45
  if s.respond_to? :specification_version then
40
46
  s.specification_version = 4
41
47
 
42
48
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
+ s.add_runtime_dependency(%q<faraday>.freeze, ["~> 0.15"])
43
50
  s.add_development_dependency(%q<rspec>.freeze, [">= 0"])
44
51
  s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
52
+ s.add_development_dependency(%q<webmock>.freeze, ["~> 3.4"])
53
+ s.add_development_dependency(%q<faker>.freeze, ["~> 1.9"])
54
+ s.add_development_dependency(%q<pry-byebug>.freeze, ["~> 3.6"])
55
+ s.add_development_dependency(%q<faraday-detailed_logger>.freeze, [">= 2.1.2", "~> 2.1"])
45
56
  else
57
+ s.add_dependency(%q<faraday>.freeze, ["~> 0.15"])
46
58
  s.add_dependency(%q<rspec>.freeze, [">= 0"])
47
59
  s.add_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
60
+ s.add_dependency(%q<webmock>.freeze, ["~> 3.4"])
61
+ s.add_dependency(%q<faker>.freeze, ["~> 1.9"])
62
+ s.add_dependency(%q<pry-byebug>.freeze, ["~> 3.6"])
63
+ s.add_dependency(%q<faraday-detailed_logger>.freeze, [">= 2.1.2", "~> 2.1"])
48
64
  end
49
65
  else
66
+ s.add_dependency(%q<faraday>.freeze, ["~> 0.15"])
50
67
  s.add_dependency(%q<rspec>.freeze, [">= 0"])
51
68
  s.add_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
69
+ s.add_dependency(%q<webmock>.freeze, ["~> 3.4"])
70
+ s.add_dependency(%q<faker>.freeze, ["~> 1.9"])
71
+ s.add_dependency(%q<pry-byebug>.freeze, ["~> 3.6"])
72
+ s.add_dependency(%q<faraday-detailed_logger>.freeze, [">= 2.1.2", "~> 2.1"])
52
73
  end
53
74
  end
54
75
 
data/example.rb ADDED
@@ -0,0 +1,32 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), 'lib')
2
+
3
+ require 'engaging_networks_rest'
4
+ require 'faraday/detailed_logger'
5
+ require 'byebug'
6
+
7
+ def instrument_connection_with_extended_logging(client)
8
+ default_options = {
9
+ headers: {
10
+ 'Accept' => "application/json;q=0.1",
11
+ 'Accept-Charset' => "utf-8"
12
+ }
13
+ }
14
+
15
+ faraday_builder = ->(faraday) do
16
+ faraday.response :detailed_logger
17
+ faraday.adapter Faraday.default_adapter
18
+ end
19
+
20
+ instrumented_connection = Faraday.new(
21
+ default_options.merge(url: "https://#{EngagingNetworksRest::Client::ENS_DOMAIN}"),
22
+ &faraday_builder
23
+ )
24
+ client.instance_variable_set(:@connection, instrumented_connection)
25
+ end
26
+
27
+ client = EngagingNetworksRest.new(api_key: ENV['EN_API_KEY'])
28
+ instrument_connection_with_extended_logging(client)
29
+
30
+ byebug
31
+
32
+ puts "Bye!"
@@ -0,0 +1,22 @@
1
+ module EngagingNetworksRest
2
+ class Client
3
+ module Pages
4
+ def pages(type:, status: nil)
5
+ filter_params = {'type' => type}
6
+ unless status.nil?
7
+ filter_params['status'] = status
8
+ end
9
+
10
+ get(path: "/ens/service/page", params: filter_params)
11
+ end
12
+
13
+ def page(page_id:)
14
+ get(path: "/ens/service/page/#{page_id}")
15
+ end
16
+
17
+ def process_page_request(page_id:, supporter_data:)
18
+ post(path: "/ens/service/page/#{page_id}/process", body: {supporter: supporter_data})
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,60 @@
1
+ require 'faraday'
2
+ require 'json'
3
+ require 'engaging_networks_rest/client/pages'
4
+
5
+ module EngagingNetworksRest
6
+ class Client
7
+ attr_reader :api_key, :connection, :ens_auth_key
8
+
9
+ ENS_DOMAIN = 'www.e-activist.com'.freeze
10
+
11
+ def initialize(api_key:)
12
+ @api_key = api_key
13
+
14
+ @connection = Faraday.new(url: "https://#{ENS_DOMAIN}")
15
+ end
16
+
17
+ def authenticate!
18
+ response = connection.post do |req|
19
+ req.url '/ens/service/authenticate'
20
+ req.headers['Content-Type'] = 'application/json'
21
+ req.body = api_key
22
+ end
23
+
24
+ parsed_body = JSON.parse(response.body)
25
+ @ens_auth_key = parsed_body['ens-auth-token']
26
+ end
27
+
28
+ def authenticated?
29
+ !ens_auth_key.nil?
30
+ end
31
+
32
+ def get(path:, params: {})
33
+ request(method: :get, path: path, params: params)
34
+ end
35
+
36
+ def post(path:, body: {})
37
+ request(method: :post, path: path, body: body)
38
+ end
39
+
40
+ include EngagingNetworksRest::Client::Pages
41
+
42
+ private
43
+
44
+ def request(method:, path:, params: {}, body: {})
45
+ unless authenticated?
46
+ authenticate!
47
+ end
48
+
49
+ response = connection.send(method) do |req|
50
+ req.path = path
51
+ req.params = params
52
+ req.headers['Content-Type'] = 'application/json'
53
+ req.headers['ens-auth-token'] = ens_auth_key
54
+ req.body = ::JSON.generate(body) unless body.empty?
55
+ end
56
+
57
+ JSON.parse(response.body)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ require 'engaging_networks_rest/client'
2
+
3
+ module EngagingNetworksRest
4
+ class << self
5
+ def new(api_key:)
6
+ EngagingNetworksRest::Client.new(api_key: api_key)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe EngagingNetworksRest::Client::Pages do
4
+ let(:api_key) { 'abc-123' }
5
+ let(:ens_auth_key) { 'tmp-auth-key-456' }
6
+ let(:standard_headers) { {'Content-Type' => 'application/json', 'ens-auth-token' => ens_auth_key} }
7
+
8
+ subject { EngagingNetworksRest::Client.new(api_key: api_key) }
9
+
10
+ describe '#pages' do
11
+ let(:page_type) { 'dcf' }
12
+ let(:page_status) { 'live' }
13
+ let(:pages_url) { "https://#{EngagingNetworksRest::Client::ENS_DOMAIN}/ens/service/page" }
14
+
15
+ # The API docs don't actually say what this response looks like, so this is a guess.
16
+ # Fortunately, it doesn't actually matter for our purposes, since we just return whatever JSON we get.
17
+ let(:response) { [{'id' => 123, 'title' => 'A page'}, {'id' => 234, 'title' => 'Another page'}] }
18
+
19
+ shared_examples_for 'list pages' do
20
+ it 'should get pages' do
21
+ stub_request(:get, pages_url).with(headers: standard_headers, query: {'type' => page_type, 'status' => page_status})
22
+ .to_return(body: response.to_json)
23
+
24
+ expect(subject.pages(type: page_type, status: page_status)).to eq response
25
+ end
26
+
27
+ it 'should omit status param if not specified' do
28
+ stub_request(:get, pages_url).with(headers: standard_headers, query: {'type' => page_type})
29
+ .to_return(body: response.to_json)
30
+
31
+ expect(subject.pages(type: page_type)).to eq response
32
+ end
33
+ end
34
+
35
+ context 'not already authenticated' do
36
+ before :each do
37
+ expect(subject).to receive(:authenticate!) do
38
+ allow(subject).to receive(:ens_auth_key).and_return(ens_auth_key)
39
+ end
40
+ end
41
+
42
+ include_examples 'list pages'
43
+ end
44
+
45
+ context 'already authenticated' do
46
+ before :each do
47
+ allow(subject).to receive(:ens_auth_key).and_return(ens_auth_key)
48
+ end
49
+
50
+ include_examples 'list pages'
51
+ end
52
+ end
53
+
54
+ describe '#process_page_request' do
55
+ let(:page_id) { 234 }
56
+ let(:page_req_url) { "https://#{EngagingNetworksRest::Client::ENS_DOMAIN}/ens/service/page/#{page_id}/process" }
57
+ let(:email) { Faker::Internet.email }
58
+ let(:supporter_hash) { {'firstName' => 'Joe', 'lastName' => 'Smith', 'emailAddress' => email, 'customField1' => 'foo'} }
59
+ let(:response) { {'id' => '1234567', 'status' => 'SUCCESS', 'supporterEmailAddress' => email, 'supporterId' => '98765'} }
60
+
61
+ shared_examples_for 'process page request' do
62
+ it 'should process the page request' do
63
+ stub_request(:post, page_req_url).with(body: {supporter: supporter_hash}.to_json, headers: standard_headers)
64
+ .to_return(body: response.to_json)
65
+
66
+ expect(subject.process_page_request(page_id: page_id, body: {supporter: supporter_hash})).to eq response
67
+ end
68
+ end
69
+
70
+ context 'not already authenticated' do
71
+ before :each do
72
+ expect(subject).to receive(:authenticate!) do
73
+ allow(subject).to receive(:ens_auth_key).and_return(ens_auth_key)
74
+ end
75
+ end
76
+
77
+ include_examples 'process page request'
78
+ end
79
+
80
+ context 'already authenticated' do
81
+ before :each do
82
+ allow(subject).to receive(:ens_auth_key).and_return(ens_auth_key)
83
+ end
84
+
85
+ include_examples 'process page request'
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe EngagingNetworksRest::Client do
4
+ let(:api_key) { 'abc123' }
5
+ let(:content_type_header) { {'Content-Type' => 'application/json'} }
6
+
7
+ subject { EngagingNetworksRest::Client.new(api_key: api_key) }
8
+
9
+ describe '#authenticate!' do
10
+ let(:auth_url) { "https://#{EngagingNetworksRest::Client::ENS_DOMAIN}/ens/service/authenticate" }
11
+ let(:auth_key) { '75491e42-99dc-45ce-b637-a681bede875c' }
12
+ let(:auth_key_body) { "{\"ens-auth-token\":\"#{auth_key}\",\"expires\":3600000}" }
13
+
14
+ before :each do
15
+ stub_request(:post, auth_url).with(body: api_key, headers: content_type_header).to_return(body: auth_key_body)
16
+ end
17
+
18
+ it 'should set the ens_auth_key on the client' do
19
+ subject.authenticate!
20
+
21
+ expect(subject.ens_auth_key).to eq auth_key
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ require 'rspec'
2
+ require 'webmock/rspec'
3
+ require 'faker'
4
+
5
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
6
+
7
+ require 'engaging_networks_rest'
8
+
9
+ RSpec.configure do |config|
10
+ config.include WebMock::API
11
+
12
+ config.before :each do
13
+ WebMock.reset!
14
+ end
15
+
16
+ config.after :each do
17
+ WebMock.reset!
18
+ end
19
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engaging-networks-rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacinda Moore
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-06 00:00:00.000000000 Z
11
+ date: 2019-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.15'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rspec
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,68 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: 2.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: webmock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faker
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.9'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: faraday-detailed_logger
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 2.1.2
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '2.1'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: 2.1.2
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '2.1'
41
117
  description: Client gem for the ENS API to Engaging Networks
42
118
  email: jacinda@controlshiftlabs.com
43
119
  executables: []
@@ -56,7 +132,13 @@ files:
56
132
  - Rakefile
57
133
  - VERSION
58
134
  - engaging-networks-rest.gemspec
135
+ - example.rb
59
136
  - lib/engaging_networks_rest.rb
137
+ - lib/engaging_networks_rest/client.rb
138
+ - lib/engaging_networks_rest/client/pages.rb
139
+ - spec/client/pages_spec.rb
140
+ - spec/client_spec.rb
141
+ - spec/spec_helper.rb
60
142
  homepage: http://github.com/controlshift/engaging-networks-rest
61
143
  licenses:
62
144
  - MIT
@@ -77,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
159
  version: '0'
78
160
  requirements: []
79
161
  rubyforge_project:
80
- rubygems_version: 2.7.6
162
+ rubygems_version: 2.7.7
81
163
  signing_key:
82
164
  specification_version: 4
83
165
  summary: Client gem for the ENS API to Engaging Networks