tddium_client 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|