engaging-networks-rest 0.1.0 → 0.3.0

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: 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