icontact-api 0.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ gem 'json'
2
+
3
+ group :development do
4
+ gem 'bundler', '~> 1.0'
5
+ gem 'jeweler'
6
+ end
7
+
data/History.txt CHANGED
@@ -1,8 +1,4 @@
1
- == 0.2 2009-07-20
2
- * Modify authorization code to utilize new https based method
3
-
4
- == 0.1 2009-01-16
1
+ == 0.0.1 2009-01-16
5
2
 
6
3
  * 1 major enhancement:
7
4
  * Initial release
8
-
@@ -39,11 +39,13 @@ class BetaApi < Icontact::Api
39
39
  API_USERNAME='username'
40
40
  API_PASSWORD='password'
41
41
  API_KEY = 'YOUR_API_KEY'
42
+ API_SECRET = 'YOUR_API_SECRET'
42
43
  DOMAIN = "http://app.beta.icontact.com/icp"
43
44
 
44
45
  def initialize(username = BetaApi::API_USERNAME, password = BetaApi::API_PASSWORD)
45
46
  super(username, password)
46
- self.app_id = API_KEY
47
+ self.key = API_KEY
48
+ self.secret = API_SECRET
47
49
  self.domain = DOMAIN
48
50
  end
49
51
  end
data/Rakefile CHANGED
@@ -1,29 +1,17 @@
1
- %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
1
+ %w[rubygems rake rake/clean].each { |f| require f }
2
2
  require File.dirname(__FILE__) + '/lib/icontact-api'
3
- require 'hoe'
4
3
 
5
- # Generate all the Rake tasks
6
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
7
- $hoe = Hoe.spec 'icontact-api' do |p|
8
- p.version = Icontact::Api::VERSION
9
- p.developer('Kevin Olbrich', 'kevin.olbrich@gmail.com')
10
- p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
11
- p.rubyforge_name = p.name # TODO this is default value
12
- p.extra_deps = [
13
- ['json','>= 1.1.3'],
14
- ]
15
- p.extra_dev_deps = [
16
- ['newgem', ">= #{::Newgem::VERSION}"]
17
- ]
18
-
19
- p.clean_globs |= %w[**/.DS_Store tmp *.log]
20
- path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
21
- p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
22
- p.rsync_args = '-av --delete --ignore-errors'
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "icontact-api"
8
+ gem.summary = %Q{A thin wrapper around the iContact API}
9
+ gem.authors = ["Kevin Olbrich"]
10
+ gem.email = ["kevin.olbrich+icontact-api@gmail.com"]
11
+ gem.homepage = "http://github.com/olbrich/IContact-API"
12
+ end
13
+ Jeweler::GemcutterTasks.new
14
+ rescue LoadError
15
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
16
  end
24
17
 
25
- require 'newgem/tasks' # load /tasks/*.rake
26
- Dir['tasks/**/*.rake'].each { |t| load t }
27
-
28
- # TODO - want other tests/tasks run by default? Add them to the list
29
- # task :default => [:spec, :features]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.3.0
data/lib/icontact-api.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
- require 'icontact/api'
4
+ require 'icontact/api'
data/lib/icontact/api.rb CHANGED
@@ -1,24 +1,25 @@
1
- require 'rubygems'
2
1
  require 'net/http'
3
2
  require 'net/https'
4
3
  require 'json'
5
4
 
6
5
  class Icontact
7
6
  class Api
8
- VERSION = "0.2"
9
- API_VERSION = "2.0"
10
- DOMAIN = 'https://app.icontact.com/icp'
7
+ VERSION = "0.3"
8
+ API_VERSION = "2.2"
9
+ URL = 'https://app.icontact.com/icp'
11
10
  API_KEY = "API_KEY"
12
11
  attr_accessor :username
13
12
  attr_accessor :password
14
13
  attr_accessor :app_id
15
- attr_accessor :domain
14
+ attr_accessor :url
15
+ attr_accessor :api_version
16
16
 
