tddium_client 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/.rvmrc +2 -0
- data/Gemfile +4 -0
- data/README +0 -0
- data/Rakefile +4 -0
- data/config/environment.yml +21 -0
- data/lib/tddium_client.rb +70 -0
- data/lib/tddium_client/tddium_spec_helpers.rb +57 -0
- data/lib/tddium_client/version.rb +7 -0
- data/spec/fixtures/post_suites_201.json +13 -0
- data/spec/fixtures/post_suites_201_json_status_1.json +13 -0
- data/spec/fixtures/post_suites_409.json +13 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/tddium_client_spec.rb +181 -0
- data/tddium_client.gemspec +33 -0
- metadata +169 -0
data/.rvmrc
ADDED
data/Gemfile
ADDED
data/README
ADDED
File without changes
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright (c) 2011 Solano Labs All Rights Reserved
|
2
|
+
|
3
|
+
development:
|
4
|
+
api:
|
5
|
+
scheme: http
|
6
|
+
host: localhost
|
7
|
+
port: 3000
|
8
|
+
version: 1
|
9
|
+
|
10
|
+
production:
|
11
|
+
api:
|
12
|
+
scheme: https
|
13
|
+
host: api.tddium.com
|
14
|
+
version: 1
|
15
|
+
|
16
|
+
test:
|
17
|
+
api:
|
18
|
+
scheme: http
|
19
|
+
host: localhost
|
20
|
+
port: 3000
|
21
|
+
version: 1
|
@@ -0,0 +1,70 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2011 Solano Labs All Rights Reserved
|
3
|
+
=end
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'httparty'
|
7
|
+
require 'json'
|
8
|
+
|
9
|
+
class TddiumClient
|
10
|
+
API_KEY_HEADER = "X-tddium-api-key"
|
11
|
+
API_ERROR_TEXT = "An error occured: "
|
12
|
+
|
13
|
+
attr_accessor :environment
|
14
|
+
|
15
|
+
def initialize(env = :development)
|
16
|
+
self.environment = env
|
17
|
+
end
|
18
|
+
|
19
|
+
def call_api(method, api_path, params = {}, api_key = nil, retries = 5, &block)
|
20
|
+
headers = { API_KEY_HEADER => api_key } if api_key
|
21
|
+
|
22
|
+
done = false
|
23
|
+
tries = 0
|
24
|
+
while (retries < 0 || tries <= retries) && !done
|
25
|
+
begin
|
26
|
+
http = HTTParty.send(method, tddium_uri(api_path), :body => params, :headers => headers)
|
27
|
+
done = true
|
28
|
+
rescue Timeout::Error
|
29
|
+
ensure
|
30
|
+
tries += 1
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
raise Timeout::Error if tries > retries
|
35
|
+
|
36
|
+
response = JSON.parse(http.body) rescue {}
|
37
|
+
|
38
|
+
if http.success?
|
39
|
+
if response["status"] == 0
|
40
|
+
yield response
|
41
|
+
else
|
42
|
+
message = API_ERROR_TEXT + response["explanation"].to_s
|
43
|
+
end
|
44
|
+
else
|
45
|
+
message = API_ERROR_TEXT + http.response.header.msg.to_s
|
46
|
+
message << " #{response["explanation"]}" if response["status"].to_i > 0
|
47
|
+
end
|
48
|
+
[response["status"] || http.code, message]
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def tddium_uri(path)
|
54
|
+
uri = URI.parse("")
|
55
|
+
uri.host = tddium_config["api"]["host"]
|
56
|
+
uri.port = tddium_config["api"]["port"]
|
57
|
+
uri.scheme = tddium_config["api"]["scheme"]
|
58
|
+
URI.join(uri.to_s, "#{tddium_config["api"]["version"]}/#{path}").to_s
|
59
|
+
end
|
60
|
+
|
61
|
+
def tddium_config
|
62
|
+
unless @tddium_config
|
63
|
+
@tddium_config = YAML.load(
|
64
|
+
File.read(File.join(File.dirname(__FILE__), "..", "config", "environment.yml"))
|
65
|
+
)[environment.to_s]
|
66
|
+
end
|
67
|
+
@tddium_config
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2011 Solano Labs All Rights Reserved
|
3
|
+
=end
|
4
|
+
|
5
|
+
require 'httparty'
|
6
|
+
require 'fakeweb'
|
7
|
+
|
8
|
+
FakeWeb.allow_net_connect = false
|
9
|
+
|
10
|
+
module TddiumSpecHelpers
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def register_uri_options(options = {})
|
15
|
+
if options.is_a?(Array)
|
16
|
+
options_array = []
|
17
|
+
options.each do |sub_options|
|
18
|
+
options_array << register_uri_options(sub_options)
|
19
|
+
end
|
20
|
+
options_array
|
21
|
+
else
|
22
|
+
options_for_fake_web = {:body => options[:body], :status => options[:status]}
|
23
|
+
if options[:response]
|
24
|
+
FakeFS.deactivate!
|
25
|
+
response = File.open(options[:response]) { |f| f.read }
|
26
|
+
FakeFS.activate!
|
27
|
+
options_for_fake_web.merge!(:response => response)
|
28
|
+
end
|
29
|
+
options_for_fake_web
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_file(path, content = "blah")
|
34
|
+
FileUtils.mkdir_p(File.dirname(path))
|
35
|
+
File.open(path, 'w') do |f|
|
36
|
+
f.write(content)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def api_uri(path)
|
41
|
+
uri = URI.parse("")
|
42
|
+
uri.host = tddium_client_config["api"]["host"]
|
43
|
+
uri.scheme = tddium_client_config["api"]["scheme"]
|
44
|
+
uri.port = tddium_client_config["api"]["port"]
|
45
|
+
URI.join(uri.to_s, "#{tddium_client_config["api"]["version"]}/#{path}").to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def tddium_client_config(raw = false, environment = "test")
|
49
|
+
unless @tddium_config
|
50
|
+
FakeFS.deactivate!
|
51
|
+
|
52
|
+
@tddium_config = File.read(File.join(File.dirname(__FILE__), "..", "..", "config", "environment.yml"))
|
53
|
+
FakeFS.activate!
|
54
|
+
end
|
55
|
+
raw ? @tddium_config : YAML.load(@tddium_config)[environment]
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HTTP/1.1 201 Created
|
2
|
+
Date: Thu, 03 Mar 2011 10:25:28 GMT
|
3
|
+
Server: Apache
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.3
|
5
|
+
Cache-Control: no-cache
|
6
|
+
X-UA-Compatible: IE=Edge
|
7
|
+
X-Runtime: 0.096863
|
8
|
+
Set-Cookie: _tddium_site_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlYjk0YTMzNmZmNzQ1NTI1NDk5YmE2NTc4Y2IxNTYxNGU%3D--d841305e17bd1b770b2b99ae74a03bc7aa5eddd5; path=/; HttpOnly
|
9
|
+
Status: 201
|
10
|
+
Transfer-Encoding: chunked
|
11
|
+
Content-Type: application/json; charset=utf-8
|
12
|
+
|
13
|
+
{"suite":{"created_at":"2011-03-03T10:25:28Z","id":19,"ruby_version":"1.9.2","ssh_key":"ssh-rsa blah","suite_name":"tddium/demo","test_pattern":"**/*_spec.rb","updated_at":"2011-03-03T10:25:28Z","user_id":null},"status":0}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HTTP/1.1 269 Duplicated
|
2
|
+
Date: Thu, 03 Mar 2011 10:00:32 GMT
|
3
|
+
Server: Apache
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.3
|
5
|
+
Cache-Control: no-cache
|
6
|
+
X-UA-Compatible: IE=Edge
|
7
|
+
X-Runtime: 0.045332
|
8
|
+
Set-Cookie: _tddium_site_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlOGZiMTgxZjM0ZGIwMmJlMzI2ZWQwMmFkYzUwZGEzZDU%3D--287be8a7de3c8535fc4d958d2fc036110e64e5b6; path=/; HttpOnly
|
9
|
+
Status: 269
|
10
|
+
Transfer-Encoding: chunked
|
11
|
+
Content-Type: application/json; charset=utf-8
|
12
|
+
|
13
|
+
{"status":1,"explanation":"{:suite_name=>[\"has already been taken\"]}"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HTTP/1.1 409 Conflict
|
2
|
+
Date: Thu, 03 Mar 2011 10:00:32 GMT
|
3
|
+
Server: Apache
|
4
|
+
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.3
|
5
|
+
Cache-Control: no-cache
|
6
|
+
X-UA-Compatible: IE=Edge
|
7
|
+
X-Runtime: 0.045332
|
8
|
+
Set-Cookie: _tddium_site_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlOGZiMTgxZjM0ZGIwMmJlMzI2ZWQwMmFkYzUwZGEzZDU%3D--287be8a7de3c8535fc4d958d2fc036110e64e5b6; path=/; HttpOnly
|
9
|
+
Status: 409
|
10
|
+
Transfer-Encoding: chunked
|
11
|
+
Content-Type: application/json; charset=utf-8
|
12
|
+
|
13
|
+
{"status":1,"explanation":"{:suite_name=>[\"has already been taken\"]}"}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2011 Solano Labs All Rights Reserved
|
3
|
+
=end
|
4
|
+
|
5
|
+
require "tddium_client"
|
6
|
+
require "fakeweb"
|
7
|
+
require "rack/test"
|
8
|
+
require "fakefs/spec_helpers"
|
9
|
+
require "tddium_client/tddium_spec_helpers"
|
10
|
+
|
11
|
+
FakeWeb.allow_net_connect = false
|
12
|
+
|
13
|
+
def fixture_path(fixture_name)
|
14
|
+
File.join File.dirname(__FILE__), "fixtures", fixture_name
|
15
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2011 Solano Labs All Rights Reserved
|
3
|
+
=end
|
4
|
+
|
5
|
+
require "spec_helper"
|
6
|
+
|
7
|
+
describe TddiumClient do
|
8
|
+
include FakeFS::SpecHelpers
|
9
|
+
include TddiumSpecHelpers
|
10
|
+
|
11
|
+
EXAMPLE_HTTP_METHOD = :post
|
12
|
+
EXAMPLE_TDDIUM_RESOURCE = "suites"
|
13
|
+
EXAMPLE_PARAMS = {"key" => "value"}
|
14
|
+
EXAMPLE_API_KEY = "afb12412bdafe124124asfasfabebafeabwbawf1312342erbfasbb"
|
15
|
+
|
16
|
+
def stub_tddium_client_config
|
17
|
+
create_file(File.join("config", "environment.yml"), tddium_client_config(true))
|
18
|
+
end
|
19
|
+
|
20
|
+
def stub_http_response(method, path, options = {})
|
21
|
+
uri = api_uri(path)
|
22
|
+
FakeWeb.register_uri(method, uri, register_uri_options(options))
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse_request_params
|
26
|
+
Rack::Utils.parse_nested_query(FakeWeb.last_request.body)
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:tddium_client) { TddiumClient.new }
|
30
|
+
|
31
|
+
it "should set the default environment to :development" do
|
32
|
+
tddium_client.environment.should == :development
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#environment" do
|
36
|
+
it "should set the environment" do
|
37
|
+
tddium_client.environment = :production
|
38
|
+
tddium_client.environment.should == :production
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#call_api" do
|
43
|
+
before do
|
44
|
+
FakeWeb.clean_registry
|
45
|
+
stub_tddium_client_config
|
46
|
+
stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
|
47
|
+
end
|
48
|
+
|
49
|
+
context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}')" do
|
50
|
+
it "should make a '#{EXAMPLE_HTTP_METHOD.to_s.upcase}' request to the api" do
|
51
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
|
52
|
+
FakeWeb.last_request.method.downcase.to_sym.should == EXAMPLE_HTTP_METHOD
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should make a request to the correct resource" do
|
56
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
|
57
|
+
FakeWeb.last_request.path.should =~ /#{EXAMPLE_TDDIUM_RESOURCE}$/
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "raises an error" do
|
62
|
+
before do
|
63
|
+
HTTParty.stub(EXAMPLE_HTTP_METHOD).and_raise(Timeout::Error)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should retry 5 times by default to contact the API" do
|
67
|
+
HTTParty.should_receive(EXAMPLE_HTTP_METHOD).exactly(6).times
|
68
|
+
expect { tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE) }.to raise_error(Timeout::Error)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should retry as many times as we want to contact the API" do
|
72
|
+
HTTParty.should_receive(EXAMPLE_HTTP_METHOD).exactly(3).times
|
73
|
+
expect { tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, 2) }.to raise_error(Timeout::Error)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}', {}, #{EXAMPLE_API_KEY}) # with api_key" do
|
78
|
+
it "should include #{TddiumClient::API_KEY_HEADER}=#{EXAMPLE_API_KEY} in the request headers" do
|
79
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, EXAMPLE_API_KEY)
|
80
|
+
FakeWeb.last_request[TddiumClient::API_KEY_HEADER].should == EXAMPLE_API_KEY
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}') # without api_key" do
|
85
|
+
it "should not include #{TddiumClient::API_KEY_HEADER} in the request headers" do
|
86
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {})
|
87
|
+
FakeWeb.last_request[TddiumClient::API_KEY_HEADER].should be_nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}', #{EXAMPLE_PARAMS}) # with params" do
|
92
|
+
it "should include #{EXAMPLE_PARAMS} in the request params" do
|
93
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, EXAMPLE_PARAMS)
|
94
|
+
parse_request_params.should include(EXAMPLE_PARAMS)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "('#{EXAMPLE_HTTP_METHOD}', '#{EXAMPLE_TDDIUM_RESOURCE}') # without params" do
|
99
|
+
it "should not include any request params" do
|
100
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)
|
101
|
+
parse_request_params.should == {}
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
context "results in a successful response" do
|
106
|
+
let(:dummy_block) { Proc.new { |response| @parsed_http_response = response } }
|
107
|
+
before do
|
108
|
+
stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :response => fixture_path("post_suites_201.json"))
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should try to contact the api only once" do
|
112
|
+
HTTParty.should_receive(EXAMPLE_HTTP_METHOD).exactly(1).times.and_return(mock(HTTParty).as_null_object)
|
113
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, &dummy_block)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should parse the JSON response" do
|
117
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, &dummy_block)
|
118
|
+
@parsed_http_response.should be_a(Hash)
|
119
|
+
@parsed_http_response["status"].should == 0
|
120
|
+
@parsed_http_response["suite"]["id"].should == 19
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should return a tuple with element[0]==status and element[1]==nil" do
|
124
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, {}, nil, &dummy_block).should == [0, nil]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context "results in an unsuccessful response" do
|
129
|
+
before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :status => ["404", "Not Found"]) }
|
130
|
+
|
131
|
+
shared_examples_for "returning that an error occured" do
|
132
|
+
it "should return that an error occured in the second element" do
|
133
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[1].should =~ /^#{TddiumClient::API_ERROR_TEXT}/
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
shared_examples_for("returning the API error") do
|
138
|
+
it "should return the API error in the second element" do
|
139
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[1].should =~ /\{\:suite_name\=\>\[\"has already been taken\"\]\}$/
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should return an array with two elements" do
|
144
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE).size.should == 2
|
145
|
+
end
|
146
|
+
|
147
|
+
context "where the http request was successful but API status is not 0" do
|
148
|
+
before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :response => fixture_path("post_suites_201_json_status_1.json")) }
|
149
|
+
it_should_behave_like("returning that an error occured")
|
150
|
+
it_should_behave_like("returning the API error")
|
151
|
+
|
152
|
+
it "should return the API error code in the first element" do
|
153
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[0].should == 1
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
context "where the http request was unsuccessful" do
|
158
|
+
before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :status => ["501", "Internal Server Error"]) }
|
159
|
+
it_should_behave_like("returning that an error occured")
|
160
|
+
|
161
|
+
it "should return the HTTP error message in the second element" do
|
162
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[1].should =~ /Internal Server Error/
|
163
|
+
end
|
164
|
+
|
165
|
+
context "and an API error is returned" do
|
166
|
+
before { stub_http_response(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE, :response => fixture_path("post_suites_409.json")) }
|
167
|
+
it_should_behave_like("returning the API error")
|
168
|
+
it "should return the HTTP error code in the first element" do
|
169
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[0].should == 1
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "and no API error is returned" do
|
174
|
+
it "should return the HTTP error code in the first element" do
|
175
|
+
tddium_client.call_api(EXAMPLE_HTTP_METHOD, EXAMPLE_TDDIUM_RESOURCE)[0].should == 501
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2011 Solano Labs All Rights Reserved
|
3
|
+
=end
|
4
|
+
|
5
|
+
# -*- encoding: utf-8 -*-
|
6
|
+
$:.push File.expand_path("../lib", __FILE__)
|
7
|
+
require "tddium_client/version"
|
8
|
+
|
9
|
+
Gem::Specification.new do |s|
|
10
|
+
s.name = "tddium_client"
|
11
|
+
s.version = TddiumClient::VERSION
|
12
|
+
s.platform = Gem::Platform::RUBY
|
13
|
+
s.authors = ["Jay Moorthi"]
|
14
|
+
s.email = ["info@tddium.com"]
|
15
|
+
s.homepage = "http://www.tddium.com/"
|
16
|
+
s.summary = %q{tddium Client Gem}
|
17
|
+
s.description = %q{Internal Gem used to call the Tddium API}
|
18
|
+
|
19
|
+
s.rubyforge_project = "tddium_client"
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
23
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
24
|
+
s.require_paths = ["lib"]
|
25
|
+
|
26
|
+
s.add_runtime_dependency("httparty")
|
27
|
+
s.add_runtime_dependency("json")
|
28
|
+
|
29
|
+
s.add_development_dependency("rspec")
|
30
|
+
s.add_development_dependency("fakeweb")
|
31
|
+
s.add_development_dependency("fakefs")
|
32
|
+
s.add_development_dependency("rack-test")
|
33
|
+
end
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tddium_client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jay Moorthi
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-15 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: httparty
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: json
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: rspec
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: fakeweb
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
type: :development
|
76
|
+
version_requirements: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: fakefs
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
type: :development
|
90
|
+
version_requirements: *id005
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: rack-test
|
93
|
+
prerelease: false
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
type: :development
|
104
|
+
version_requirements: *id006
|
105
|
+
description: Internal Gem used to call the Tddium API
|
106
|
+
email:
|
107
|
+
- info@tddium.com
|
108
|
+
executables: []
|
109
|
+
|
110
|
+
extensions: []
|
111
|
+
|
112
|
+
extra_rdoc_files: []
|
113
|
+
|
114
|
+
files:
|
115
|
+
- .gitignore
|
116
|
+
- .rvmrc
|
117
|
+
- Gemfile
|
118
|
+
- README
|
119
|
+
- Rakefile
|
120
|
+
- config/environment.yml
|
121
|
+
- lib/tddium_client.rb
|
122
|
+
- lib/tddium_client/tddium_spec_helpers.rb
|
123
|
+
- lib/tddium_client/version.rb
|
124
|
+
- spec/fixtures/post_suites_201.json
|
125
|
+
- spec/fixtures/post_suites_201_json_status_1.json
|
126
|
+
- spec/fixtures/post_suites_409.json
|
127
|
+
- spec/spec_helper.rb
|
128
|
+
- spec/tddium_client_spec.rb
|
129
|
+
- tddium_client.gemspec
|
130
|
+
has_rdoc: true
|
131
|
+
homepage: http://www.tddium.com/
|
132
|
+
licenses: []
|
133
|
+
|
134
|
+
post_install_message:
|
135
|
+
rdoc_options: []
|
136
|
+
|
137
|
+
require_paths:
|
138
|
+
- lib
|
139
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
hash: 3
|
145
|
+
segments:
|
146
|
+
- 0
|
147
|
+
version: "0"
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
+
none: false
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
hash: 3
|
154
|
+
segments:
|
155
|
+
- 0
|
156
|
+
version: "0"
|
157
|
+
requirements: []
|
158
|
+
|
159
|
+
rubyforge_project: tddium_client
|
160
|
+
rubygems_version: 1.3.7
|
161
|
+
signing_key:
|
162
|
+
specification_version: 3
|
163
|
+
summary: tddium Client Gem
|
164
|
+
test_files:
|
165
|
+
- spec/fixtures/post_suites_201.json
|
166
|
+
- spec/fixtures/post_suites_201_json_status_1.json
|
167
|
+
- spec/fixtures/post_suites_409.json
|
168
|
+
- spec/spec_helper.rb
|
169
|
+
- spec/tddium_client_spec.rb
|