big-door 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.bundle/config +2 -0
- data/.document +5 -0
- data/.gitignore +22 -0
- data/Gemfile +12 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +59 -0
- data/VERSION +1 -0
- data/features/big-door.feature +26 -0
- data/features/step_definitions/big-door_steps.rb +83 -0
- data/features/support/env.rb +5 -0
- data/lib/big-door.rb +127 -0
- data/lib/big-door/base.rb +45 -0
- data/lib/big-door/currency.rb +25 -0
- data/lib/big-door/named_transaction.rb +25 -0
- data/lib/big-door/named_transaction_group.rb +27 -0
- data/lib/big-door/request.rb +7 -0
- data/lib/big-door/response_codes.rb +266 -0
- data/lib/big-door/user.rb +49 -0
- data/spec/.rspec +1 -0
- data/spec/big-door_spec.rb +105 -0
- data/spec/spec_helper.rb +19 -0
- data/spec/support/vcr.rb +7 -0
- data/vcr_cassettes/NamedTransaction/NamedTransaction.yml +213 -0
- data/vcr_cassettes/NamedTransaction/specific.yml +6043 -0
- data/vcr_cassettes/award/award_summary.yml +34 -0
- data/vcr_cassettes/currency/currency.yml +52 -0
- data/vcr_cassettes/currency/currency_type.yml +31 -0
- data/vcr_cassettes/currency/specific.yml +2980 -0
- data/vcr_cassettes/good/good_summary.yml +34 -0
- data/vcr_cassettes/level/level_summary.yml +34 -0
- data/vcr_cassettes/named_transaction/named_transactions.yml +107 -0
- data/vcr_cassettes/named_transaction_group/all.yml +145 -0
- data/vcr_cassettes/named_transaction_group/specific.yml +3171 -0
- data/vcr_cassettes/user/add_points.yml +36 -0
- data/vcr_cassettes/user/all.yml +473 -0
- data/vcr_cassettes/user/create.yml +393 -0
- data/vcr_cassettes/user/currency_balance.yml +738 -0
- data/vcr_cassettes/user/new.yml +5660 -0
- data/vcr_cassettes/user/new_currency_balance.yml +470 -0
- data/vcr_cassettes/user/specific.yml +213 -0
- metadata +175 -0
data/.bundle/config
ADDED
data/.document
ADDED
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Michael Lavrisha
|
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.
|
data/README.rdoc
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
= big-door
|
2
|
+
|
3
|
+
Description goes here.
|
4
|
+
|
5
|
+
== Note on Patches/Pull Requests
|
6
|
+
|
7
|
+
* Fork the project.
|
8
|
+
* Make your feature addition or bug fix.
|
9
|
+
* Add tests for it. This is important so I don't break it in a
|
10
|
+
future version unintentionally.
|
11
|
+
* Commit, do not mess with rakefile, version, or history.
|
12
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
13
|
+
* Send me a pull request. Bonus points for topic branches.
|
14
|
+
|
15
|
+
== Copyright
|
16
|
+
|
17
|
+
Copyright (c) 2010 Michael Lavrisha. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "big-door"
|
8
|
+
gem.summary = %Q{Big Door Media gem}
|
9
|
+
gem.description = %Q{A gem to interact with Big Door Media's API}
|
10
|
+
gem.email = "mlavrisha@trada.com"
|
11
|
+
gem.homepage = "http://github.com/vrish88/big-door"
|
12
|
+
gem.authors = ["Michael Lavrisha"]
|
13
|
+
gem.add_development_dependency "rspec", "~> 2.0.0.beta.19"
|
14
|
+
gem.add_development_dependency "cucumber", "~> 0.8.5"
|
15
|
+
gem.add_runtime_dependency "httparty", "~>0.6.0"
|
16
|
+
gem.add_runtime_dependency "json", "~>1.4.3"
|
17
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
|
+
end
|
19
|
+
Jeweler::GemcutterTasks.new
|
20
|
+
rescue LoadError
|
21
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
22
|
+
end
|
23
|
+
|
24
|
+
#require 'spec/rake/spectask'
|
25
|
+
#Spec::Rake::SpecTask.new(:spec) do |spec|
|
26
|
+
# spec.libs << 'lib' << 'spec'
|
27
|
+
# spec.spec_files = FileList['spec/**/*_spec.rb']
|
28
|
+
#end
|
29
|
+
#
|
30
|
+
#Spec::Rake::SpecTask.new(:rcov) do |spec|
|
31
|
+
# spec.libs << 'lib' << 'spec'
|
32
|
+
# spec.pattern = 'spec/**/*_spec.rb'
|
33
|
+
# spec.rcov = true
|
34
|
+
#end
|
35
|
+
#
|
36
|
+
#task :spec => :check_dependencies
|
37
|
+
|
38
|
+
# begin
|
39
|
+
# require 'cucumber/rake/task'
|
40
|
+
# Cucumber::Rake::Task.new(:features)
|
41
|
+
#
|
42
|
+
# task :features => :check_dependencies
|
43
|
+
# rescue LoadError
|
44
|
+
# task :features do
|
45
|
+
# abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
|
49
|
+
task :default => :spec
|
50
|
+
|
51
|
+
require 'rake/rdoctask'
|
52
|
+
Rake::RDocTask.new do |rdoc|
|
53
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
54
|
+
|
55
|
+
rdoc.rdoc_dir = 'rdoc'
|
56
|
+
rdoc.title = "big-door #{version}"
|
57
|
+
rdoc.rdoc_files.include('README*')
|
58
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
59
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Feature: Provide API access to Big Door media
|
2
|
+
As a developer
|
3
|
+
I want to access Big Door media's API
|
4
|
+
|
5
|
+
Scenario: Sending a request to get award summary
|
6
|
+
Given I have API credentials
|
7
|
+
When I make a request for "award_summary"
|
8
|
+
Then the response should be "[]"
|
9
|
+
|
10
|
+
Scenario: Creating an end user
|
11
|
+
Given I have API credentials
|
12
|
+
When I create a user named "testers"
|
13
|
+
Then I should receive a "BigDoor::User" object
|
14
|
+
|
15
|
+
Scenario: Checking the currency balance for a user
|
16
|
+
Given I have API credentials
|
17
|
+
And I have a user
|
18
|
+
When I check the user's "currency_balances"
|
19
|
+
Then the response should be "[]"
|
20
|
+
|
21
|
+
Scenario: Adding points to a user's account
|
22
|
+
Given I have API credentials
|
23
|
+
And I have a user
|
24
|
+
And I have a "NamedTransactionGroup" named "Not so basic"
|
25
|
+
When I add "30" points to users's account
|
26
|
+
Then their account should have "30" more points
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Givens
|
2
|
+
Given /^I have API credentials$/ do
|
3
|
+
@big_door = BigDoor::Base.new(:app_key => '0d38d9cd41b0440bbf22c0720be58b27', :secret_key => '5d0b2aed7a7149a9aae97d33f6c23b83')
|
4
|
+
end
|
5
|
+
|
6
|
+
Given /^I have a user$/ do
|
7
|
+
VCR.use_cassette('user/all', :record => :new_episodes) do
|
8
|
+
@user = @big_door.get_end_user.first
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Given /^I have a "([^"]*)" named "([^"]*)"$/ do |action, name|
|
13
|
+
if action == "NamedTransaction"
|
14
|
+
VCR.use_cassette("NamedTransaction/specific", :record => :new_episodes) do
|
15
|
+
@transaction = BigDoor::NamedTransaction.find(:pub_title => name)
|
16
|
+
end
|
17
|
+
elsif action == 'NamedTransactionGroup'
|
18
|
+
VCR.use_cassette("named_transaction_group/specific", :record => :new_episodes) do
|
19
|
+
@grp_trans = BigDoor::NamedTransactionGroup.find(:pub_title__startswith => name)
|
20
|
+
end
|
21
|
+
@grp_trans.should_not eql(nil)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Whens
|
26
|
+
When /^I make a request for "([^\"]*)"$/ do |arg1|
|
27
|
+
VCR.use_cassette('award/award_summary', :record => :new_episodes) do
|
28
|
+
@response = @big_door.get_award_summary
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
When /^I create a user named "([^\"]*)"$/ do |name|
|
33
|
+
VCR.use_cassette('user/new', :record => :new_episodes) do
|
34
|
+
@response = BigDoor::User.find(name)
|
35
|
+
end
|
36
|
+
@response.class.should eql(BigDoor::User)
|
37
|
+
end
|
38
|
+
|
39
|
+
When /^I check the user's "([^\"]*)"$/ do |action|
|
40
|
+
VCR.use_cassette('user/all', :record => :new_episodes) do
|
41
|
+
@response = @user.send action
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
When /^I add "([^\"]*)" points to users's account$/ do |points|
|
46
|
+
VCR.use_cassette('user/currency_balance', :match_requests_on => {:path => /end_user\/#{@user.end_user_login}\/currency_balance/}) do
|
47
|
+
@old_points = @user.get_currency_balance(@currency)
|
48
|
+
end
|
49
|
+
|
50
|
+
VCR.use_cassette('user/add_points', :record => :all, :match_requests_on => {:path => /named_transaction_group\/#{@grp_trans.id}\/execute\/#{@user.end_user_login}/}) do
|
51
|
+
@user.add_points(@grp_trans, points.to_i)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Thens
|
56
|
+
Then /^I should have "([^\"]*)" new user$/ do |num|
|
57
|
+
@response = @big_door.get_end_user
|
58
|
+
end
|
59
|
+
|
60
|
+
Then /^I should receive a "([^\"]*)" object$/ do |received_object|
|
61
|
+
if @response.is_a? Array
|
62
|
+
@response.first.class.should eql(received_object.constantize)
|
63
|
+
else
|
64
|
+
@response.class.should eql(eval(received_object))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Then /^I should receive a "([^\"]*)" response code$/ do |response_code|
|
69
|
+
@response.code.should eql(response_code.to_i)
|
70
|
+
end
|
71
|
+
|
72
|
+
Then /^the response should be "([^"]*)"$/ do |arg1|
|
73
|
+
@response.should eql(eval(arg1))
|
74
|
+
end
|
75
|
+
|
76
|
+
Then /^their account should have "([^\"]*)" more points$/ do |points|
|
77
|
+
new_points = {}
|
78
|
+
VCR.use_cassette('user/new_currency_balance', :match_requests_on => {:path => /end_user\/#{@user.end_user_login}\/currency_balance/}) do
|
79
|
+
new_points = @user.get_currency_balance(@currency)
|
80
|
+
end
|
81
|
+
|
82
|
+
new_points["curr_balance"].to_i.should eql(@old_points['curr_balance'].to_i + points.to_i)
|
83
|
+
end
|
data/lib/big-door.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'httparty'
|
3
|
+
require 'json'
|
4
|
+
require 'uri'
|
5
|
+
require 'cgi'
|
6
|
+
require 'uuidtools'
|
7
|
+
|
8
|
+
module BigDoor
|
9
|
+
BASE_URL = 'http://api.bigdoor.com'.freeze
|
10
|
+
BASE_URI = 'api/publisher'.freeze
|
11
|
+
|
12
|
+
class BigDoorError < StandardError; end
|
13
|
+
|
14
|
+
module ClassMethods
|
15
|
+
def self.included(base)
|
16
|
+
base.extend ClassMethods
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.app_key
|
20
|
+
@app_key
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.secret_key
|
24
|
+
@secret_key
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_out_classes(content)
|
28
|
+
output = []
|
29
|
+
unless content.is_a? Array
|
30
|
+
content = Array[content]
|
31
|
+
end
|
32
|
+
content.each do |result|
|
33
|
+
begin
|
34
|
+
output << case result["resource_name"]
|
35
|
+
when 'end_user'
|
36
|
+
User.new(result)
|
37
|
+
when 'currency'
|
38
|
+
Currency.new(result)
|
39
|
+
when 'named_transaction'
|
40
|
+
NamedTransaction.new(result)
|
41
|
+
when 'named_transaction_group'
|
42
|
+
NamedTransactionGroup.new(result)
|
43
|
+
else
|
44
|
+
result
|
45
|
+
end
|
46
|
+
rescue
|
47
|
+
debugger
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
output.length == 1 ? output.first : output
|
52
|
+
end
|
53
|
+
|
54
|
+
def perform_request(*args)
|
55
|
+
request_type, action, args = args
|
56
|
+
raise BigDoorError, "Unknown request type" unless ['get', 'post', 'put', 'delete'].include? request_type
|
57
|
+
|
58
|
+
query = args
|
59
|
+
params = {}
|
60
|
+
query = {} if (query.is_a? Array and query.empty?) or query.nil?
|
61
|
+
action << '/' + query.delete(:id).to_s if query.has_key? :id
|
62
|
+
|
63
|
+
if ['post', 'put'].include? request_type
|
64
|
+
params[:body] = query
|
65
|
+
params[:body][:time] = "%.2f" % Time.now.to_f
|
66
|
+
params[:body][:token] = SecureRandom.hex
|
67
|
+
query = {}
|
68
|
+
end
|
69
|
+
|
70
|
+
path = [BASE_URI, ClassMethods.app_key, action].join('/')
|
71
|
+
params[:query] = query
|
72
|
+
params[:query][:time] = params[:body][:time] rescue "%.2f" % Time.now.to_f
|
73
|
+
params[:query][:sig] = calculate_sha2_hash(path, params)
|
74
|
+
params[:query][:format] = 'json'
|
75
|
+
url = [BASE_URL, path].join('/')
|
76
|
+
parse_response(BigDoor::Request.send(request_type, url, params))
|
77
|
+
# BigDoor::Request.send(request_type, url, params)
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
def parse_response(response)
|
82
|
+
if response.response.class.ancestors.include? Net::HTTPClientError
|
83
|
+
raise BigDoorError, "#{response.response.code} #{response.response.message} - #{response.headers['bdm-reason-phrase'].to_s}"
|
84
|
+
end
|
85
|
+
|
86
|
+
if response.parsed_response.is_a? Numeric
|
87
|
+
response_code = BigDoor::ResponseCodes.find response.parsed_response
|
88
|
+
if response_code[:is_error]
|
89
|
+
raise BigDoorError, "#{response_code[:code]} #{response_code[:response_condition]} - #{response_code[:reason_phrase]}"
|
90
|
+
else
|
91
|
+
return true
|
92
|
+
end
|
93
|
+
elsif response.parsed_response.first.is_a? Array
|
94
|
+
content = response.parsed_response.first
|
95
|
+
else
|
96
|
+
content = ([] << response.parsed_response.first)
|
97
|
+
end
|
98
|
+
parse_out_classes(content)
|
99
|
+
end
|
100
|
+
|
101
|
+
def calculate_sha2_hash(path, query)
|
102
|
+
path = '/' + path
|
103
|
+
Digest::SHA2.new(bitlen = 256).update(path + concat_query(query[:query]) + concat_query(query[:body]) + ClassMethods.secret_key).to_s
|
104
|
+
end
|
105
|
+
|
106
|
+
def concat_query(query)
|
107
|
+
str = ''
|
108
|
+
unless query.nil?
|
109
|
+
query.keys.map(&:to_s).sort.each do |key|
|
110
|
+
str << key.to_s + query[key.to_sym].to_s unless [:sig, :format].include?(key)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
str
|
114
|
+
end
|
115
|
+
|
116
|
+
def to_url_params(hash)
|
117
|
+
elements = []
|
118
|
+
hash.each_pair do |key, val|
|
119
|
+
elements << "#{CGI::escape(key.to_s)}=#{CGI::escape(val.to_s)}"
|
120
|
+
end
|
121
|
+
elements.join('&')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
directory = File.expand_path(File.dirname(__FILE__))
|
127
|
+
Dir[File.join(directory, "big-door", "*.rb").to_s].each {|file| require file }
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module BigDoor
|
2
|
+
class Base
|
3
|
+
include ClassMethods
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
options = args.last
|
7
|
+
ClassMethods.module_eval do
|
8
|
+
instance_variable_set('@app_key', options[:app_key])
|
9
|
+
end
|
10
|
+
ClassMethods.module_eval do
|
11
|
+
instance_variable_set('@secret_key', options[:secret_key])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# def get_award_summary
|
16
|
+
# perform_get('award_summary')
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def get_transaction_summary
|
20
|
+
# perform_get('transaction_summary')
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# def get_level_summary
|
24
|
+
# perform_get('level_summary')
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# def get_good_summary
|
28
|
+
# perform_get('good_summary')
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# def get_currency_type
|
32
|
+
# perform_get('currency_type')
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# def get_currency
|
36
|
+
# perform_get('currency')
|
37
|
+
# end
|
38
|
+
|
39
|
+
def method_missing(name, *args)
|
40
|
+
name, request_type, method_name = name.to_s.match(/(put|post|get|delete)_(.+)/).to_a
|
41
|
+
super(name, args) if name.nil? or request_type.nil? or method_name.nil?
|
42
|
+
perform_request request_type, method_name, args.first
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|