17
- def initialize(username, password)
17
+ def initialize(username=nil, password=nil)
18
18
  self.username = username
19
19
  self.password = password
20
- self.domain = DOMAIN
20
+ self.url = URL
21
21
  self.app_id = API_KEY
22
+ self.api_version = API_VERSION
22
23
  end
23
24
 
24
25
  # Package up any options into a query string and format it properly for the server
@@ -54,7 +55,7 @@ class Icontact
54
55
  # data exchange. Also accepts text/xml for either, but then you have to deal with XML encoding and decoding
55
56
  # manually
56
57
  def apply_headers(req)
57
- req.add_field('API-Version', API_VERSION)
58
+ req.add_field('API-Version', self.api_version)
58
59
  req.add_field('accept','application/json')
59
60
  req.add_field('Content-Type','application/json')
60
61
  req.add_field('API-Appid', self.app_id)
@@ -82,7 +83,7 @@ class Icontact
82
83
  # options passed as optional parameter show up as an array
83
84
  options = options.first if options.kind_of? Array
84
85
  query_options = self.class.package_query_params(options)
85
- full_url = URI.parse("#{self.domain}#{url}#{query_options}")
86
+ full_url = URI.parse("#{self.url}#{url}#{query_options}")
86
87
 
87
88
  # create an object of the class required to process this method
88
89
  klass = Object.module_eval("::Net::HTTP::#{kind.to_s.capitalize}", __FILE__, __LINE__)
@@ -93,6 +94,7 @@ class Icontact
93
94
 
94
95
  http = Net::HTTP.new(full_url.host, full_url.port)
95
96
  http.use_ssl = true
97
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
96
98
  response = http.start do |web|
97
99
  web.request(request)
98
100
  end
data/spec/api_spec.rb CHANGED
@@ -1,16 +1,21 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper.rb'
2
2
 
3
3
  describe Icontact::Api do
4
+ before(:each) do
5
+ @mock_time = mock('Time', :getgm => 999999)
6
+ Time.stub!(:now).and_return(@mock_time)
7
+ Kernel.stub!(:rand).and_return(111)
8
+ end
9
+
4
10
  describe "api" do
5
11
  before(:each) do
6
12
  @api = Icontact::Api.new('mock_username', 'mock_password')
7
13
  @response = mock('response',:code=>200, :body=>"body")
8
-
9
- @mock_http_session = mock('http_session', :start=>@response, :use_ssl= => true)
10
- Net::HTTP.stub!(:new).and_return(@mock_http_session)
14
+ @mock_http_request = mock('http', :request=>@response)
15
+ Net::HTTP.stub!(:start).and_yield(@mock_http_request)
11
16
  end
12
17
 
13
- describe "an https request", :shared=>true do
18
+ describe "an http request", :shared=>true do
14
19
  it "should apply headers to the request" do
15
20
  @mock_request = mock("Request", :body= => true)
16
21
  @api.should_receive(:apply_headers).and_return(@mock_request)
@@ -22,13 +27,8 @@ describe Icontact::Api do
22
27
  do_request(:limit=>10)
23
28
  end
24
29
 
25
- it "should use ssl" do
26
- @mock_http_session.should_receive(:use_ssl=).with(true)
27
- do_request
28
- end
29
-
30
30
  it "should send the request" do
31
- @mock_http_session.should_receive(:start)
31
+ Net::HTTP.should_receive(:start)
32
32
  do_request
33
33
  end
34
34
 
@@ -38,8 +38,8 @@ describe Icontact::Api do
38
38
  end
39
39
  end
40
40
 
41
- describe "an https request with a body", :shared=>true do
42
- it_should_behave_like "an https request"
41
+ describe "an http request with a body", :shared=>true do
42
+ it_should_behave_like "an http request"
43
43
 
44
44
  it "should package the data into the body" do
45
45
  @api.class.should_receive(:body_encoder)
@@ -53,7 +53,7 @@ describe Icontact::Api do
53
53
  @api.get("/a", options)
