action_kit_rest 0.2.2 → 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 +5 -13
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/Gemfile +2 -3
- data/Gemfile.lock +78 -84
- data/README.md +53 -1
- data/Rakefile +8 -8
- data/VERSION +1 -1
- data/action_kit_rest.gemspec +65 -53
- data/lib/action_kit_rest.rb +10 -0
- data/lib/action_kit_rest/actions/event_create_action.rb +9 -0
- data/lib/action_kit_rest/actions/event_signup_action.rb +9 -0
- data/lib/action_kit_rest/actions/unsubscribe_action.rb +9 -0
- data/lib/action_kit_rest/api.rb +3 -4
- data/lib/action_kit_rest/client.rb +16 -21
- data/lib/action_kit_rest/event.rb +12 -0
- data/lib/action_kit_rest/event_signup.rb +7 -0
- data/lib/action_kit_rest/language.rb +12 -0
- data/lib/action_kit_rest/pages/donation_page.rb +9 -0
- data/lib/action_kit_rest/pages/event_campaign_page.rb +54 -0
- data/lib/action_kit_rest/pages/unsubscribe_page.rb +9 -0
- data/lib/action_kit_rest/phone.rb +7 -0
- data/lib/action_kit_rest/response/raise_error.rb +15 -2
- data/lib/action_kit_rest/user.rb +13 -0
- data/lib/action_kit_rest/version.rb +3 -3
- data/spec/fixtures/page/campaign.json +32 -0
- data/spec/fixtures/phone/object.json +33 -0
- data/spec/fixtures/user/{object.json → object_with_phones.json} +0 -0
- data/spec/fixtures/user/object_without_phones.json +1 -0
- data/spec/{action_kit_rest → lib/action_kit_rest}/logger_spec.rb +0 -0
- data/spec/{action_kit_rest → lib/action_kit_rest}/page_spec.rb +10 -2
- data/spec/lib/action_kit_rest/pages/event_campaign_page_spec.rb +48 -0
- data/spec/{action_kit_rest/pages/input_page_spec.rb → lib/action_kit_rest/pages/import_page_spec.rb} +6 -12
- data/spec/{action_kit_rest → lib/action_kit_rest}/response/collection_spec.rb +0 -0
- data/spec/{action_kit_rest → lib/action_kit_rest}/response/wrapper_spec.rb +0 -0
- data/spec/{action_kit_rest → lib/action_kit_rest}/user_spec.rb +17 -3
- data/spec/support/shared_contexts/stub_logger.rb +9 -0
- metadata +57 -54
data/lib/action_kit_rest.rb
CHANGED
@@ -16,11 +16,21 @@ require 'action_kit_rest/page'
|
|
16
16
|
require 'action_kit_rest/base'
|
17
17
|
require 'action_kit_rest/list'
|
18
18
|
require 'action_kit_rest/action'
|
19
|
+
require 'action_kit_rest/actions/unsubscribe_action'
|
20
|
+
require 'action_kit_rest/actions/event_create_action'
|
21
|
+
require 'action_kit_rest/actions/event_signup_action'
|
19
22
|
require 'action_kit_rest/user'
|
23
|
+
require 'action_kit_rest/phone'
|
24
|
+
require 'action_kit_rest/event'
|
25
|
+
require 'action_kit_rest/language'
|
20
26
|
require 'action_kit_rest/tag'
|
27
|
+
require 'action_kit_rest/event_signup'
|
21
28
|
require 'action_kit_rest/pages/base'
|
22
29
|
require 'action_kit_rest/pages/import_page'
|
23
30
|
require 'action_kit_rest/pages/signup_page'
|
31
|
+
require 'action_kit_rest/pages/donation_page'
|
32
|
+
require 'action_kit_rest/pages/unsubscribe_page'
|
33
|
+
require 'action_kit_rest/pages/event_campaign_page'
|
24
34
|
require 'action_kit_rest/response/wrapper'
|
25
35
|
require 'action_kit_rest/response/raise_error'
|
26
36
|
require 'action_kit_rest/response/validation_error'
|
data/lib/action_kit_rest/api.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
module ActionKitRest
|
2
2
|
class API < Vertebrae::API
|
3
3
|
|
4
|
-
def
|
5
|
-
ActionKitRest::Response::Wrapper.new(
|
4
|
+
def request(*args)
|
5
|
+
ActionKitRest::Response::Wrapper.new( super(*args) )
|
6
6
|
end
|
7
|
-
alias_method_chain :request, :wrapper
|
8
7
|
|
9
8
|
def post_json_request(path, params)
|
10
9
|
p = {}
|
@@ -50,4 +49,4 @@ module ActionKitRest
|
|
50
49
|
end
|
51
50
|
end
|
52
51
|
end
|
53
|
-
end
|
52
|
+
end
|
@@ -2,34 +2,29 @@ require 'action_kit_rest/api'
|
|
2
2
|
|
3
3
|
module ActionKitRest
|
4
4
|
class Client < API
|
5
|
+
attr_accessor :clients
|
5
6
|
|
6
|
-
def
|
7
|
-
|
7
|
+
def initialize(params)
|
8
|
+
super(params)
|
9
|
+
self.clients = {}
|
8
10
|
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
[:import, :signup, :donation, :unsubscribe, :event_campaign].each do |page_type|
|
13
|
+
define_method "#{page_type}_page" do
|
14
|
+
clients["#{page_type}_page"] ||= ("ActionKitRest::Pages::#{page_type.to_s.classify}Page".constantize).new(client: self)
|
15
|
+
end
|
12
16
|
end
|
13
17
|
|
14
|
-
|
15
|
-
|
18
|
+
[:unsubscribe, :event_create, :event_signup].each do |action|
|
19
|
+
define_method "#{action}_action" do
|
20
|
+
clients["#{action}_action"] ||= ("ActionKitRest::Actions::#{action.to_s.classify}Action".constantize).new(client: self)
|
21
|
+
end
|
16
22
|
end
|
17
23
|
|
18
|
-
|
19
|
-
|
24
|
+
[:action, :page, :tag, :list, :user, :phone, :event, :language, :event_signup].each do |thing|
|
25
|
+
define_method thing do
|
26
|
+
clients[thing] ||= ("ActionKitRest::#{thing.to_s.classify}".constantize).new(client: self)
|
27
|
+
end
|
20
28
|
end
|
21
|
-
|
22
|
-
def tag
|
23
|
-
@tag ||= ActionKitRest::Tag.new(client: self)
|
24
|
-
end
|
25
|
-
|
26
|
-
def list
|
27
|
-
@list ||= ActionKitRest::List.new(client: self)
|
28
|
-
end
|
29
|
-
|
30
|
-
def user
|
31
|
-
@user ||= ActionKitRest::User.new(client: self)
|
32
|
-
end
|
33
|
-
|
34
29
|
end
|
35
30
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module ActionKitRest
|
2
|
+
module Pages
|
3
|
+
class EventCampaignPage < ActionKitRest::Pages::Base
|
4
|
+
def base_path
|
5
|
+
'campaign'
|
6
|
+
end
|
7
|
+
|
8
|
+
def create(params)
|
9
|
+
event_pages_tags = params.delete(:event_pages_tags)
|
10
|
+
event_campaign = super(params)
|
11
|
+
|
12
|
+
# Also create EventCreatePage and EventSignupPage
|
13
|
+
event_campaign.obj['event_create_page_name'] = create_event_create_page(event_campaign, event_pages_tags)
|
14
|
+
event_campaign.obj['event_signup_page_name'] = create_event_signup_page(event_campaign, event_pages_tags)
|
15
|
+
|
16
|
+
event_campaign
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def create_event_create_page(event_campaign, tags)
|
22
|
+
params = event_create_page_params(event_campaign, tags)
|
23
|
+
response = client.post_json_request('eventcreatepage/', params)
|
24
|
+
|
25
|
+
params[:name]
|
26
|
+
end
|
27
|
+
|
28
|
+
def event_create_page_params(event_campaign, tags)
|
29
|
+
{
|
30
|
+
campaign: event_campaign['resource_uri'],
|
31
|
+
name: "#{event_campaign['name']}-event-create",
|
32
|
+
title: "#{event_campaign['title']}: event create",
|
33
|
+
tags: tags
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_event_signup_page(event_campaign, tags)
|
38
|
+
params = event_signup_page_params(event_campaign, tags)
|
39
|
+
response = client.post_json_request('eventsignuppage/', params)
|
40
|
+
|
41
|
+
params[:name]
|
42
|
+
end
|
43
|
+
|
44
|
+
def event_signup_page_params(event_campaign, tags)
|
45
|
+
{
|
46
|
+
campaign: event_campaign['resource_uri'],
|
47
|
+
name: "#{event_campaign['name']}-event-signup",
|
48
|
+
title: "#{event_campaign['title']}: event signup",
|
49
|
+
tags: tags
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -9,6 +9,17 @@ module ActionKitRest
|
|
9
9
|
raise ActionKitRest::Response::ValidationError.new(url: response[:url].to_s, body: response[:body])
|
10
10
|
elsif status_code == 404
|
11
11
|
raise ActionKitRest::Response::NotFound.new(response[:url].to_s)
|
12
|
+
elsif status_code == 401
|
13
|
+
raise ActionKitRest::Response::Unauthorized.new(response[:url].to_s)
|
14
|
+
elsif status_code == 500 && response[:body] =~ /\"error\"/
|
15
|
+
error_hsh = JSON.parse(response[:body])
|
16
|
+
error_message = error_hsh['error']
|
17
|
+
|
18
|
+
if error_message == 'Sorry, this request could not be processed. Please try again later.'
|
19
|
+
raise ActionKitRest::Response::TryAgainLater.new(error_message(response))
|
20
|
+
else
|
21
|
+
raise StandardError.new(error_message(response))
|
22
|
+
end
|
12
23
|
else
|
13
24
|
raise StandardError.new(error_message(response))
|
14
25
|
end
|
@@ -20,6 +31,8 @@ module ActionKitRest
|
|
20
31
|
end
|
21
32
|
end
|
22
33
|
|
34
|
+
class TryAgainLater < StandardError ; end
|
23
35
|
class NotFound < StandardError ; end
|
24
|
-
|
25
|
-
end
|
36
|
+
class Unauthorized < StandardError ; end
|
37
|
+
end
|
38
|
+
end
|
data/lib/action_kit_rest/user.rb
CHANGED
@@ -3,5 +3,18 @@ module ActionKitRest
|
|
3
3
|
def base_path
|
4
4
|
'user'
|
5
5
|
end
|
6
|
+
|
7
|
+
def get(id)
|
8
|
+
user = super(id)
|
9
|
+
|
10
|
+
# Perform a second request to retrieve user's phones data if any available
|
11
|
+
# (user.phones attribute includes the path for associated phones, not the data itself)
|
12
|
+
if user.id.present? && user.phones.any?
|
13
|
+
phones_list = client.phone.list(user: user.id)
|
14
|
+
user.obj.phones = phones_list.obj.to_a
|
15
|
+
end
|
16
|
+
|
17
|
+
user
|
18
|
+
end
|
6
19
|
end
|
7
20
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
{
|
2
|
+
"allow_private":true,
|
3
|
+
"created_at":"2010-11-30T18:45:43",
|
4
|
+
"default_event_size":50,
|
5
|
+
"default_title":"",
|
6
|
+
"eventcreatepages":[],
|
7
|
+
"events":"/rest/v1/event/?campaign=88",
|
8
|
+
"eventsignuppages":[],
|
9
|
+
"id":88,
|
10
|
+
"max_event_size":null,
|
11
|
+
"name":"climate-change-paris-2015",
|
12
|
+
"public_create_page":true,
|
13
|
+
"public_search_page":true,
|
14
|
+
"require_email_confirmation":true,
|
15
|
+
"require_staff_approval":false,
|
16
|
+
"resource_uri":"/rest/v1/campaign/88/",
|
17
|
+
"show_address1":false,
|
18
|
+
"show_attendee_count":false,
|
19
|
+
"show_city":true,
|
20
|
+
"show_directions":false,
|
21
|
+
"show_public_description":true,
|
22
|
+
"show_state":true,
|
23
|
+
"show_title":true,
|
24
|
+
"show_venue":true,
|
25
|
+
"show_zip":true,
|
26
|
+
"starts_at":null,
|
27
|
+
"title":"Climate Change Paris 2015",
|
28
|
+
"updated_at":"2015-06-19T01:39:09",
|
29
|
+
"use_start_date":true,
|
30
|
+
"use_start_time":true,
|
31
|
+
"use_title":true
|
32
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
{ "meta": { "limit": 20,
|
2
|
+
"next": "None",
|
3
|
+
"offset": 0,
|
4
|
+
"previous": "None",
|
5
|
+
"total_count": 3},
|
6
|
+
"objects": [ { "created_at": "2015-09-29T04:15:50",
|
7
|
+
"id": 1,
|
8
|
+
"normalized_phone": "7755555555",
|
9
|
+
"phone": "7755555555",
|
10
|
+
"resource_uri": "/rest/v1/phone/1/",
|
11
|
+
"source": "api",
|
12
|
+
"type": "home",
|
13
|
+
"updated_at": "2016-03-31T17:05:27",
|
14
|
+
"user": "/rest/v1/user/1/"},
|
15
|
+
{ "created_at": "2012-05-12T23:49:44",
|
16
|
+
"id": 2,
|
17
|
+
"normalized_phone": "7755555577",
|
18
|
+
"phone": "7755555577",
|
19
|
+
"resource_uri": "/rest/v1/phone/2/",
|
20
|
+
"source": "user",
|
21
|
+
"type": "home",
|
22
|
+
"updated_at": "2016-03-31T17:05:27",
|
23
|
+
"user": "/rest/v1/user/1/"},
|
24
|
+
{ "created_at": "2012-05-12T23:49:44",
|
25
|
+
"id": 3,
|
26
|
+
"normalized_phone": "3103103310",
|
27
|
+
"phone": "310-310-3310",
|
28
|
+
"resource_uri": "/rest/v1/phone/3/",
|
29
|
+
"source": "user",
|
30
|
+
"type": "mobile",
|
31
|
+
"updated_at": "2016-03-31T17:05:27",
|
32
|
+
"user": "/rest/v1/user/1/"}]
|
33
|
+
}
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
{"actions": "/rest/v1/action/?user=1", "address1": "", "address2": "", "city": "Philadelphia", "country": "United States", "created_at": "2009-09-02T18:42:54", "email": "walkers@wawd.com", "events": "/rest/v1/event/?user=1", "eventsignups": "/rest/v1/eventsignup/?user=1", "fields": {"abc1": "2012-07-09 22:22:38", "abc2": "1", "abc4": "808003061", "abc5": "100", "abc6": "unsubscribed", "abc8": "roboticdogs", "color": ["blue", "yellow"], "food": "meatloaf", "test_custom": "\">la la la"}, "first_name": "", "id": 1, "lang": "/rest/v1/language/100/", "last_name": "", "location": "/rest/v1/location/1/", "middle_name": "", "orderrecurrings": "/rest/v1/orderrecurring/?user=1", "orders": "/rest/v1/order/?user=1", "phones": [], "plus4": "", "postal": "19130", "prefix": "", "rand_id": 382815937, "region": "PA", "resource_uri": "/rest/v1/user/1/", "source": "", "state": "PA", "subscription_status": "unsubscribed", "subscriptionhistory": "/rest/v1/subscriptionhistory/?user=1", "subscriptions": "/rest/v1/subscription/?user=1", "suffix": "", "token": ".1.9P66-W", "updated_at": "2013-10-02T00:56:36", "usergeofields": "/rest/v1/usergeofield/?user=1", "usermailings": "/rest/v1/usermailing/?user=1", "useroriginal": "/rest/v1/useroriginal/1/", "zip": "19130"}
|
File without changes
|
@@ -87,9 +87,17 @@ describe ActionKitRest::Page do
|
|
87
87
|
let(:status) { 500 }
|
88
88
|
|
89
89
|
it "should return nil" do
|
90
|
-
lambda{ subject.page.get(1).should == nil }.should raise_exception
|
90
|
+
lambda{ subject.page.get(1).should == nil }.should raise_exception(StandardError)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'try again' do
|
95
|
+
let(:status) { 500 }
|
96
|
+
let(:body) { '{"error": "Sorry, this request could not be processed. Please try again later."}' }
|
97
|
+
it "should return nil" do
|
98
|
+
lambda{ subject.page.get(1).should == nil }.should raise_exception(ActionKitRest::Response::TryAgainLater)
|
91
99
|
end
|
92
100
|
end
|
93
101
|
end
|
94
102
|
end
|
95
|
-
end
|
103
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/shared_contexts/stub_logger'
|
3
|
+
|
4
|
+
describe ActionKitRest::Pages::EventCampaignPage do
|
5
|
+
include_context "stub_logger"
|
6
|
+
|
7
|
+
describe 'create' do
|
8
|
+
let(:actionkit) { ActionKitRest.new(host: 'test.com') }
|
9
|
+
|
10
|
+
let(:event_campaign_title) { "Climate Change Paris 2015" }
|
11
|
+
let(:event_campaign_name) { "climate-change-paris-2015" }
|
12
|
+
|
13
|
+
before :each do
|
14
|
+
stub_request(:post, 'https://test.com/rest/v1/campaign/')
|
15
|
+
.with(body: "{\"title\":\"#{event_campaign_title}\",\"name\":\"#{event_campaign_name}\"}")
|
16
|
+
.to_return({status: '200', headers: {location: 'https://test.com/rest/v1/campaign/88/'} })
|
17
|
+
|
18
|
+
stub_request(:get, 'https://test.com/rest/v1/campaign/88/')
|
19
|
+
.to_return({body: fixture('page/campaign.json'), status: '200', headers: {content_type: "application/json; charset=utf-8"}})
|
20
|
+
|
21
|
+
stub_request(:post, 'https://test.com/rest/v1/eventcreatepage/')
|
22
|
+
.with(:body => "{\"campaign\":\"/rest/v1/campaign/88/\",\"name\":\"climate-change-paris-2015-event-create\",\"title\":\"Climate Change Paris 2015: event create\",\"tags\":[\"/rest/v1/tag/1/\",\"/rest/v1/tag/5/\"]}")
|
23
|
+
.to_return({status: '200', headers: {location: "https://test.com/rest/v1/eventcreatepage/99/"}})
|
24
|
+
|
25
|
+
stub_request(:post, 'https://test.com/rest/v1/eventsignuppage/')
|
26
|
+
.with(:body => "{\"campaign\":\"/rest/v1/campaign/88/\",\"name\":\"climate-change-paris-2015-event-signup\",\"title\":\"Climate Change Paris 2015: event signup\",\"tags\":[\"/rest/v1/tag/1/\",\"/rest/v1/tag/5/\"]}")
|
27
|
+
.to_return({status: '200', headers: {location: "https://test.com/rest/v1/eventsignuppage/111/"}})
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should create an event campaign' do
|
31
|
+
resp = actionkit.event_campaign_page.create({title: 'Climate Change Paris 2015', name: 'climate-change-paris-2015', event_pages_tags: ['/rest/v1/tag/1/', '/rest/v1/tag/5/']})
|
32
|
+
expect(resp.title).to eq event_campaign_title
|
33
|
+
expect(resp.name).to eq event_campaign_name
|
34
|
+
|
35
|
+
expect(a_request(:post, 'https://test.com/rest/v1/campaign/')).to have_been_made
|
36
|
+
expect(a_request(:get, 'https://test.com/rest/v1/campaign/88/')).to have_been_made
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should create associated event and signup create pages' do
|
40
|
+
resp = actionkit.event_campaign_page.create({title: 'Climate Change Paris 2015', name: 'climate-change-paris-2015', event_pages_tags: ['/rest/v1/tag/1/', '/rest/v1/tag/5/']})
|
41
|
+
expect(resp.event_create_page_name).to eq 'climate-change-paris-2015-event-create'
|
42
|
+
expect(resp.event_signup_page_name).to eq 'climate-change-paris-2015-event-signup'
|
43
|
+
|
44
|
+
expect(a_request(:post, 'https://test.com/rest/v1/eventcreatepage/')).to have_been_made
|
45
|
+
expect(a_request(:post, 'https://test.com/rest/v1/eventsignuppage/')).to have_been_made
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|