zferral 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format documentation
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "httparty"
4
+ gem "json"
5
+ gem "hashie"
6
+
7
+ # Add dependencies to develop your gem here.
8
+ # Include everything needed to run rake, tests, features, etc.
9
+ group :development do
10
+ gem "rspec", "~> 2.3.0"
11
+ gem "yard", "~> 0.6.0"
12
+ gem "bundler", "~> 1.0.0"
13
+ gem "jeweler", "~> 1.5.2"
14
+ gem "rcov", ">= 0"
15
+ gem "vcr"
16
+ gem "webmock"
17
+ end
@@ -0,0 +1,45 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.2.3)
5
+ crack (0.1.8)
6
+ diff-lcs (1.1.2)
7
+ git (1.2.5)
8
+ hashie (0.4.0)
9
+ httparty (0.7.3)
10
+ crack (= 0.1.8)
11
+ jeweler (1.5.2)
12
+ bundler (~> 1.0.0)
13
+ git (>= 1.2.5)
14
+ rake
15
+ json (1.5.1)
16
+ rake (0.8.7)
17
+ rcov (0.9.9)
18
+ rspec (2.3.0)
19
+ rspec-core (~> 2.3.0)
20
+ rspec-expectations (~> 2.3.0)
21
+ rspec-mocks (~> 2.3.0)
22
+ rspec-core (2.3.1)
23
+ rspec-expectations (2.3.0)
24
+ diff-lcs (~> 1.1.2)
25
+ rspec-mocks (2.3.0)
26
+ vcr (1.5.1)
27
+ webmock (1.6.2)
28
+ addressable (>= 2.2.2)
29
+ crack (>= 0.1.7)
30
+ yard (0.6.4)
31
+
32
+ PLATFORMS
33
+ ruby
34
+
35
+ DEPENDENCIES
36
+ bundler (~> 1.0.0)
37
+ hashie
38
+ httparty
39
+ jeweler (~> 1.5.2)
40
+ json
41
+ rcov
42
+ rspec (~> 2.3.0)
43
+ vcr
44
+ webmock
45
+ yard (~> 0.6.0)
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Michael Klett
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ = zferral API Ruby Wrapper
2
+
3
+ Set your API credentials and obtain a Zferral instance
4
+
5
+ zferral = Zferral.new(:subdomain => "foo", :token => "bar")
6
+
7
+ Then work with your resources through the instance:
8
+
9
+ zferral.campaign.all
10
+ # => [<#Zferral::Campaign campaign_status_id=1, commission_approved_callback_url=nil, ...>, ...]
11
+
12
+ zferral.event.call(:campaign_id => 1, :revenue => 20.00, :affiliate_id => 300, :customer_id => "john@example.com")
13
+ # => <#Zferral::Event commission_sum=2>
14
+
15
+ == Contributing to zferral
16
+
17
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
18
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
19
+ * Fork the project
20
+ * Start a feature/bugfix branch
21
+ * Commit and push until you are happy with your contribution
22
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
23
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
24
+
25
+ == Copyright
26
+
27
+ Copyright (c) 2011 Michael Klett. See LICENSE.txt for
28
+ further details.
29
+
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "zferral"
16
+ gem.homepage = "http://github.com/grasshopperlabs/zferral"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{A Ruby wrapper for the Zferral API}
19
+ gem.description = %Q{A Ruby wrapper for the Zferral API, based on HTTParty.}
20
+ gem.email = "michael@webadvocate.com"
21
+ gem.authors = ["Michael Klett"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rspec/core'
30
+ require 'rspec/core/rake_task'
31
+ RSpec::Core::RakeTask.new(:spec) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ end
34
+
35
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
36
+ spec.pattern = 'spec/**/*_spec.rb'
37
+ spec.rcov = true
38
+ end
39
+
40
+ task :default => :spec
41
+
42
+ require 'yard'
43
+ YARD::Rake::YardocTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,22 @@
1
+ require "rubygems"
2
+ require 'httparty'
3
+ require 'json'
4
+ require 'hashie'
5
+
6
+ Dir[File.join(File.dirname(__FILE__), 'zferral', '**', '*.rb')].each {|f| require f}
7
+
8
+ module Zferral #:nodoc:
9
+ # Creates a new API {Zferral::Client} with the passed arguments.
10
+ #
11
+ # This is the preferred entry point for the library. In other words, create a client using
12
+ # this method and access all of the API resources from here.
13
+ #
14
+ # zferral = Zferral.new(:subdomain => 'sandbox', :api_token => 'c143c5450fb633c70c53b1bcc6348077')
15
+ # zferral.campaign.list
16
+ #
17
+ # @param (see Zferral::Client#initialize)
18
+ # @return (see Zferral::Client#initialize)
19
+ def self.new(*args)
20
+ Zferral::Client.new(*args)
21
+ end
22
+ end
@@ -0,0 +1,34 @@
1
+ module Zferral
2
+ # The Client holds the API credentials and orchestrates access to the Resources.
3
+ class Client
4
+ attr_accessor :subdomain
5
+ attr_accessor :api_token
6
+
7
+ # @param [Hash] options API credentials, passed as a hash with 'subdomain' and 'api_token' keys
8
+ def initialize(options = {})
9
+ self.subdomain = options[:subdomain] || options['subdomain']
10
+ self.api_token = options[:api_token] || options['api_token']
11
+ end
12
+
13
+ # A {Zferral::Campaign} class connected to this Client
14
+ #
15
+ # @return [Zferral::Campaign]
16
+ def campaign
17
+ Zferral::Campaign.connect(self)
18
+ end
19
+
20
+ # A {Zferral::Campaign} resource for this Client
21
+ #
22
+ # @return [Zferral::Campaign] {Zferral::Campaign} class
23
+ def campaign
24
+ Zferral::Campaign.connect(self)
25
+ end
26
+
27
+ # A {Zferral::Event} resource for this Client
28
+ #
29
+ # @return [Zferral::Event] {Zferral::Event} class
30
+ def event
31
+ Zferral::Event.connect(self)
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ module Zferral
2
+ # Raised when general resource errors are encountered.
3
+ class ResourceError < StandardError
4
+ end
5
+
6
+ # Raised when a fetch request for a particular ID results in no resource being found.
7
+ class ResourceNotFound < StandardError
8
+ end
9
+
10
+ # Raised when a particular Resource does not support the requested method
11
+ class MethodNotSupported < StandardError
12
+ end
13
+ end
@@ -0,0 +1,136 @@
1
+ module Zferral
2
+ # The "base" resource from which all of the Zferral API resources subclass. This class typically
3
+ # isn't used directly; instead, you'll use the subclasses like {Zferral::Campaign}.
4
+ class Resource < Hashie::Mash
5
+ include HTTParty
6
+ format :json
7
+ headers 'Content-Type' => 'application/json', 'Accept' => 'application/json'
8
+ debug_output $stdout
9
+
10
+ # Used to "connect" the resource to a Client already configured with credentials.
11
+ #
12
+ # Upon connection, the passed in Client is stored (see .client), the base_uri
13
+ # for HTTParty interaction is calculated, and the class is returned.
14
+ #
15
+ # @param [Client] client instance with credentials (subdomain and api_token attached)
16
+ #
17
+ # @return [Class]
18
+ def self.connect(client)
19
+ @@client = client
20
+ self.base_uri("https://#{subdomain}.zferral.com/api/#{api_token}")
21
+ self
22
+ end
23
+
24
+ # @return [String] The subdomain of the currently connected Client, or nil of no Client is connected.
25
+ def self.subdomain
26
+ @@client.subdomain if @@client
27
+ end
28
+
29
+ # @return [String] The API token of the currently connected Client, or nil of no Client is connected.
30
+ def self.api_token
31
+ @@client.api_token if @@client
32
+ end
33
+
34
+ # @return [String] The singular resource name (computed from the class name) to be used in resource URLs
35
+ def self.resource_name
36
+ name.split("::").last.downcase
37
+ end
38
+
39
+ # @return [String] The plural resource name (computed from the class name) to be used in resource URLs
40
+ def self.resource_names
41
+ name.split("::").last.downcase + "s"
42
+ end
43
+
44
+ # Get an array of all members of the resource list
45
+ #
46
+ # @return [Array] An array of the expected resource
47
+ def self.list
48
+ handle_list get("/#{resource_names}.json")["#{resource_names}"]
49
+ end
50
+
51
+ # Alias .all to .list
52
+ class << self
53
+ alias_method :all, :list
54
+ end
55
+
56
+ # Fetches a single resource by ID
57
+ #
58
+ # @return [Resource] A single Resource object, or one of its subclasses
59
+ #
60
+ # @raise [ResourceError, ResourceNotFound]
61
+ def self.fetch(id)
62
+ fetch_id(id)
63
+ handle_fetch get("/#{resource_name}/#{id}.json").parsed_response
64
+ end
65
+
66
+ # {Resource.find} can be used with syntax like ActiveRecord to fetch lists or single resources.
67
+ #
68
+ # To fetch a list, use the +:all+ parameter:
69
+ #
70
+ # Resource.find(:all)
71
+ #
72
+ # To fetch a single Resource, pass an Integer ID
73
+ #
74
+ # @param [Symbol, Integer] +:all+ to fetch a list, an Integer to fetch a single Resource
75
+ #
76
+ # @return [Array, Resource] An Array of Resources or a single Resource
77
+ #
78
+ # @raise (see .fetch)
79
+ def self.find(scope_or_id)
80
+ case scope_or_id
81
+ when Symbol
82
+ if scope_or_id == :all
83
+ list
84
+ end
85
+ when Integer, String
86
+ fetch(scope_or_id.to_i)
87
+ end
88
+ end
89
+
90
+ private
91
+
92
+ def self.client
93
+ @@client
94
+ end
95
+
96
+ def self.handle_list(list)
97
+ if list.is_a?(Array)
98
+ list.collect { |c| self.new(c) }
99
+ else
100
+ raise Zferral::ResourceError, "unexpected response while listing #{resource_names}: #{list.inspect[0..20]}"
101
+ end
102
+ end
103
+
104
+ def self.fetch_id(id=nil)
105
+ @fetch_id = id unless id.nil?
106
+ @fetch_id
107
+ end
108
+
109
+ def self.handle_fetch(response)
110
+ case response
111
+ when Hash
112
+ case response.keys.first
113
+ when resource_name
114
+ resource = self.new(response[resource_name])
115
+ if resource.respond_to?(:error)
116
+ raise Zferral::ResourceError, resource.error
117
+ end
118
+ resource
119
+ when 'error'
120
+ code = response['error']['code']
121
+ case code
122
+ when '404'
123
+ raise Zferral::ResourceNotFound, "#{resource_name} with id=#{fetch_id} was not found"
124
+ else
125
+ raise Zferral::ResourceError, "#{resource_name} caused a #{code} error"
126
+ end
127
+ else
128
+ raise Zferral::ResourceError, "unexpected response: #{resource.inspect}"
129
+ end
130
+ else
131
+ raise Zferral::ResourceError, "unexpected response: #{resource.inspect}"
132
+ end
133
+ end
134
+
135
+ end
136
+ end
@@ -0,0 +1,7 @@
1
+ module Zferral
2
+ # A Zferral Campaign resource, that behaves like a RESTful Resource
3
+ #
4
+ # http://zferral.com/api-docs/campaign
5
+ class Campaign < Resource
6
+ end
7
+ end
@@ -0,0 +1,33 @@
1
+ module Zferral
2
+ # A Zferral Event Resource
3
+ #
4
+ # http://zferral.com/api-docs/event
5
+ class Event < Resource
6
+ # The event/call API method, used to register an event (i.e. sale)
7
+ def self.call(params = {})
8
+ response = post("/event/call.json", :body => {:event => params}.to_json).parsed_response
9
+ handle_fetch response
10
+ end
11
+
12
+ # A special invocation of the event/call API method, used to register recurring revenue events.
13
+ #
14
+ # These calls add the +ignore_cookie+ flag, so that an affiliate ID or cookie is not needed.
15
+ # Instead, the affiliate to credit is identified by the +customer_id+ attribute, assuming that
16
+ # the +customer_id+ has been associated with the Affiliate already via a normal .call method
17
+ # or via the Zferral tracking code (img tag or javascript).
18
+ def self.call_recurring(params = {})
19
+ params.merge!(:ignore_cookie => '1')
20
+ call(params)
21
+ end
22
+
23
+ # Not supported by Event
24
+ def self.list
25
+ raise MethodNotSupported, "Event does not support the .list method"
26
+ end
27
+
28
+ # Not supported by Event
29
+ def self.fetch(id)
30
+ raise MethodNotSupported, "Event does not support the .fetch method"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Zferral::Campaign do
4
+ use_vcr_cassette "campaigns"
5
+
6
+ let(:campaign) { Zferral.new(:subdomain => subdomain, :api_token => api_token).campaign }
7
+
8
+ describe "#list" do
9
+ it "returns an array of your campaigns" do
10
+ campaign.list.should be_an_array_of_campaigns
11
+ end
12
+
13
+ it "is aliased by #all" do
14
+ campaign.all.should == campaign.list
15
+ end
16
+
17
+ it "is aliased by #find(:all)" do
18
+ campaign.find(:all).should == campaign.list
19
+ end
20
+ end
21
+
22
+ describe "#fetch" do
23
+ context "given a valid ID" do
24
+ it "fetches and returns the campaign" do
25
+ campaign.fetch(1).should be_a_campaign
26
+ end
27
+ end
28
+ context "given an invalid ID" do
29
+ it "raises a ResourceNotFound exception" do
30
+ lambda { campaign.fetch(9999999) }.should raise_error(Zferral::ResourceNotFound, "campaign with id=9999999 was not found")
31
+ end
32
+ end
33
+
34
+ it "is aliased by #find(id)" do
35
+ campaign.find(1).should == campaign.fetch(1)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,52 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Zferral::Event do
4
+ use_vcr_cassette "events", :match_requests_on => [:uri, :method, :body]
5
+
6
+ let(:event) { Zferral.new(:subdomain => subdomain, :api_token => api_token).event }
7
+
8
+ describe "#call" do
9
+ context "passing all required params, with debug" do
10
+ it "returns an event containing the commission_sum" do
11
+ resource = event.call(:debug => '1', :campaign_id => 1, :revenue => 20.00, :customer_id => "1", :affiliate_id => 538)
12
+ resource.should respond_to(:commission_sum)
13
+ end
14
+ end
15
+
16
+ context "with a missing campaign_id" do
17
+ it "raises a ResourceError with the error displayed" do
18
+ lambda {
19
+ event.call(:debug => '1', :revenue => 20.00, :customer_id => "1", :affiliate_id => 538)
20
+ }.should raise_error(Zferral::ResourceError, "Campaign ID is not set.")
21
+ end
22
+ end
23
+
24
+ context "with none of the required parameters" do
25
+ it "raises a ResourceError with the first encountered error displayed" do
26
+ lambda {
27
+ event.call(:debug => '1')
28
+ }.should raise_error(Zferral::ResourceError, "Campaign ID is not set.")
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "#call_recurring" do
34
+ it "invokes call after merging the option to ignore the cookie" do
35
+ hash = {:debug => '1', :campaign_id => 1, :revenue => 20.00, :customer_id => "1", :affiliate_id => 538}
36
+ event.should_receive(:call).with(hash.merge(:ignore_cookie => '1'))
37
+ event.call_recurring(hash)
38
+ end
39
+
40
+ it "posts the event successfully without passing an affiliate id if the customer_id is previously 'registered'" do
41
+ resource = event.call_recurring(:debug => '1', :campaign_id => 1, :revenue => 20.00, :customer_id => "1")
42
+ resource.should respond_to(:commission_sum)
43
+ end
44
+
45
+ it "posts the event unsuccessfully without passing an affiliate id if the customer_id is not previously 'registered'" do
46
+ lambda {
47
+ event.call_recurring(:debug => '1', :campaign_id => 1, :revenue => 20.00, :customer_id => "foobarjones")
48
+ }.should raise_error(Zferral::ResourceError, "Neither cookie found nor referer set.")
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'vcr'
5
+ require 'webmock/rspec'
6
+ require 'zferral'
7
+
8
+ # Requires supporting files with custom matchers and macros, etc,
9
+ # in ./support/ and its subdirectories.
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
+
12
+ RSpec.configure do |config|
13
+ config.extend VCR::RSpec::Macros
14
+ end
15
+
16
+ VCR.config do |c|
17
+ c.cassette_library_dir = 'spec/vcr_cassettes'
18
+ c.stub_with :webmock
19
+ c.default_cassette_options = { :record => :new_episodes }
20
+ end
21
+
22
+ def test_credentials
23
+ @test_credentials ||= {'subdomain' => subdomain, 'api_token' => api_token}
24
+ end
25
+
26
+ def subdomain
27
+ 'sandbox'
28
+ end
29
+
30
+ def api_token
31
+ 'c143c5450fb633c70c53b1bcc6348077'
32
+ end
33
+
@@ -0,0 +1,29 @@
1
+ RSpec::Matchers.define :be_an_array_of_campaigns do
2
+ match do |actual|
3
+ actual.is_a?(Array) && actual.first.is_a?(Hashie::Mash) && actual.first.respond_to?(:campaign_status_id)
4
+ end
5
+
6
+ failure_message_for_should do |actual|
7
+ "expected an array of Campaigns, got #{actual.inspect}"
8
+ end
9
+
10
+ failure_message_for_should_not do |actual|
11
+ "expected to not receive an array of Campaigns, got #{actual.inspect}"
12
+ end
13
+ end
14
+
15
+ RSpec::Matchers.define :be_a_campaign do
16
+ match do |actual|
17
+ actual.is_a?(Hashie::Mash) && actual.respond_to?(:campaign_status_id)
18
+ end
19
+
20
+ failure_message_for_should do |actual|
21
+ "expected a Campaign, got #{actual.inspect}"
22
+ end
23
+
24
+ failure_message_for_should_not do |actual|
25
+ "expected not a Campaign, got #{actual.inspect}"
26
+ end
27
+ end
28
+
29
+
@@ -0,0 +1,119 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :get
5
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/campaigns.json
6
+ body:
7
+ headers:
8
+ accept:
9
+ - application/json
10
+ content-type:
11
+ - application/json
12
+ response: !ruby/struct:VCR::Response
13
+ status: !ruby/struct:VCR::ResponseStatus
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ x-powered-by:
18
+ - PHP/5.2.17-0.dotdeb.0
19
+ content-type:
20
+ - application/json; charset=utf-8
21
+ server:
22
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
23
+ date:
24
+ - Thu, 27 Jan 2011 19:11:17 GMT
25
+ content-length:
26
+ - "847"
27
+ set-cookie:
28
+ - zferral=34cb69dbc3ea8dcee785cda0cc18e31e; path=/
29
+ body: "{\"campaigns\":[{\"id\":1,\"commission_type_id\":2,\"campaign_status_id\":1,\"event_id\":2,\"reward_points_type_id\":null,\"is_monetary\":true,\"is_private\":false,\"name\":\"Sample Revenue Share\",\"date_start\":\"2010-08-25\",\"date_end\":\"9999-12-01\",\"has_tiered_commission\":false,\"has_stepped_commission\":false,\"initial_commission\":\"10.00\",\"recurring_commission\":null,\"has_recurring_limited_by_renewals\":false,\"renewals_number\":null,\"has_recurring_limited_by_period\":false,\"recurring_end_date\":null,\"recurring_period_in_days\":null,\"has_simple_recurring_commissions\":false,\"has_auto_approval_commission\":true,\"commission_approved_callback_url\":null,\"description\":\"Refer a new customer, receive 10% of the revenue generated, for life.\",\"cookie_expire\":\"2010-11-25 00:00:00\",\"created_at\":\"2010-08-25 12:49:06\",\"landing_page_url\":\"http:\\/\\/zferral.com\",\"deleted_at\":null}]}"
30
+ http_version: "1.1"
31
+ - !ruby/struct:VCR::HTTPInteraction
32
+ request: !ruby/struct:VCR::Request
33
+ method: :get
34
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/campaign/1.json
35
+ body:
36
+ headers:
37
+ accept:
38
+ - application/json
39
+ content-type:
40
+ - application/json
41
+ response: !ruby/struct:VCR::Response
42
+ status: !ruby/struct:VCR::ResponseStatus
43
+ code: 200
44
+ message: OK
45
+ headers:
46
+ x-powered-by:
47
+ - PHP/5.2.17-0.dotdeb.0
48
+ content-type:
49
+ - application/json; charset=utf-8
50
+ date:
51
+ - Thu, 27 Jan 2011 19:11:18 GMT
52
+ server:
53
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
54
+ content-length:
55
+ - "844"
56
+ set-cookie:
57
+ - zferral=58c023f43ec7907beca9357e31b7ea5f; path=/
58
+ body: "{\"campaign\":{\"id\":1,\"commission_type_id\":2,\"campaign_status_id\":1,\"event_id\":2,\"reward_points_type_id\":null,\"is_monetary\":true,\"is_private\":false,\"name\":\"Sample Revenue Share\",\"date_start\":\"2010-08-25\",\"date_end\":\"9999-12-01\",\"has_tiered_commission\":false,\"has_stepped_commission\":false,\"initial_commission\":\"10.00\",\"recurring_commission\":null,\"has_recurring_limited_by_renewals\":false,\"renewals_number\":null,\"has_recurring_limited_by_period\":false,\"recurring_end_date\":null,\"recurring_period_in_days\":null,\"has_simple_recurring_commissions\":false,\"has_auto_approval_commission\":true,\"commission_approved_callback_url\":null,\"description\":\"Refer a new customer, receive 10% of the revenue generated, for life.\",\"cookie_expire\":\"2010-11-25 00:00:00\",\"created_at\":\"2010-08-25 12:49:06\",\"landing_page_url\":\"http:\\/\\/zferral.com\",\"deleted_at\":null}}"
59
+ http_version: "1.1"
60
+ - !ruby/struct:VCR::HTTPInteraction
61
+ request: !ruby/struct:VCR::Request
62
+ method: :get
63
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/campaign/1.json
64
+ body:
65
+ headers:
66
+ accept:
67
+ - application/json
68
+ content-type:
69
+ - application/json
70
+ response: !ruby/struct:VCR::Response
71
+ status: !ruby/struct:VCR::ResponseStatus
72
+ code: 200
73
+ message: OK
74
+ headers:
75
+ x-powered-by:
76
+ - PHP/5.2.17-0.dotdeb.0
77
+ content-type:
78
+ - application/json; charset=utf-8
79
+ date:
80
+ - Thu, 27 Jan 2011 19:11:18 GMT
81
+ server:
82
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
83
+ content-length:
84
+ - "844"
85
+ set-cookie:
86
+ - zferral=eca13fe9ab58c58ac2298a5bfbe56ce4; path=/
87
+ body: "{\"campaign\":{\"id\":1,\"commission_type_id\":2,\"campaign_status_id\":1,\"event_id\":2,\"reward_points_type_id\":null,\"is_monetary\":true,\"is_private\":false,\"name\":\"Sample Revenue Share\",\"date_start\":\"2010-08-25\",\"date_end\":\"9999-12-01\",\"has_tiered_commission\":false,\"has_stepped_commission\":false,\"initial_commission\":\"10.00\",\"recurring_commission\":null,\"has_recurring_limited_by_renewals\":false,\"renewals_number\":null,\"has_recurring_limited_by_period\":false,\"recurring_end_date\":null,\"recurring_period_in_days\":null,\"has_simple_recurring_commissions\":false,\"has_auto_approval_commission\":true,\"commission_approved_callback_url\":null,\"description\":\"Refer a new customer, receive 10% of the revenue generated, for life.\",\"cookie_expire\":\"2010-11-25 00:00:00\",\"created_at\":\"2010-08-25 12:49:06\",\"landing_page_url\":\"http:\\/\\/zferral.com\",\"deleted_at\":null}}"
88
+ http_version: "1.1"
89
+ - !ruby/struct:VCR::HTTPInteraction
90
+ request: !ruby/struct:VCR::Request
91
+ method: :get
92
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/campaign/9999999.json
93
+ body:
94
+ headers:
95
+ accept:
96
+ - application/json
97
+ content-type:
98
+ - application/json
99
+ response: !ruby/struct:VCR::Response
100
+ status: !ruby/struct:VCR::ResponseStatus
101
+ code: 404
102
+ message: Not Found
103
+ headers:
104
+ x-powered-by:
105
+ - PHP/5.2.17-0.dotdeb.0
106
+ content-type:
107
+ - application/json; charset=utf-8
108
+ server:
109
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
110
+ date:
111
+ - Thu, 27 Jan 2011 19:11:19 GMT
112
+ content-length:
113
+ - "46"
114
+ set-cookie:
115
+ - zferral=3c862251ddc530dd6eada7f3e1d493a4; path=/
116
+ status:
117
+ - 404 Not Found
118
+ body: "{\"error\":{\"code\":\"404\",\"message\":\"Not Found\"}}"
119
+ http_version: "1.1"
@@ -0,0 +1,207 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/event/call.json
6
+ body: "{\"event\":{\"debug\":\"1\",\"campaign_id\":1,\"revenue\":20.0,\"customer_id\":\"1\",\"affiliate_id\":538}}"
7
+ headers:
8
+ accept:
9
+ - application/json
10
+ content-type:
11
+ - application/json
12
+ response: !ruby/struct:VCR::Response
13
+ status: !ruby/struct:VCR::ResponseStatus
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ x-powered-by:
18
+ - PHP/5.2.17-0.dotdeb.0
19
+ content-type:
20
+ - application/json; charset=utf-8
21
+ server:
22
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
23
+ date:
24
+ - Thu, 27 Jan 2011 19:11:21 GMT
25
+ content-length:
26
+ - "30"
27
+ set-cookie:
28
+ - cuid=8295b918f98f70f8d09511d9044ea543; expires=Wed, 01-Jan-2020 05:00:00 GMT; path=/; domain=sandbox.zferral.com
29
+ - zferral=8a0518ef003e7f83628a6c8d61b193c6; path=/
30
+ body: "{\"event\":{\"commission_sum\":2}}"
31
+ http_version: "1.1"
32
+ - !ruby/struct:VCR::HTTPInteraction
33
+ request: !ruby/struct:VCR::Request
34
+ method: :post
35
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/event/call.json
36
+ body: "{\"event\":{\"debug\":\"1\",\"revenue\":20.0,\"customer_id\":\"1\",\"affiliate_id\":538}}"
37
+ headers:
38
+ accept:
39
+ - application/json
40
+ content-type:
41
+ - application/json
42
+ response: !ruby/struct:VCR::Response
43
+ status: !ruby/struct:VCR::ResponseStatus
44
+ code: 200
45
+ message: OK
46
+ headers:
47
+ x-powered-by:
48
+ - PHP/5.2.17-0.dotdeb.0
49
+ content-type:
50
+ - application/json; charset=utf-8
51
+ date:
52
+ - Thu, 27 Jan 2011 19:11:22 GMT
53
+ server:
54
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
55
+ content-length:
56
+ - "45"
57
+ set-cookie:
58
+ - zferral=ff098b069200835b71e4c38c5d203ef6; path=/
59
+ body: "{\"event\":{\"error\":\"Campaign ID is not set.\"}}"
60
+ http_version: "1.1"
61
+ - !ruby/struct:VCR::HTTPInteraction
62
+ request: !ruby/struct:VCR::Request
63
+ method: :post
64
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/event/call.json
65
+ body: "{\"event\":{\"debug\":\"1\"}}"
66
+ headers:
67
+ accept:
68
+ - application/json
69
+ content-type:
70
+ - application/json
71
+ response: !ruby/struct:VCR::Response
72
+ status: !ruby/struct:VCR::ResponseStatus
73
+ code: 200
74
+ message: OK
75
+ headers:
76
+ x-powered-by:
77
+ - PHP/5.2.17-0.dotdeb.0
78
+ content-type:
79
+ - application/json; charset=utf-8
80
+ server:
81
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
82
+ date:
83
+ - Thu, 27 Jan 2011 19:11:23 GMT
84
+ content-length:
85
+ - "45"
86
+ set-cookie:
87
+ - zferral=e1f89862984eebf98420674e6c5dab82; path=/
88
+ body: "{\"event\":{\"error\":\"Campaign ID is not set.\"}}"
89
+ http_version: "1.1"
90
+ - !ruby/struct:VCR::HTTPInteraction
91
+ request: !ruby/struct:VCR::Request
92
+ method: :post
93
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/event/call.json
94
+ body: "{\"event\":{\"debug\":\"1\",\"campaign_id\":1,\"ignore_cookie\":\"1\",\"revenue\":20.0,\"customer_id\":\"1\"}}"
95
+ headers:
96
+ accept:
97
+ - application/json
98
+ content-type:
99
+ - application/json
100
+ response: !ruby/struct:VCR::Response
101
+ status: !ruby/struct:VCR::ResponseStatus
102
+ code: 200
103
+ message: OK
104
+ headers:
105
+ x-powered-by:
106
+ - PHP/5.2.17-0.dotdeb.0
107
+ content-type:
108
+ - application/json; charset=utf-8
109
+ date:
110
+ - Thu, 27 Jan 2011 19:11:24 GMT
111
+ server:
112
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
113
+ content-length:
114
+ - "30"
115
+ set-cookie:
116
+ - cuid=8295b918f98f70f8d09511d9044ea543; expires=Wed, 01-Jan-2020 05:00:00 GMT; path=/; domain=sandbox.zferral.com
117
+ - zferral=239337692a5ea21deb195c8be0a6c1cf; path=/
118
+ body: "{\"event\":{\"commission_sum\":2}}"
119
+ http_version: "1.1"
120
+ - !ruby/struct:VCR::HTTPInteraction
121
+ request: !ruby/struct:VCR::Request
122
+ method: :post
123
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/event/call.json
124
+ body: "{\"event\":{\"debug\":\"1\",\"campaign_id\":1,\"ignore_cookie\":\"1\",\"revenue\":20.0,\"customer_id\":\"foobarjones\"}}"
125
+ headers:
126
+ accept:
127
+ - application/json
128
+ content-type:
129
+ - application/json
130
+ response: !ruby/struct:VCR::Response
131
+ status: !ruby/struct:VCR::ResponseStatus
132
+ code: 200
133
+ message: OK
134
+ headers:
135
+ x-powered-by:
136
+ - PHP/5.2.17-0.dotdeb.0
137
+ content-type:
138
+ - application/json; charset=utf-8
139
+ server:
140
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
141
+ date:
142
+ - Thu, 27 Jan 2011 19:11:25 GMT
143
+ content-length:
144
+ - "59"
145
+ set-cookie:
146
+ - zferral=aea87a857d0d423d913c442d74935ede; path=/
147
+ body: "{\"event\":{\"error\":\"Neither cookie found nor referer set.\"}}"
148
+ http_version: "1.1"
149
+ - !ruby/struct:VCR::HTTPInteraction
150
+ request: !ruby/struct:VCR::Request
151
+ method: :post
152
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/event/call.json
153
+ body: "{\"event\":{\"affiliate_id\":538,\"debug\":\"1\",\"campaign_id\":1,\"revenue\":20.0,\"customer_id\":\"1\"}}"
154
+ headers:
155
+ accept:
156
+ - application/json
157
+ content-type:
158
+ - application/json
159
+ response: !ruby/struct:VCR::Response
160
+ status: !ruby/struct:VCR::ResponseStatus
161
+ code: 200
162
+ message: OK
163
+ headers:
164
+ x-powered-by:
165
+ - PHP/5.2.17-0.dotdeb.0
166
+ content-type:
167
+ - application/json; charset=utf-8
168
+ date:
169
+ - Thu, 27 Jan 2011 19:47:20 GMT
170
+ server:
171
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
172
+ content-length:
173
+ - "30"
174
+ set-cookie:
175
+ - cuid=8295b918f98f70f8d09511d9044ea543; expires=Wed, 01-Jan-2020 05:00:00 GMT; path=/; domain=sandbox.zferral.com
176
+ - zferral=5567f5f61c1d97bae1435e22f80e8d3a; path=/
177
+ body: "{\"event\":{\"commission_sum\":2}}"
178
+ http_version: "1.1"
179
+ - !ruby/struct:VCR::HTTPInteraction
180
+ request: !ruby/struct:VCR::Request
181
+ method: :post
182
+ uri: https://sandbox.zferral.com:443/api/c143c5450fb633c70c53b1bcc6348077/event/call.json
183
+ body: "{\"event\":{\"affiliate_id\":538,\"debug\":\"1\",\"revenue\":20.0,\"customer_id\":\"1\"}}"
184
+ headers:
185
+ accept:
186
+ - application/json
187
+ content-type:
188
+ - application/json
189
+ response: !ruby/struct:VCR::Response
190
+ status: !ruby/struct:VCR::ResponseStatus
191
+ code: 200
192
+ message: OK
193
+ headers:
194
+ x-powered-by:
195
+ - PHP/5.2.17-0.dotdeb.0
196
+ content-type:
197
+ - application/json; charset=utf-8
198
+ server:
199
+ - Apache/2.2.9 (Debian) PHP/5.2.17-0.dotdeb.0 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
200
+ date:
201
+ - Thu, 27 Jan 2011 19:47:21 GMT
202
+ content-length:
203
+ - "45"
204
+ set-cookie:
205
+ - zferral=9a1d9025277bff7468e148f7b8d673e6; path=/
206
+ body: "{\"event\":{\"error\":\"Campaign ID is not set.\"}}"
207
+ http_version: "1.1"
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Zferral" do
4
+ describe ".new" do
5
+ it "creates a new instance of Zferral::Client" do
6
+ Zferral.new.should be_a(Zferral::Client)
7
+ end
8
+ end
9
+
10
+ describe "#campaign" do
11
+ it "provides access to the Campaign class with a linkage to the client" do
12
+ zferral = Zferral.new(:subdomain => subdomain, :api_token => api_token)
13
+ zferral.campaign.should == Zferral::Campaign
14
+ zferral.campaign.client.should == zferral
15
+ end
16
+ end
17
+
18
+ describe "#event" do
19
+ it "provides access to the Event class with a linkage to the client" do
20
+ zferral = Zferral.new(:subdomain => subdomain, :api_token => api_token)
21
+ zferral.event.should == Zferral::Event
22
+ zferral.event.client.should == zferral
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,96 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{zferral}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Michael Klett"]
12
+ s.date = %q{2011-01-27}
13
+ s.description = %q{A Ruby wrapper for the Zferral API, based on HTTParty.}
14
+ s.email = %q{michael@webadvocate.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "LICENSE.txt",
25
+ "README.rdoc",
26
+ "Rakefile",
27
+ "VERSION",
28
+ "lib/zferral.rb",
29
+ "lib/zferral/client.rb",
30
+ "lib/zferral/errors.rb",
31
+ "lib/zferral/resource.rb",
32
+ "lib/zferral/resources/campaign.rb",
33
+ "lib/zferral/resources/event.rb",
34
+ "spec/campaign_spec.rb",
35
+ "spec/event_spec.rb",
36
+ "spec/spec_helper.rb",
37
+ "spec/support/matchers/be.rb",
38
+ "spec/vcr_cassettes/campaigns.yml",
39
+ "spec/vcr_cassettes/events.yml",
40
+ "spec/zferral_spec.rb",
41
+ "zferral.gemspec"
42
+ ]
43
+ s.homepage = %q{http://github.com/grasshopperlabs/zferral}
44
+ s.licenses = ["MIT"]
45
+ s.require_paths = ["lib"]
46
+ s.rubygems_version = %q{1.3.7}
47
+ s.summary = %q{A Ruby wrapper for the Zferral API}
48
+ s.test_files = [
49
+ "spec/campaign_spec.rb",
50
+ "spec/event_spec.rb",
51
+ "spec/spec_helper.rb",
52
+ "spec/support/matchers/be.rb",
53
+ "spec/zferral_spec.rb"
54
+ ]
55
+
56
+ if s.respond_to? :specification_version then
57
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
58
+ s.specification_version = 3
59
+
60
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
62
+ s.add_runtime_dependency(%q<json>, [">= 0"])
63
+ s.add_runtime_dependency(%q<hashie>, [">= 0"])
64
+ s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
65
+ s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
66
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
67
+ s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
68
+ s.add_development_dependency(%q<rcov>, [">= 0"])
69
+ s.add_development_dependency(%q<vcr>, [">= 0"])
70
+ s.add_development_dependency(%q<webmock>, [">= 0"])
71
+ else
72
+ s.add_dependency(%q<httparty>, [">= 0"])
73
+ s.add_dependency(%q<json>, [">= 0"])
74
+ s.add_dependency(%q<hashie>, [">= 0"])
75
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
76
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
77
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
78
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
79
+ s.add_dependency(%q<rcov>, [">= 0"])
80
+ s.add_dependency(%q<vcr>, [">= 0"])
81
+ s.add_dependency(%q<webmock>, [">= 0"])
82
+ end
83
+ else
84
+ s.add_dependency(%q<httparty>, [">= 0"])
85
+ s.add_dependency(%q<json>, [">= 0"])
86
+ s.add_dependency(%q<hashie>, [">= 0"])
87
+ s.add_dependency(%q<rspec>, ["~> 2.3.0"])
88
+ s.add_dependency(%q<yard>, ["~> 0.6.0"])
89
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
90
+ s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
91
+ s.add_dependency(%q<rcov>, [">= 0"])
92
+ s.add_dependency(%q<vcr>, [">= 0"])
93
+ s.add_dependency(%q<webmock>, [">= 0"])
94
+ end
95
+ end
96
+
metadata ADDED
@@ -0,0 +1,240 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zferral
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
+ platform: ruby
12
+ authors:
13
+ - Michael Klett
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-01-27 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ type: :runtime
24
+ name: httparty
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ requirement: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ prerelease: false
37
+ type: :runtime
38
+ name: json
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ requirement: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ prerelease: false
51
+ type: :runtime
52
+ name: hashie
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
62
+ requirement: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ prerelease: false
65
+ type: :development
66
+ name: rspec
67
+ version_requirements: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ~>
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 2
75
+ - 3
76
+ - 0
77
+ version: 2.3.0
78
+ requirement: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ prerelease: false
81
+ type: :development
82
+ name: yard
83
+ version_requirements: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ hash: 7
89
+ segments:
90
+ - 0
91
+ - 6
92
+ - 0
93
+ version: 0.6.0
94
+ requirement: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ prerelease: false
97
+ type: :development
98
+ name: bundler
99
+ version_requirements: &id006 !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ~>
103
+ - !ruby/object:Gem::Version
104
+ hash: 23
105
+ segments:
106
+ - 1
107
+ - 0
108
+ - 0
109
+ version: 1.0.0
110
+ requirement: *id006
111
+ - !ruby/object:Gem::Dependency
112
+ prerelease: false
113
+ type: :development
114
+ name: jeweler
115
+ version_requirements: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ hash: 7
121
+ segments:
122
+ - 1
123
+ - 5
124
+ - 2
125
+ version: 1.5.2
126
+ requirement: *id007
127
+ - !ruby/object:Gem::Dependency
128
+ prerelease: false
129
+ type: :development
130
+ name: rcov
131
+ version_requirements: &id008 !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ hash: 3
137
+ segments:
138
+ - 0
139
+ version: "0"
140
+ requirement: *id008
141
+ - !ruby/object:Gem::Dependency
142
+ prerelease: false
143
+ type: :development
144
+ name: vcr
145
+ version_requirements: &id009 !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ hash: 3
151
+ segments:
152
+ - 0
153
+ version: "0"
154
+ requirement: *id009
155
+ - !ruby/object:Gem::Dependency
156
+ prerelease: false
157
+ type: :development
158
+ name: webmock
159
+ version_requirements: &id010 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ hash: 3
165
+ segments:
166
+ - 0
167
+ version: "0"
168
+ requirement: *id010
169
+ description: A Ruby wrapper for the Zferral API, based on HTTParty.
170
+ email: michael@webadvocate.com
171
+ executables: []
172
+
173
+ extensions: []
174
+
175
+ extra_rdoc_files:
176
+ - LICENSE.txt
177
+ - README.rdoc
178
+ files:
179
+ - .document
180
+ - .rspec
181
+ - Gemfile
182
+ - Gemfile.lock
183
+ - LICENSE.txt
184
+ - README.rdoc
185
+ - Rakefile
186
+ - VERSION
187
+ - lib/zferral.rb
188
+ - lib/zferral/client.rb
189
+ - lib/zferral/errors.rb
190
+ - lib/zferral/resource.rb
191
+ - lib/zferral/resources/campaign.rb
192
+ - lib/zferral/resources/event.rb
193
+ - spec/campaign_spec.rb
194
+ - spec/event_spec.rb
195
+ - spec/spec_helper.rb
196
+ - spec/support/matchers/be.rb
197
+ - spec/vcr_cassettes/campaigns.yml
198
+ - spec/vcr_cassettes/events.yml
199
+ - spec/zferral_spec.rb
200
+ - zferral.gemspec
201
+ has_rdoc: true
202
+ homepage: http://github.com/grasshopperlabs/zferral
203
+ licenses:
204
+ - MIT
205
+ post_install_message:
206
+ rdoc_options: []
207
+
208
+ require_paths:
209
+ - lib
210
+ required_ruby_version: !ruby/object:Gem::Requirement
211
+ none: false
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ hash: 3
216
+ segments:
217
+ - 0
218
+ version: "0"
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
220
+ none: false
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ hash: 3
225
+ segments:
226
+ - 0
227
+ version: "0"
228
+ requirements: []
229
+
230
+ rubyforge_project:
231
+ rubygems_version: 1.3.7
232
+ signing_key:
233
+ specification_version: 3
234
+ summary: A Ruby wrapper for the Zferral API
235
+ test_files:
236
+ - spec/campaign_spec.rb
237
+ - spec/event_spec.rb
238
+ - spec/spec_helper.rb
239
+ - spec/support/matchers/be.rb
240
+ - spec/zferral_spec.rb