54
54
  end
55
55
 
56
- it_should_behave_like "an https request"
56
+ it_should_behave_like "an http request"
57
57
  end
58
58
 
59
59
  describe ".post" do
@@ -61,7 +61,7 @@ describe Icontact::Api do
61
61
  @api.post("/a", {}, options)
62
62
  end
63
63
 
64
- it_should_behave_like "an https request with a body"
64
+ it_should_behave_like "an http request with a body"
65
65
  end
66
66
 
67
67
  describe ".put" do
@@ -69,7 +69,7 @@ describe Icontact::Api do
69
69
  @api.put("/a", {}, options)
70
70
  end
71
71
 
72
- it_should_behave_like "an https request with a body"
72
+ it_should_behave_like "an http request with a body"
73
73
  end
74
74
 
75
75
  describe '.delete' do
@@ -77,10 +77,25 @@ describe Icontact::Api do
77
77
  @api.delete("/a", options)
78
78
  end
79
79
 
80
- it_should_behave_like "an https request"
80
+ it_should_behave_like "an http request"
81
81
  end
82
82
  end
83
83
 
84
+ describe ".request_signature" do
85
+ before(:each) do
86
+ @api = Icontact::Api.new('username','password')
87
+ Kernel.stub!(:rand).and_return(111)
88
+ @mock_time = mock('Time', :getgm => 999999)
89
+ Time.stub!(:now).and_return(@mock_time)
90
+ Digest::SHA1.stub!(:hexdigest).and_return('api_signature')
91
+ end
92
+
93
+ it "should generate an API Signature" do
94
+ Digest::SHA1.should_receive(:hexdigest).with('API_SECRETpasswordtimestamp/urlrandomGET').and_return('api_signature')
95
+ @api.request_signature('get','timestamp''/url', 'random', '').should == "api_signature"
96
+ end
97
+ end
98
+
84
99
  describe ".apply_headers" do
85
100
  before(:each) do
86
101
  @request = mock('Request', :add_field=>true)
@@ -88,16 +103,16 @@ describe Icontact::Api do
88
103
  end
89
104
 
90
105
  def do_apply_headers
91
- @api.apply_headers(@request)
106
+ @api.apply_headers(:get, @request, 'http://fakeurl.com')
92
107
  end
93
108
 
94
- it "should add an API-VERSION header to indicate we are using the 2.0 version of the API" do
95
- @request.should_receive(:add_field).with('API-Version', @api.class::API_VERSION)
109
+ it "should add an API_VERSION header to indicate we are using the 2.0 version of the API" do
110
+ @request.should_receive(:add_field).with('API_VERSION', @api.class::API_VERSION)
96
111
  do_apply_headers
97
112
  end
98
113
 
99
114
  it "should add an ACCEPT header indicating we want a JSON object back" do
100
- @request.should_receive(:add_field).with('accept', 'application/json')
115
+ @request.should_receive(:add_field).with('ACCEPT', 'application/json')
101
116
  do_apply_headers
102
117
  end
103
118
 
@@ -106,22 +121,31 @@ describe Icontact::Api do
106
121
  do_apply_headers
107
122
  end
108
123
 
109
- it "should add an API-AppId header to verify that our application is authrorized to use the API" do
110
- @request.should_receive(:add_field).with('API-Appid', @api.class::API_KEY)
124
+ it "should add an API_KEY header to verify that our application is authrorized to use the API" do
125
+ @request.should_receive(:add_field).with('API_KEY', @api.class::API_KEY)
111
126
  do_apply_headers
112
127
  end
113
128
 
114
- it "should add an API-Username header to verify that our user is authorized to use the API" do
115
- @request.should_receive(:add_field).with('API-Username', 'username')
129
+ it "should add an API_USERNAME header to verify that our user is authorized to use the API" do
130
+ @request.should_receive(:add_field).with('API_USERNAME', 'username')
116
131
  do_apply_headers
117
132
  end
