pivotal_tracker_api 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.
- checksums.yaml +15 -0
- data/.gitignore +14 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/lib/pivotal_tracker_api.rb +73 -0
- data/lib/pivotal_tracker_api/project.rb +12 -0
- data/lib/pivotal_tracker_api/project_membership.rb +9 -0
- data/lib/pivotal_tracker_api/story.rb +35 -0
- data/lib/pivotal_tracker_api/version.rb +3 -0
- data/pivotal_tracker_api.gemspec +28 -0
- data/spec/fixtures/attachment.json +14 -0
- data/spec/fixtures/comment.json +9 -0
- data/spec/fixtures/memberships.json +135 -0
- data/spec/fixtures/new-imperial-logo-6.jpg +0 -0
- data/spec/fixtures/new_story.json +18 -0
- data/spec/fixtures/project.json +35 -0
- data/spec/fixtures/projects.json +69 -0
- data/spec/fixtures/request_story_update.json +1 -0
- data/spec/fixtures/stories.json +87 -0
- data/spec/fixtures/story.json +20 -0
- data/spec/fixtures/story_updated.json +74 -0
- data/spec/pivotal_traker_api/comment_spec.rb +17 -0
- data/spec/pivotal_traker_api/membership_spec.rb +18 -0
- data/spec/pivotal_traker_api/project_spec.rb +26 -0
- data/spec/pivotal_traker_api/story_spec.rb +52 -0
- data/spec/spec_helper.rb +15 -0
- metadata +187 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NGI5Mjg3YWU0NzQwMzhmM2IwOGE0ZjU3YTM3NDQ0OTliODQxNjAzZg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MTA2MzNlNTI2NmMwMTRkZTFkN2RjNjMyMDhkZTc3Y2EyMmQ3NGQ0NQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Y2U3YjY2ZGU3ZjFkMzBmYzYxMjI1OTY5MmRjM2FmMGU2MmVlNmE1NmYxNGE3
|
10
|
+
ZjQ1MDdjZmYyZmRjNGQzYjc2YTg1ZjA3MmUzODM1NzM3MjQ3NDAzYTBjMjE1
|
11
|
+
ZjJlNzQ0OTBjNmFjOGQzMWQzNDk1MzI1YTk0NzVjYjhjZGYyMjc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OTZlMmQ0YTNjMmY1ZjY1ZWNjM2Y1NmYwOTVjYWU0OGI2ZTk0ZjViNGJjNzUx
|
14
|
+
NTE1MTY0YjZmMzg2MTJkMmUyOTEwOWUxNWQzOGU3NjZiM2M3NDlmZDY3YWZh
|
15
|
+
NzdiMTU2MzAzNTk3NjQ1ZGFiZDA5YTYwYWM3ZWI3ZmIyYjM4Y2E=
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Fabien Garcia
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# PivotalTrackerApi
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'pivotal_tracker_api'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install pivotal_tracker_api
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
TODO: Write usage instructions here
|
24
|
+
|
25
|
+
## Contributing
|
26
|
+
|
27
|
+
1. Fork it ( https://github.com/[my-github-username]/pivotal_tracker_api/fork )
|
28
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
29
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
30
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
31
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'net/http/post/multipart'
|
3
|
+
require "pivotal_tracker_api/version"
|
4
|
+
require "pivotal_tracker_api/project_membership"
|
5
|
+
require "pivotal_tracker_api/project"
|
6
|
+
require "pivotal_tracker_api/story"
|
7
|
+
|
8
|
+
module PivotalTrackerApi
|
9
|
+
class ArgumentError < Exception; end
|
10
|
+
class NotFound < Exception; end
|
11
|
+
class ApiError < Exception; end
|
12
|
+
class API
|
13
|
+
include PivotalTrackerApi::Story
|
14
|
+
include PivotalTrackerApi::Project
|
15
|
+
include PivotalTrackerApi::ProjectMembership
|
16
|
+
DOMAIN_URL = "https://www.pivotaltracker.com"
|
17
|
+
API_URL = "https://www.pivotaltracker.com/services/v5"
|
18
|
+
|
19
|
+
attr_accessor :token
|
20
|
+
|
21
|
+
def initialize(token_api, params={})
|
22
|
+
@token= token_api
|
23
|
+
end
|
24
|
+
|
25
|
+
def get(path, params={})
|
26
|
+
parse_response service[path].get(params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def put(path, params={} )
|
30
|
+
parse_response service[path].put(params)
|
31
|
+
end
|
32
|
+
|
33
|
+
def post(path, params={}, headers={})
|
34
|
+
parse_response service[path].post(params, headers)
|
35
|
+
end
|
36
|
+
|
37
|
+
def upload(path, filename)
|
38
|
+
url = URI.parse(API_URL+path)
|
39
|
+
req = Net::HTTP::Post::Multipart.new( url.path, "file" => UploadIO.new(filename, "multipart/form-data"))
|
40
|
+
http = Net::HTTP.new(url.host, url.port)
|
41
|
+
req["X-TrackerToken"] = @token
|
42
|
+
# to debug
|
43
|
+
# http.set_debug_output($stderr)
|
44
|
+
|
45
|
+
if url.scheme == 'https'
|
46
|
+
http.use_ssl = true
|
47
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
48
|
+
end
|
49
|
+
|
50
|
+
response = http.request(req)
|
51
|
+
parse_response response
|
52
|
+
end
|
53
|
+
|
54
|
+
def delete(path, params={})
|
55
|
+
parse_response service[path].delete
|
56
|
+
end
|
57
|
+
protected
|
58
|
+
def parse_response(response)
|
59
|
+
case response.code.to_i
|
60
|
+
when 200, 201
|
61
|
+
JSON.parse(response.body)
|
62
|
+
when 404
|
63
|
+
raise NotFound.new(response)
|
64
|
+
else
|
65
|
+
raise ApiError.new(response)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
def service
|
69
|
+
return @service if @service
|
70
|
+
@service = ::RestClient::Resource.new(API_URL, :headers => {'X-TrackerToken' => @token} )
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module PivotalTrackerApi
|
2
|
+
module Story
|
3
|
+
|
4
|
+
def find_stories_by_project_id(project_id, params={})
|
5
|
+
get "/projects/#{project_id}/stories"
|
6
|
+
end
|
7
|
+
|
8
|
+
def find_story_by_project_id_and_id(project_id, id, params={})
|
9
|
+
get "/projects/#{project_id}/stories/#{id}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def upload_attachment(project_id, id, filename, params={})
|
13
|
+
raise ArgumentError.new(":project_id is required") unless project_id
|
14
|
+
raise ArgumentError.new(":id is required") unless id
|
15
|
+
raise ArgumentError.new(":filename is required") unless filename
|
16
|
+
attachment = create_attachment project_id, filename
|
17
|
+
upload_url = "https://www.pivotaltracker.com/#{attachment['download_url']}"
|
18
|
+
create_comment project_id, id, "text" => upload_url
|
19
|
+
end
|
20
|
+
def update_story(project_id, id, params)
|
21
|
+
put "projects/#{project_id}/stories/#{id}", params
|
22
|
+
end
|
23
|
+
def create_comment(project_id, story_id, params={})
|
24
|
+
post "/projects/#{project_id}/stories/#{story_id}/comments", params
|
25
|
+
end
|
26
|
+
def create_story(project_id, params={})
|
27
|
+
raise ArgumentError.new(":name is required") if params[:name].nil?
|
28
|
+
post "/projects/#{project_id}/stories", params
|
29
|
+
end
|
30
|
+
def create_attachment(project_id, filename)
|
31
|
+
upload "/projects/#{project_id}/uploads", File.new(filename)
|
32
|
+
# post "/projects/#{project_id}/uploads", :file => File.new(filename), :multipart => true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'pivotal_tracker_api/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "pivotal_tracker_api"
|
8
|
+
spec.version = PivotalTrackerApi::VERSION
|
9
|
+
spec.authors = ["Fabien Garcia"]
|
10
|
+
spec.email = ["fab0670312047@gmail.com"]
|
11
|
+
spec.summary = "Ruby wrapper for the Pivotal Tracker API"
|
12
|
+
spec.description = "Ruby wrapper for the Pivotal Tracker API based on V5"
|
13
|
+
spec.homepage = "https://github.com/testCloud"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec", ">= 0"
|
24
|
+
spec.add_runtime_dependency "rest-client", ">= 1.6.0"
|
25
|
+
spec.add_development_dependency "pry"
|
26
|
+
spec.add_development_dependency "webmock"
|
27
|
+
spec.add_dependency "multipart-post"
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
{
|
2
|
+
"big_url": "#",
|
3
|
+
"content_type": "image/jpeg",
|
4
|
+
"created_at": "2014-10-07T12:00:00Z",
|
5
|
+
"download_url": "/file_attachments/300/download",
|
6
|
+
"filename": "new-imperial-logo-6.jpg",
|
7
|
+
"id": 300,
|
8
|
+
"kind": "file_attachment",
|
9
|
+
"size": 7683,
|
10
|
+
"thumbnail_url": "#",
|
11
|
+
"thumbnailable": true,
|
12
|
+
"uploaded": false,
|
13
|
+
"uploader_id": 101
|
14
|
+
}
|
@@ -0,0 +1,135 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"kind": "project_membership",
|
4
|
+
"id": 100,
|
5
|
+
"person":
|
6
|
+
{
|
7
|
+
"kind": "person",
|
8
|
+
"id": 100,
|
9
|
+
"name": "Emperor Palpatine",
|
10
|
+
"email": "emperor@galacticrepublic.gov",
|
11
|
+
"initials": "EP",
|
12
|
+
"username": "palpatine"
|
13
|
+
},
|
14
|
+
"project_id": 99,
|
15
|
+
"role": "owner",
|
16
|
+
"project_color": "8100ea",
|
17
|
+
"last_viewed_at": "2014-10-07T12:00:00Z",
|
18
|
+
"wants_comment_notification_emails": false,
|
19
|
+
"will_receive_mention_notifications_or_emails": true
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"kind": "project_membership",
|
23
|
+
"id": 101,
|
24
|
+
"person":
|
25
|
+
{
|
26
|
+
"kind": "person",
|
27
|
+
"id": 101,
|
28
|
+
"name": "Darth Vader",
|
29
|
+
"email": "vader@deathstar.mil",
|
30
|
+
"initials": "DV",
|
31
|
+
"username": "vader"
|
32
|
+
},
|
33
|
+
"project_id": 99,
|
34
|
+
"role": "member",
|
35
|
+
"project_color": "8100ea",
|
36
|
+
"last_viewed_at": "2014-10-07T12:00:00Z",
|
37
|
+
"wants_comment_notification_emails": true,
|
38
|
+
"will_receive_mention_notifications_or_emails": true
|
39
|
+
},
|
40
|
+
{
|
41
|
+
"kind": "project_membership",
|
42
|
+
"id": 102,
|
43
|
+
"person":
|
44
|
+
{
|
45
|
+
"kind": "person",
|
46
|
+
"id": 102,
|
47
|
+
"name": "Wilhuff Tarkin",
|
48
|
+
"email": "governor@eriadu.gov",
|
49
|
+
"initials": "WT",
|
50
|
+
"username": "tarkin"
|
51
|
+
},
|
52
|
+
"project_id": 99,
|
53
|
+
"role": "owner",
|
54
|
+
"project_color": "8100ea",
|
55
|
+
"last_viewed_at": "2014-10-07T12:00:00Z",
|
56
|
+
"wants_comment_notification_emails": false,
|
57
|
+
"will_receive_mention_notifications_or_emails": true
|
58
|
+
},
|
59
|
+
{
|
60
|
+
"kind": "project_membership",
|
61
|
+
"id": 103,
|
62
|
+
"person":
|
63
|
+
{
|
64
|
+
"kind": "person",
|
65
|
+
"id": 103,
|
66
|
+
"name": "Moradmin Bast",
|
67
|
+
"email": "bast@deathstar.mil",
|
68
|
+
"initials": "MB",
|
69
|
+
"username": "bast"
|
70
|
+
},
|
71
|
+
"project_id": 99,
|
72
|
+
"role": "member",
|
73
|
+
"project_color": "8100ea",
|
74
|
+
"last_viewed_at": "2014-10-07T12:00:00Z",
|
75
|
+
"wants_comment_notification_emails": true,
|
76
|
+
"will_receive_mention_notifications_or_emails": true
|
77
|
+
},
|
78
|
+
{
|
79
|
+
"kind": "project_membership",
|
80
|
+
"id": 104,
|
81
|
+
"person":
|
82
|
+
{
|
83
|
+
"kind": "person",
|
84
|
+
"id": 104,
|
85
|
+
"name": "Clone TK421",
|
86
|
+
"email": "tk421@deathstar.mil",
|
87
|
+
"initials": "TK421",
|
88
|
+
"username": "tk421"
|
89
|
+
},
|
90
|
+
"project_id": 99,
|
91
|
+
"role": "member",
|
92
|
+
"project_color": "8100ea",
|
93
|
+
"last_viewed_at": "2014-10-07T12:00:00Z",
|
94
|
+
"wants_comment_notification_emails": true,
|
95
|
+
"will_receive_mention_notifications_or_emails": true
|
96
|
+
},
|
97
|
+
{
|
98
|
+
"kind": "project_membership",
|
99
|
+
"id": 105,
|
100
|
+
"person":
|
101
|
+
{
|
102
|
+
"kind": "person",
|
103
|
+
"id": 105,
|
104
|
+
"name": "Robotic Maintenance Team 4",
|
105
|
+
"email": "I662@deathstar.mil",
|
106
|
+
"initials": "i662",
|
107
|
+
"username": "i662"
|
108
|
+
},
|
109
|
+
"project_id": 99,
|
110
|
+
"role": "member",
|
111
|
+
"project_color": "8100ea",
|
112
|
+
"last_viewed_at": "2014-10-07T12:00:00Z",
|
113
|
+
"wants_comment_notification_emails": true,
|
114
|
+
"will_receive_mention_notifications_or_emails": true
|
115
|
+
},
|
116
|
+
{
|
117
|
+
"kind": "project_membership",
|
118
|
+
"id": 107,
|
119
|
+
"person":
|
120
|
+
{
|
121
|
+
"kind": "person",
|
122
|
+
"id": 107,
|
123
|
+
"name": "Bevel Lemelisk",
|
124
|
+
"email": "bevel@sith.mil",
|
125
|
+
"initials": "bl",
|
126
|
+
"username": "bevel"
|
127
|
+
},
|
128
|
+
"project_id": 99,
|
129
|
+
"role": "viewer",
|
130
|
+
"project_color": "8100ea",
|
131
|
+
"last_viewed_at": "2014-10-07T12:00:05Z",
|
132
|
+
"wants_comment_notification_emails": false,
|
133
|
+
"will_receive_mention_notifications_or_emails": true
|
134
|
+
}
|
135
|
+
]
|
Binary file
|
@@ -0,0 +1,18 @@
|
|
1
|
+
{
|
2
|
+
"created_at": "2014-10-07T12:00:00Z",
|
3
|
+
"current_state": "unscheduled",
|
4
|
+
"id": 2300,
|
5
|
+
"kind": "story",
|
6
|
+
"labels":
|
7
|
+
[
|
8
|
+
],
|
9
|
+
"name": "Exhaust ports are ray shielded",
|
10
|
+
"owner_ids":
|
11
|
+
[
|
12
|
+
],
|
13
|
+
"project_id": 99,
|
14
|
+
"requested_by_id": 101,
|
15
|
+
"story_type": "feature",
|
16
|
+
"updated_at": "2014-10-07T12:00:00Z",
|
17
|
+
"url": "http://localhost/story/show/2300"
|
18
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
{
|
2
|
+
"account_id": 100,
|
3
|
+
"atom_enabled": true,
|
4
|
+
"automatic_planning": true,
|
5
|
+
"bugs_and_chores_are_estimatable": false,
|
6
|
+
"created_at": "2014-10-07T12:00:05Z",
|
7
|
+
"current_iteration_number": 15,
|
8
|
+
"description": "Expeditionary Battle Planetoid",
|
9
|
+
"enable_following": true,
|
10
|
+
"enable_incoming_emails": true,
|
11
|
+
"enable_tasks": true,
|
12
|
+
"has_google_domain": false,
|
13
|
+
"id": 99,
|
14
|
+
"initial_velocity": 10,
|
15
|
+
"iteration_length": 1,
|
16
|
+
"kind": "project",
|
17
|
+
"name": "Death Star",
|
18
|
+
"number_of_done_iterations_to_show": 12,
|
19
|
+
"point_scale": "0,1,2,3",
|
20
|
+
"point_scale_is_custom": false,
|
21
|
+
"profile_content": "This is a machine of war such as the universe has never known. It's colossal, the size of a class-four moon. And it possesses firepower unequaled in the history of warfare.",
|
22
|
+
"public": false,
|
23
|
+
"start_date": "2014-06-23",
|
24
|
+
"start_time": "2014-10-07T12:00:10Z",
|
25
|
+
"time_zone":
|
26
|
+
{
|
27
|
+
"kind": "time_zone",
|
28
|
+
"olson_name": "America/Los_Angeles",
|
29
|
+
"offset": "-07:00"
|
30
|
+
},
|
31
|
+
"updated_at": "2014-10-07T12:00:10Z",
|
32
|
+
"velocity_averaged_over": 3,
|
33
|
+
"version": 62,
|
34
|
+
"week_start_day": "Monday"
|
35
|
+
}
|
@@ -0,0 +1,69 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"id": 98,
|
4
|
+
"kind": "project",
|
5
|
+
"name": "Learn About the Force",
|
6
|
+
"version": 2,
|
7
|
+
"iteration_length": 1,
|
8
|
+
"week_start_day": "Monday",
|
9
|
+
"point_scale": "0,1,2,3",
|
10
|
+
"point_scale_is_custom": false,
|
11
|
+
"bugs_and_chores_are_estimatable": false,
|
12
|
+
"automatic_planning": true,
|
13
|
+
"enable_tasks": true,
|
14
|
+
"time_zone":
|
15
|
+
{
|
16
|
+
"kind": "time_zone",
|
17
|
+
"olson_name": "America/Los_Angeles",
|
18
|
+
"offset": "-07:00"
|
19
|
+
},
|
20
|
+
"velocity_averaged_over": 3,
|
21
|
+
"number_of_done_iterations_to_show": 12,
|
22
|
+
"has_google_domain": false,
|
23
|
+
"enable_incoming_emails": true,
|
24
|
+
"initial_velocity": 10,
|
25
|
+
"public": false,
|
26
|
+
"atom_enabled": true,
|
27
|
+
"start_time": "2014-10-07T12:00:05Z",
|
28
|
+
"created_at": "2014-10-07T12:00:10Z",
|
29
|
+
"updated_at": "2014-10-07T12:00:15Z",
|
30
|
+
"account_id": 100,
|
31
|
+
"current_iteration_number": 1,
|
32
|
+
"enable_following": true
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"id": 99,
|
36
|
+
"kind": "project",
|
37
|
+
"name": "Death Star",
|
38
|
+
"version": 62,
|
39
|
+
"iteration_length": 1,
|
40
|
+
"week_start_day": "Monday",
|
41
|
+
"point_scale": "0,1,2,3",
|
42
|
+
"point_scale_is_custom": false,
|
43
|
+
"bugs_and_chores_are_estimatable": false,
|
44
|
+
"automatic_planning": true,
|
45
|
+
"enable_tasks": true,
|
46
|
+
"time_zone":
|
47
|
+
{
|
48
|
+
"kind": "time_zone",
|
49
|
+
"olson_name": "America/Los_Angeles",
|
50
|
+
"offset": "-07:00"
|
51
|
+
},
|
52
|
+
"velocity_averaged_over": 3,
|
53
|
+
"number_of_done_iterations_to_show": 12,
|
54
|
+
"has_google_domain": false,
|
55
|
+
"description": "Expeditionary Battle Planetoid",
|
56
|
+
"profile_content": "This is a machine of war such as the universe has never known. It's colossal, the size of a class-four moon. And it possesses firepower unequaled in the history of warfare.",
|
57
|
+
"enable_incoming_emails": true,
|
58
|
+
"initial_velocity": 10,
|
59
|
+
"public": false,
|
60
|
+
"atom_enabled": true,
|
61
|
+
"start_date": "2014-06-23",
|
62
|
+
"start_time": "2014-10-07T12:00:15Z",
|
63
|
+
"created_at": "2014-10-07T12:00:10Z",
|
64
|
+
"updated_at": "2014-10-07T12:00:15Z",
|
65
|
+
"account_id": 100,
|
66
|
+
"current_iteration_number": 15,
|
67
|
+
"enable_following": true
|
68
|
+
}
|
69
|
+
]
|
@@ -0,0 +1 @@
|
|
1
|
+
{"comment":{"text":"Here are the new plans.","file_attachments":[{"type":"file_attachment","id":21,"filename":"Corellian corvette deck plan.tiff","created_at":1412683200000,"uploader_id":101,"thumbnailable":false,"height":216,"width":650,"size":561878,"download_url":"/attachments/0000/0021/Corellian corvette deck plan_big.tiff","thumbnail_url":"/attachments/0000/0021/Corellian corvette deck plan_thumb.tiff"}]},"current_state":"rejected"}
|
@@ -0,0 +1,87 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"kind": "story",
|
4
|
+
"id": 560,
|
5
|
+
"created_at": 1412683200000,
|
6
|
+
"updated_at": 1412683200000,
|
7
|
+
"story_type": "bug",
|
8
|
+
"name": "Tractor beam loses power intermittently",
|
9
|
+
"current_state": "unstarted",
|
10
|
+
"requested_by_id": 102,
|
11
|
+
"project_id": 99,
|
12
|
+
"url": "http://localhost/story/show/560",
|
13
|
+
"owner_ids":
|
14
|
+
[
|
15
|
+
],
|
16
|
+
"labels":
|
17
|
+
[
|
18
|
+
]
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"kind": "story",
|
22
|
+
"id": 565,
|
23
|
+
"created_at": 1412683200000,
|
24
|
+
"updated_at": 1412683200000,
|
25
|
+
"story_type": "chore",
|
26
|
+
"name": "Repair CommLink",
|
27
|
+
"description": "It's malfunctioning.",
|
28
|
+
"current_state": "unstarted",
|
29
|
+
"requested_by_id": 104,
|
30
|
+
"project_id": 99,
|
31
|
+
"url": "http://localhost/story/show/565",
|
32
|
+
"owner_ids":
|
33
|
+
[
|
34
|
+
],
|
35
|
+
"labels":
|
36
|
+
[
|
37
|
+
{
|
38
|
+
"id": 2010,
|
39
|
+
"project_id": 99,
|
40
|
+
"kind": "label",
|
41
|
+
"name": "mnt",
|
42
|
+
"created_at": 1412683200000,
|
43
|
+
"updated_at": 1412683200000
|
44
|
+
}
|
45
|
+
]
|
46
|
+
},
|
47
|
+
{
|
48
|
+
"kind": "story",
|
49
|
+
"id": 552,
|
50
|
+
"created_at": 1412683200000,
|
51
|
+
"updated_at": 1412683200000,
|
52
|
+
"deadline": 1412683205000,
|
53
|
+
"story_type": "release",
|
54
|
+
"name": "Battlestation fully operational",
|
55
|
+
"description": "Everything is proceeding as I have foreseen.",
|
56
|
+
"current_state": "unstarted",
|
57
|
+
"requested_by_id": 100,
|
58
|
+
"project_id": 99,
|
59
|
+
"url": "http://localhost/story/show/552",
|
60
|
+
"owner_ids":
|
61
|
+
[
|
62
|
+
],
|
63
|
+
"labels":
|
64
|
+
[
|
65
|
+
]
|
66
|
+
},
|
67
|
+
{
|
68
|
+
"kind": "story",
|
69
|
+
"id": 555,
|
70
|
+
"created_at": 1412683200000,
|
71
|
+
"updated_at": 1412683200000,
|
72
|
+
"estimate": 2,
|
73
|
+
"story_type": "feature",
|
74
|
+
"name": "Bring me the passengers",
|
75
|
+
"description": "ignore the droids",
|
76
|
+
"current_state": "unstarted",
|
77
|
+
"requested_by_id": 101,
|
78
|
+
"project_id": 99,
|
79
|
+
"url": "http://localhost/story/show/555",
|
80
|
+
"owner_ids":
|
81
|
+
[
|
82
|
+
],
|
83
|
+
"labels":
|
84
|
+
[
|
85
|
+
]
|
86
|
+
}
|
87
|
+
]
|
@@ -0,0 +1,20 @@
|
|
1
|
+
{
|
2
|
+
"created_at": "2014-10-07T12:00:00Z",
|
3
|
+
"current_state": "unstarted",
|
4
|
+
"description": "ignore the droids",
|
5
|
+
"estimate": 2,
|
6
|
+
"id": 555,
|
7
|
+
"kind": "story",
|
8
|
+
"labels":
|
9
|
+
[
|
10
|
+
],
|
11
|
+
"name": "Bring me the passengers",
|
12
|
+
"owner_ids":
|
13
|
+
[
|
14
|
+
],
|
15
|
+
"project_id": 99,
|
16
|
+
"requested_by_id": 101,
|
17
|
+
"story_type": "feature",
|
18
|
+
"updated_at": "2014-10-07T12:00:00Z",
|
19
|
+
"url": "http://localhost/story/show/555"
|
20
|
+
}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
{
|
2
|
+
"comments":
|
3
|
+
[
|
4
|
+
{
|
5
|
+
"text": "I want them alive!",
|
6
|
+
"file_attachments":
|
7
|
+
[
|
8
|
+
{
|
9
|
+
"kind": "file_attachment",
|
10
|
+
"id": 21,
|
11
|
+
"filename": "Corellian corvette deck plan.tiff",
|
12
|
+
"created_at": "2014-10-07T12:00:05Z",
|
13
|
+
"uploader_id": 101,
|
14
|
+
"thumbnailable": false,
|
15
|
+
"height": 216,
|
16
|
+
"width": 650,
|
17
|
+
"size": 561878,
|
18
|
+
"download_url": "/attachments/0000/0021/Corellian corvette deck plan_big.tiff",
|
19
|
+
"thumbnail_url": "/attachments/0000/0021/Corellian corvette deck plan_thumb.tiff"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"kind": "file_attachment",
|
23
|
+
"id": 20,
|
24
|
+
"filename": "empire.png",
|
25
|
+
"created_at": "2014-10-07T12:00:00Z",
|
26
|
+
"uploader_id": 100,
|
27
|
+
"thumbnailable": true,
|
28
|
+
"height": 804,
|
29
|
+
"width": 1000,
|
30
|
+
"size": 82382,
|
31
|
+
"download_url": "/attachments/0000/0020/empire_big.png",
|
32
|
+
"thumbnail_url": "/attachments/0000/0020/empire_thumb.png"
|
33
|
+
}
|
34
|
+
],
|
35
|
+
"id": 111
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"text": "Here are the new plans.",
|
39
|
+
"file_attachments":
|
40
|
+
[
|
41
|
+
{
|
42
|
+
"kind": "file_attachment",
|
43
|
+
"id": 21,
|
44
|
+
"filename": "Corellian corvette deck plan.tiff",
|
45
|
+
"created_at": "2014-10-07T12:00:05Z",
|
46
|
+
"uploader_id": 101,
|
47
|
+
"thumbnailable": false,
|
48
|
+
"height": 216,
|
49
|
+
"width": 650,
|
50
|
+
"size": 561878,
|
51
|
+
"download_url": "/attachments/0000/0021/Corellian corvette deck plan_big.tiff",
|
52
|
+
"thumbnail_url": "/attachments/0000/0021/Corellian corvette deck plan_thumb.tiff"
|
53
|
+
}
|
54
|
+
],
|
55
|
+
"id": 300
|
56
|
+
}
|
57
|
+
],
|
58
|
+
"id": 555,
|
59
|
+
"labels":
|
60
|
+
[
|
61
|
+
],
|
62
|
+
"requested_by":
|
63
|
+
{
|
64
|
+
"kind": "person",
|
65
|
+
"id": 101,
|
66
|
+
"name": "Darth Vader",
|
67
|
+
"email": "vader@deathstar.mil",
|
68
|
+
"initials": "DV",
|
69
|
+
"username": "vader"
|
70
|
+
},
|
71
|
+
"tasks":
|
72
|
+
[
|
73
|
+
]
|
74
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Comment" do
|
4
|
+
before :all do
|
5
|
+
@token = "wertyuioppoiuyt"
|
6
|
+
@project_id = 99
|
7
|
+
@story_id = 555
|
8
|
+
@service = PivotalTrackerApi::API.new(@token)
|
9
|
+
end
|
10
|
+
it "should create comment on story" do
|
11
|
+
comment = File.read "spec/fixtures/comment.json"
|
12
|
+
stub_request(:post, "#{API_URL}/projects/#{@project_id}/stories/#{@story_id}/comments").to_return(:status => 200, :body => comment)
|
13
|
+
|
14
|
+
res = @service.create_comment(@project_id, @story_id, :text => "If this is a consular ship, then where is the ambassador?")
|
15
|
+
expect(res).to eq(JSON.parse(comment))
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Membership" do
|
4
|
+
before :all do
|
5
|
+
@token = "wertyuioppoiuyt"
|
6
|
+
@project_id = 99
|
7
|
+
@service = PivotalTrackerApi::API.new(@token)
|
8
|
+
end
|
9
|
+
it "should find every membership by project id" do
|
10
|
+
memberships = File.read "spec/fixtures/memberships.json"
|
11
|
+
stub_request(:get, "#{API_URL}/projects/#{@project_id}/memberships").to_return(:status => 200, :body => memberships)
|
12
|
+
|
13
|
+
res = @service.find_membership_by_project_id(@project_id)
|
14
|
+
expect(res).to eq(JSON.parse(memberships))
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Project" do
|
4
|
+
before :all do
|
5
|
+
@token = "wertyuioppoiuyt"
|
6
|
+
@project_id = 99
|
7
|
+
@service = PivotalTrackerApi::API.new(@token)
|
8
|
+
end
|
9
|
+
it "should find every project" do
|
10
|
+
projects = File.read "spec/fixtures/projects.json"
|
11
|
+
stub_request(:get, "#{API_URL}/projects")
|
12
|
+
.with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'User-Agent'=>'Ruby', 'X-Trackertoken'=> @token })
|
13
|
+
.to_return(:status => 200, :body => projects)
|
14
|
+
|
15
|
+
res = @service.projects
|
16
|
+
expect(res).to eq(JSON.parse(projects))
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should find specific project" do
|
20
|
+
project = File.read "spec/fixtures/project.json"
|
21
|
+
stub_request(:get, "#{API_URL}/projects/#{@project_id}").to_return(:status => 200, :body => project)
|
22
|
+
|
23
|
+
res = @service.find_project_by_id(@project_id)
|
24
|
+
expect(res).to eq(JSON.parse(project))
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Stories" do
|
4
|
+
before :all do
|
5
|
+
@project_id = 99
|
6
|
+
@story_id = 555
|
7
|
+
@token = "wertyuioppoiuyt"
|
8
|
+
@service = PivotalTrackerApi::API.new(@token)
|
9
|
+
end
|
10
|
+
it "should find every stories of a project" do
|
11
|
+
stories = File.read "spec/fixtures/stories.json"
|
12
|
+
stub_request(:get, "#{API_URL}/projects/#{@project_id}/stories").to_return(:status => 200, :body => stories)
|
13
|
+
res = @service.find_stories_by_project_id(@project_id)
|
14
|
+
expect(res).to eq(JSON.parse(stories))
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find specfic story" do
|
18
|
+
story = File.read "spec/fixtures/story.json"
|
19
|
+
stub_request(:get, "#{API_URL}/projects/#{@project_id}/stories/#{@story_id}").to_return(:status => 200, :body => story)
|
20
|
+
res = @service.find_story_by_project_id_and_id(@project_id, @story_id)
|
21
|
+
expect(res).to eq(JSON.parse(story))
|
22
|
+
end
|
23
|
+
it "should create a story" do
|
24
|
+
new_story = File.read "spec/fixtures/new_story.json"
|
25
|
+
stub_request(:post, "#{API_URL}/projects/#{@project_id}/stories")
|
26
|
+
.with(:body => {"name" => "Exhaust ports are ray shielded"} )
|
27
|
+
.to_return(:status => 200, :body => new_story)
|
28
|
+
|
29
|
+
res = @service.create_story(@project_id, :name => "Exhaust ports are ray shielded")
|
30
|
+
expect(res).to eq(JSON.parse(new_story))
|
31
|
+
end
|
32
|
+
it "should raise an error for unvalid story creation" do
|
33
|
+
expect { @service.create_story(@project_id, :other_attribute => "wrong") }.to raise_error(PivotalTrackerApi::ArgumentError)
|
34
|
+
end
|
35
|
+
it "should upload attachment" do
|
36
|
+
attachment = File.read "spec/fixtures/attachment.json"
|
37
|
+
request_story_update = File.read "spec/fixtures/request_story_update.json"
|
38
|
+
story_updated = File.read "spec/fixtures/story_updated.json"
|
39
|
+
|
40
|
+
stub_request(:post, "#{API_URL}/projects/#{@project_id}/uploads").to_return(:status => 200, :body => attachment)
|
41
|
+
# stub_request(:put, "#{API_URL}/projects/#{@project_id}/stories/#{@story_id}").with(:body => request_story_update).to_return(:status => 200, :body => story_updated)
|
42
|
+
|
43
|
+
stub_request(:post, "https://www.pivotaltracker.com/services/v5/projects/#{@project_id}/stories/#{@story_id}/comments")
|
44
|
+
.with(:body => {"text"=>"https://www.pivotaltracker.com/file_attachments/300/download"},
|
45
|
+
:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Content-Length'=>'77', 'Content-Type'=>'application/x-www-form-urlencoded', 'User-Agent'=>'Ruby', 'X-Trackertoken'=>@token})
|
46
|
+
.to_return(:status => 200, :body => story_updated)
|
47
|
+
|
48
|
+
|
49
|
+
res = @service.upload_attachment(@project_id, @story_id, "spec/fixtures/new-imperial-logo-6.jpg")
|
50
|
+
expect(res).to eq(JSON.parse(story_updated))
|
51
|
+
end
|
52
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
require 'pry'
|
4
|
+
require 'pivotal_tracker_api'
|
5
|
+
# Requires supporting files with custom matchers and macros, etc,
|
6
|
+
# in ./support/ and its subdirectories.
|
7
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
8
|
+
API_URL = PivotalTrackerApi::API.const_get("API_URL")
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
|
12
|
+
# Allow focus on a specific test if specified
|
13
|
+
config.filter_run :focus => true
|
14
|
+
config.run_all_when_everything_filtered = true
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pivotal_tracker_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabien Garcia
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rest-client
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.6.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.6.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: webmock
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: multipart-post
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Ruby wrapper for the Pivotal Tracker API based on V5
|
112
|
+
email:
|
113
|
+
- fab0670312047@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- .gitignore
|
119
|
+
- .rspec
|
120
|
+
- Gemfile
|
121
|
+
- LICENSE.txt
|
122
|
+
- README.md
|
123
|
+
- Rakefile
|
124
|
+
- lib/pivotal_tracker_api.rb
|
125
|
+
- lib/pivotal_tracker_api/project.rb
|
126
|
+
- lib/pivotal_tracker_api/project_membership.rb
|
127
|
+
- lib/pivotal_tracker_api/story.rb
|
128
|
+
- lib/pivotal_tracker_api/version.rb
|
129
|
+
- pivotal_tracker_api.gemspec
|
130
|
+
- spec/fixtures/attachment.json
|
131
|
+
- spec/fixtures/comment.json
|
132
|
+
- spec/fixtures/memberships.json
|
133
|
+
- spec/fixtures/new-imperial-logo-6.jpg
|
134
|
+
- spec/fixtures/new_story.json
|
135
|
+
- spec/fixtures/project.json
|
136
|
+
- spec/fixtures/projects.json
|
137
|
+
- spec/fixtures/request_story_update.json
|
138
|
+
- spec/fixtures/stories.json
|
139
|
+
- spec/fixtures/story.json
|
140
|
+
- spec/fixtures/story_updated.json
|
141
|
+
- spec/pivotal_traker_api/comment_spec.rb
|
142
|
+
- spec/pivotal_traker_api/membership_spec.rb
|
143
|
+
- spec/pivotal_traker_api/project_spec.rb
|
144
|
+
- spec/pivotal_traker_api/story_spec.rb
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
homepage: https://github.com/testCloud
|
147
|
+
licenses:
|
148
|
+
- MIT
|
149
|
+
metadata: {}
|
150
|
+
post_install_message:
|
151
|
+
rdoc_options: []
|
152
|
+
require_paths:
|
153
|
+
- lib
|
154
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ! '>='
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
requirements: []
|
165
|
+
rubyforge_project:
|
166
|
+
rubygems_version: 2.0.14
|
167
|
+
signing_key:
|
168
|
+
specification_version: 4
|
169
|
+
summary: Ruby wrapper for the Pivotal Tracker API
|
170
|
+
test_files:
|
171
|
+
- spec/fixtures/attachment.json
|
172
|
+
- spec/fixtures/comment.json
|
173
|
+
- spec/fixtures/memberships.json
|
174
|
+
- spec/fixtures/new-imperial-logo-6.jpg
|
175
|
+
- spec/fixtures/new_story.json
|
176
|
+
- spec/fixtures/project.json
|
177
|
+
- spec/fixtures/projects.json
|
178
|
+
- spec/fixtures/request_story_update.json
|
179
|
+
- spec/fixtures/stories.json
|
180
|
+
- spec/fixtures/story.json
|
181
|
+
- spec/fixtures/story_updated.json
|
182
|
+
- spec/pivotal_traker_api/comment_spec.rb
|
183
|
+
- spec/pivotal_traker_api/membership_spec.rb
|
184
|
+
- spec/pivotal_traker_api/project_spec.rb
|
185
|
+
- spec/pivotal_traker_api/story_spec.rb
|
186
|
+
- spec/spec_helper.rb
|
187
|
+
has_rdoc:
|