118
-
119
- it "should add an API-Password header to verify that our user is authorized to use the API" do
120
- @request.should_receive(:add_field).with('API-Password', 'password')
133
+
134
+ it "should add an API_TIMESTAMP header to prevent old requests from being replayed" do
135
+ @request.should_receive(:add_field).with('API_TIMESTAMP', 999999)
136
+ do_apply_headers
137
+ end
138
+
139
+ it "should add an API_NUMBER header" do
140
+ @request.should_receive(:add_field).with('API_NUMBER', 111)
121
141
  do_apply_headers
122
142
  end
123
-
124
143
 
144
+ it "should add an API_SIGNATURE header to ensure this api request is valid" do
145
+ @api.should_receive(:request_signature).and_return('api_signature')
146
+ @request.should_receive(:add_field).with('API_SIGNATURE', 'api_signature')
147
+ do_apply_headers
148
+ end
125
149
  end
126
150
 
127
151
  describe "class methods" do
metadata CHANGED
@@ -1,84 +1,81 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icontact-api
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.2"
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - Kevin Olbrich
8
14
  autorequire:
9
15
  bindir: bin
10
- cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIDPDCCAiSgAwIBAgIBADANBgkqhkiG9w0BAQUFADBEMRYwFAYDVQQDDA1rZXZp
14
- bi5vbGJyaWNoMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
15
- FgNjb20wHhcNMDkwMzA3MTUwMzQ5WhcNMTAwMzA3MTUwMzQ5WjBEMRYwFAYDVQQD
16
- DA1rZXZpbi5vbGJyaWNoMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJ
17
- k/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvza3W
18
- J5Dloirbhpge6teyZNfvOzuo478vtqnU/c6S8o2EerBkmWm88J+ipItO3U2HDPgP
19
- a7THrx41/QEj1oG15mO6wtBLf0Z+AOJFAmf+Th8x3b46b3Voo1+suON67fCqCz+U
20
- L5V2I5NBNywCte5Nzjh7knLkHr+rUCCKAIPK6vq+sASMIgmlhzZUuQfdRZMhRVZP
21
- clMwf9sIp7LUTq2b/LCdP2dlGFydb1cyvaHjho+X/pk5uWKcr1OkrZtYFdxyeGU4
22
- ZTtqEd5vaNTacYf0vGBfPfiolIfbmOa8Pgfyj8zkjBug/iukM/YGmwL1KAk8Qs+/
23
- gInxSkyPxa7zkYTzAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0G
24
- A1UdDgQWBBS+y2GRZjETz6d3jHKosqOZ6Ll+zjANBgkqhkiG9w0BAQUFAAOCAQEA
25
- f3hCt6NBuESjAN4fkpbcfi3/Nj06aNl6CAfryfKaOaIfLcypT5nqP1qtqqGih5ne
26
- QCe7jmtZHOGFC/SSlCS8obHSkCGn2cfUl/InfpF/YQnZV0Kp8esihuVmEjO0SgEU
27
- yf46wW9Nh4byKctkgKMlWnIqwAyk4G1dD/le6MGJutb4pv5hT9qm1vaTFkAcy1Qu
28
- 1VMZa+MH6xnINGdFyV8T7AYL5BaQTbp2WYsfbOvy3ZfxbpP5O3wc3wter/Cyp8pu
29
- Wvn0/+13roT+v5T5yFIpu6NbSpuqvRaKZvS+n2ZgwS10rUPFydzn+335umE4vsfH
30
- 4Umf0rf1f8h+GJia5xXYww==
31
- -----END CERTIFICATE-----
16
+ cert_chain: []
32
17
 
33
- date: 2009-07-20 00:00:00 -04:00
18
+ date: 2011-04-27 00:00:00 -04:00
34
19
  default_executable:
35
20
  dependencies:
36
21
  - !ruby/object:Gem::Dependency
37
- name: json
38
22
  type: :runtime
39
- version_requirement:
40
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ name: json
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
41
27
  requirements:
42
28
  - - ">="
43
29
  - !ruby/object:Gem::Version
44
- version: 1.1.3
45
- version:
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ requirement: *id001
46
35
  - !ruby/object:Gem::Dependency
47
- name: newgem
48
36
  type: :development
49
- version_requirement:
50
- version_requirements: !ruby/object:Gem::Requirement
37
+ prerelease: false
38
+ name: bundler
39
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
+ none: false
51
41
  requirements:
52
- - - ">="
42
+ - - ~>
53
43
  - !ruby/object:Gem::Version
54
- version: 1.5.1
55
- version:
44
+ hash: 15
45
+ segments:
46
+ - 1
47
+ - 0
48
+ version: "1.0"
49
+ requirement: *id002
56
50
  - !ruby/object:Gem::Dependency
57
- name: hoe
58
51
  type: :development
59
- version_requirement:
60
- version_requirements: !ruby/object:Gem::Requirement
52
+ prerelease: false
53
+ name: jeweler
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
55
+ none: false
61
56
  requirements:
62
57
  - - ">="
63
58
  - !ruby/object:Gem::Version
64
- version: 2.3.2
65
- version:
66
- description: This gem provides a thin wrapper around the iContact 2.0 API.
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ requirement: *id003
64
+ description:
67
65
  email:
68
- - kevin.olbrich@gmail.com
66
+ - kevin.olbrich+icontact-api@gmail.com
69
67
  executables: []
70
68
 
71
69
  extensions: []
72
70
 
73
71
  extra_rdoc_files:
74
- - History.txt
75
- - Manifest.txt
76
- - README.txt
72
+ - README.rdoc
77
73
  files:
74
+ - Gemfile
78
75
  - History.txt
79
- - Manifest.txt
80
- - README.txt
76
+ - README.rdoc
81
77
  - Rakefile
78
+ - VERSION
82
79
  - lib/icontact-api.rb
83
80
  - lib/icontact/api.rb
84
81
  - script/console
@@ -89,33 +86,39 @@ files:
89
86
  - spec/spec_helper.rb
90
87
  - tasks/rspec.rake
91
88
  has_rdoc: true
92
- homepage:
89
+ homepage: http://github.com/olbrich/IContact-API
93
90
  licenses: []
94
91
 
95
92
  post_install_message:
96
- rdoc_options:
97
- - --main
98
- - README.txt
93
+ rdoc_options: []
94
+
99
95
  require_paths:
100
96
  - lib
101
97
  required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
102
99
  requirements:
103
100
  - - ">="
104
101
  - !ruby/object:Gem::Version
102
+ hash: 3
103
+ segments:
104
+ - 0
105
105
  version: "0"
106
- version:
107
106
  required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
108
108
  requirements:
109
109
  - - ">="
110
110
  - !ruby/object:Gem::Version
111
+ hash: 3
112
+ segments:
113
+ - 0
111
114
  version: "0"
112
- version:
113
115
  requirements: []
114
116
 
115
- rubyforge_project: icontact-api
116
- rubygems_version: 1.3.4
117
+ rubyforge_project:
118
+ rubygems_version: 1.3.7
117
119
  signing_key:
118
120
  specification_version: 3
119
- summary: This gem provides a thin wrapper around the iContact 2.0 API.
120
- test_files: []
121
-
121
+ summary: A thin wrapper around the iContact API
122
+ test_files:
123
+ - spec/api_spec.rb
124
+ - spec/spec_helper.rb
data.tar.gz.sig DELETED
Binary file
data/Manifest.txt DELETED
@@ -1,13 +0,0 @@
1
- History.txt
2
- Manifest.txt
3
- README.txt
4
- Rakefile
5
- lib/icontact-api.rb
6
- lib/icontact/api.rb
7
- script/console
8
- script/destroy
9
- script/generate
10
- spec/api_spec.rb
11
- spec/spec.opts
12
- spec/spec_helper.rb
13
- tasks/rspec.rake
metadata.gz.sig DELETED
Binary file