asana 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -2
- data/Guardfile +5 -0
- data/README.md +148 -2
- data/asana.gemspec +6 -0
- data/lib/asana/resource.rb +9 -0
- data/lib/asana/resources/project.rb +4 -0
- data/lib/asana/resources/task.rb +6 -0
- data/lib/asana/resources/user.rb +4 -4
- data/lib/asana/resources/workspace.rb +9 -2
- data/lib/asana/version.rb +1 -1
- data/spec/asana/resources/project_spec.rb +51 -0
- data/spec/asana/resources/story_spec.rb +33 -0
- data/spec/asana/resources/task_spec.rb +27 -0
- data/spec/asana/resources/user_spec.rb +74 -0
- data/spec/asana/resources/workspace_spec.rb +76 -0
- data/spec/spec_helper.rb +9 -0
- metadata +96 -3
data/.gitignore
CHANGED
data/Guardfile
ADDED
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# Asana
|
2
2
|
|
3
|
-
|
3
|
+
This gem is a simple Ruby wrapper for the Asana REST API. It uses
|
4
|
+
[ActiveResource][] to provide a simple, familiar interface for accessing
|
5
|
+
your Asana account.
|
6
|
+
|
7
|
+
To learn more, check out the [Asana API Documentation][].
|
4
8
|
|
5
9
|
## Installation
|
6
10
|
|
@@ -18,7 +22,140 @@ Or install it yourself as:
|
|
18
22
|
|
19
23
|
## Usage
|
20
24
|
|
21
|
-
|
25
|
+
In order to access Asana, you need to provide your [API key][].
|
26
|
+
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Asana.configure do |client|
|
30
|
+
client.api_key = 'your_asana_api_key'
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
As a sanity check, you can fetch the object representing your user.
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
Asana::User.me
|
38
|
+
```
|
39
|
+
|
40
|
+
### [Users][]
|
41
|
+
|
42
|
+
> A user object represents an account in Asana that can be given access to
|
43
|
+
> various workspaces, projects, and tasks.
|
44
|
+
>
|
45
|
+
> Like other objects in the system, users are referred to by numerical IDs.
|
46
|
+
> However, the special string identifier me can be used anywhere a user ID is
|
47
|
+
> accepted, to refer to the current authenticated user.
|
48
|
+
|
49
|
+
**Note:** It is not possible to create, update, or delete a user from
|
50
|
+
the API.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
# Get users from all of your workspaces
|
54
|
+
users = Asana::User.all
|
55
|
+
|
56
|
+
# Get a specific user
|
57
|
+
user = Asana::User.find(:id)
|
58
|
+
|
59
|
+
# Get the user associated with the API key being used
|
60
|
+
user = Asana::User.me
|
61
|
+
|
62
|
+
# Get all users in a given workspace
|
63
|
+
workspace = Asana::Workspace.find(:workspace_id)
|
64
|
+
users = workspace.users
|
65
|
+
```
|
66
|
+
|
67
|
+
### [Workspaces][]
|
68
|
+
|
69
|
+
> A workspace is the most basic organizational unit in Asana. All projects
|
70
|
+
> and tasks have an associated workspace.
|
71
|
+
|
72
|
+
**Note:** It is not possible to create or delete a workspace from the API.
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
# Get all workspaces
|
76
|
+
workspaces = Asana::Workspace.all
|
77
|
+
|
78
|
+
# Get a specific workspace
|
79
|
+
workspace = Asana::Workspace.find(:id)
|
80
|
+
|
81
|
+
# Get all projects in a given workspace
|
82
|
+
projects = workspace.projects
|
83
|
+
|
84
|
+
# Get all tasks in a given workspace and assigned to the given user
|
85
|
+
tasks = workspace.tasks(:user_id)
|
86
|
+
|
87
|
+
# Get all users with access to a given workspace
|
88
|
+
users = workspace.users
|
89
|
+
|
90
|
+
# Create a new task in a given workspace and assign it to the current user
|
91
|
+
workspace.create_task(task_settings)
|
92
|
+
```
|
93
|
+
|
94
|
+
### [Projects][]
|
95
|
+
|
96
|
+
> A project represents a prioritized list of tasks in Asana. It exists in a
|
97
|
+
> single workspace and is accessible to a subset of users in that workspace
|
98
|
+
> depending on its permissions.
|
99
|
+
|
100
|
+
**Note:** It is not possible to create a project from the API.
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
# Get all projects
|
104
|
+
projects = Asana::Project.all
|
105
|
+
|
106
|
+
# Get a specific project
|
107
|
+
project = Asana::Project.find(:id)
|
108
|
+
|
109
|
+
# Get all projects in a given workspace
|
110
|
+
workspace = Asana::Workspace.find(:workspace_id)
|
111
|
+
projects = workspace.projects
|
112
|
+
```
|
113
|
+
|
114
|
+
### [Tasks][]
|
115
|
+
|
116
|
+
> The task is the basic object around which many operations in Asana are
|
117
|
+
> centered. In the Asana application, multiple tasks populate the middle
|
118
|
+
> pane according to some view parameters, and the set of selected tasks
|
119
|
+
> determine the more detailed information presented in the details pane.
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
# Get all tasks in a given project
|
123
|
+
project = Asana::Project(:project_id)
|
124
|
+
tasks = project.tasks
|
125
|
+
|
126
|
+
# Get all tasks in a given workspace
|
127
|
+
workspace = Asana::Workspace(:workspace_id)
|
128
|
+
tasks = workspace.tasks
|
129
|
+
|
130
|
+
# Get all stories for a given task
|
131
|
+
task = tasks.first
|
132
|
+
stories = task.stories
|
133
|
+
|
134
|
+
# Create a new task in a given workspace and assign it to the current user
|
135
|
+
workspace.create_task(task_settings)
|
136
|
+
|
137
|
+
# Create a new story for the given task
|
138
|
+
task.create_story(story_settings)
|
139
|
+
```
|
140
|
+
|
141
|
+
### [Stories][]
|
142
|
+
|
143
|
+
> A story represents an activity associated with an object in the Asana
|
144
|
+
> system. Stories are generated by the system whenever users take actions
|
145
|
+
> such as creating or assigning tasks, or moving tasks between projects.
|
146
|
+
> Comments are also a form of user-generated story.
|
147
|
+
|
148
|
+
**Note:** It is not possible to update a story from the API.
|
149
|
+
|
150
|
+
```ruby
|
151
|
+
# Get all stories for a given task
|
152
|
+
project = Asana::Project(:project_id)
|
153
|
+
task = project.tasks.first
|
154
|
+
stories = task.stories
|
155
|
+
|
156
|
+
# Create a new story for the given task
|
157
|
+
task.create_story(story_settings)
|
158
|
+
```
|
22
159
|
|
23
160
|
## Contributing
|
24
161
|
|
@@ -27,3 +164,12 @@ TODO: Write usage instructions here
|
|
27
164
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
28
165
|
4. Push to the branch (`git push origin my-new-feature`)
|
29
166
|
5. Create new Pull Request
|
167
|
+
|
168
|
+
[API key]: http://app.asana.com/-/account_api
|
169
|
+
[ActiveResource]: http://api.rubyonrails.org/classes/ActiveResource/Base.html
|
170
|
+
[Asana API Documentation]: http://developer.asana.com/documentation/
|
171
|
+
[Users]: http://developer.asana.com/documentation/#users
|
172
|
+
[Workspaces]: http://developer.asana.com/documentation/#workspaces
|
173
|
+
[Projects]: http://developer.asana.com/documentation/#projects
|
174
|
+
[Tasks]: http://developer.asana.com/documentation/#tasks
|
175
|
+
[Stories]: http://developer.asana.com/documentation/#stories
|
data/asana.gemspec
CHANGED
@@ -10,6 +10,12 @@ Gem::Specification.new do |gem|
|
|
10
10
|
|
11
11
|
gem.add_dependency 'activeresource', '~> 3.2.3'
|
12
12
|
|
13
|
+
gem.add_development_dependency 'growl', '~> 1.0.3'
|
14
|
+
gem.add_development_dependency 'guard-minitest', '~> 0.5.0'
|
15
|
+
gem.add_development_dependency 'minitest', '~> 2.12.1'
|
16
|
+
gem.add_development_dependency 'vcr', '~> 2.1.0'
|
17
|
+
gem.add_development_dependency 'webmock', '~> 1.8.6'
|
18
|
+
|
13
19
|
gem.files = `git ls-files`.split($\)
|
14
20
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
15
21
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
data/lib/asana/resource.rb
CHANGED
@@ -5,6 +5,15 @@ module Asana
|
|
5
5
|
def check_prefix_options(options)
|
6
6
|
end
|
7
7
|
|
8
|
+
def custom_method_collection_url(method_name, options = {})
|
9
|
+
prefix_options, query_options = split_options(options)
|
10
|
+
if method_name
|
11
|
+
"#{prefix(prefix_options)}#{collection_name}/#{method_name}.#{format.extension}#{query_string(query_options)}"
|
12
|
+
else
|
13
|
+
"#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
8
17
|
def parent_resources(*resources)
|
9
18
|
@parent_resources = resources
|
10
19
|
end
|
data/lib/asana/resources/task.rb
CHANGED
@@ -13,5 +13,11 @@ module Asana
|
|
13
13
|
def stories
|
14
14
|
Story.all_by_task(:params => { :task_id => self.id })
|
15
15
|
end
|
16
|
+
|
17
|
+
def create_story(*args)
|
18
|
+
story = Story.new
|
19
|
+
query_options = { :task => self.id }
|
20
|
+
Task.post("#{self.id}/stories", query_options.merge(args.first), story.to_json)
|
21
|
+
end
|
16
22
|
end
|
17
23
|
end
|
data/lib/asana/resources/user.rb
CHANGED
@@ -3,13 +3,13 @@ module Asana
|
|
3
3
|
alias :save :method_not_allowed
|
4
4
|
alias :destroy :method_not_allowed
|
5
5
|
|
6
|
-
def self.me
|
7
|
-
get(:me)
|
8
|
-
end
|
9
|
-
|
10
6
|
def self.all_by_workspace(*args)
|
11
7
|
parent_resources :workspace
|
12
8
|
all(*args)
|
13
9
|
end
|
10
|
+
|
11
|
+
def self.me
|
12
|
+
User.new(get(:me))
|
13
|
+
end
|
14
14
|
end
|
15
15
|
end
|
@@ -7,8 +7,15 @@ module Asana
|
|
7
7
|
Project.all_by_workspace(:params => { :workspace_id => self.id })
|
8
8
|
end
|
9
9
|
|
10
|
-
def tasks
|
11
|
-
|
10
|
+
def tasks(assignee)
|
11
|
+
query_options = { :workspace => self.id, :assignee => assignee }
|
12
|
+
Task.all_by_workspace(:params => query_options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_task(*args)
|
16
|
+
task = Task.new
|
17
|
+
query_options = { :workspace => self.id, :assignee => 'me' }
|
18
|
+
Task.post(nil, query_options.merge(args.first), task.to_json)
|
12
19
|
end
|
13
20
|
|
14
21
|
def users
|
data/lib/asana/version.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Asana
|
4
|
+
describe Project do
|
5
|
+
|
6
|
+
before do
|
7
|
+
VCR.insert_cassette('projects', :record => :new_episodes)
|
8
|
+
Asana.configure do |c|
|
9
|
+
c.api_key = ENV['ASANA_API_KEY']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
VCR.eject_cassette
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.all' do
|
18
|
+
it 'should return all of the user\'s projects' do
|
19
|
+
projects = Project.all
|
20
|
+
projects.must_be_instance_of Array
|
21
|
+
projects.first.must_be_instance_of Project
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '.all_by_workspace' do
|
26
|
+
it 'should return all projects for the given workspace' do
|
27
|
+
workspace = Workspace.all.first
|
28
|
+
projects = workspace.projects
|
29
|
+
projects.must_be_instance_of Array
|
30
|
+
projects.first.must_be_instance_of Project
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '.create' do
|
35
|
+
it 'should raise an ActiveResource::MethodNotAllowed exception' do
|
36
|
+
project = Project.new
|
37
|
+
lambda { project.save }.must_raise ActiveResource::MethodNotAllowed
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#tasks' do
|
42
|
+
it 'should return all tasks for the given project' do
|
43
|
+
projects = Project.all.first
|
44
|
+
tasks = projects.tasks
|
45
|
+
tasks.must_be_instance_of Array
|
46
|
+
tasks.first.must_be_instance_of Task
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Asana
|
4
|
+
describe Story do
|
5
|
+
|
6
|
+
before do
|
7
|
+
VCR.insert_cassette('stories', :record => :new_episodes)
|
8
|
+
Asana.configure do |c|
|
9
|
+
c.api_key = ENV['ASANA_API_KEY']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
VCR.eject_cassette
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#create_story' do
|
18
|
+
it 'should create a new story for the given task' do
|
19
|
+
task = Project.all.first.tasks.first
|
20
|
+
story = task.create_story(:text => 'foo')
|
21
|
+
story.must_be_instance_of Net::HTTPCreated
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#update' do
|
26
|
+
it 'should raise an ActiveResource::MethodNotAllowed exception' do
|
27
|
+
story = Project.all.first.tasks.first.stories.first
|
28
|
+
lambda { story.save }.must_raise ActiveResource::MethodNotAllowed
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Asana
|
4
|
+
describe Task do
|
5
|
+
|
6
|
+
before do
|
7
|
+
VCR.insert_cassette('tasks', :record => :new_episodes)
|
8
|
+
Asana.configure do |c|
|
9
|
+
c.api_key = ENV['ASANA_API_KEY']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
VCR.eject_cassette
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#stories' do
|
18
|
+
it 'should return all stories for the given task' do
|
19
|
+
task = Project.all.first.tasks.first
|
20
|
+
stories = task.stories
|
21
|
+
stories.must_be_instance_of Array
|
22
|
+
stories.first.must_be_instance_of Story
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Asana
|
4
|
+
describe User do
|
5
|
+
|
6
|
+
before do
|
7
|
+
VCR.insert_cassette('users', :record => :new_episodes)
|
8
|
+
Asana.configure do |c|
|
9
|
+
c.api_key = ENV['ASANA_API_KEY']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
VCR.eject_cassette
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.all' do
|
18
|
+
it 'should return all users for all of the user\'s workspaces' do
|
19
|
+
users = User.all
|
20
|
+
users.must_be_instance_of Array
|
21
|
+
users.first.must_be_instance_of User
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '.all_by_workspace' do
|
26
|
+
it 'should return all users for the given workspace' do
|
27
|
+
user = User.me
|
28
|
+
workspace = user.workspaces.first
|
29
|
+
users = workspace.users
|
30
|
+
users.must_be_instance_of Array
|
31
|
+
users.first.must_be_instance_of User
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '.find' do
|
36
|
+
it 'should return the user with the given ID' do
|
37
|
+
user = User.me
|
38
|
+
user = User.find(user.id)
|
39
|
+
user.wont_be_nil
|
40
|
+
user.must_be_instance_of User
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '.me' do
|
45
|
+
it 'should return the user associated with the given API key' do
|
46
|
+
user = User.me
|
47
|
+
user.wont_be_nil
|
48
|
+
user.must_be_instance_of User
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#save' do
|
53
|
+
it 'should raise an ActiveResource::MethodNotAllowed exception' do
|
54
|
+
user = User.me
|
55
|
+
lambda { user.save }.must_raise ActiveResource::MethodNotAllowed
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#update' do
|
60
|
+
it 'should raise an ActiveResource::MethodNotAllowed exception' do
|
61
|
+
user = User.me
|
62
|
+
lambda { user.update_attribute(:name, 'foo') }.must_raise ActiveResource::MethodNotAllowed
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#destroy' do
|
67
|
+
it 'should raise an ActiveResource::MethodNotAllowed exception' do
|
68
|
+
user = User.me
|
69
|
+
lambda { user.destroy }.must_raise ActiveResource::MethodNotAllowed
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Asana
|
4
|
+
describe Workspace do
|
5
|
+
|
6
|
+
before do
|
7
|
+
VCR.insert_cassette('workspaces', :record => :new_episodes)
|
8
|
+
Asana.configure do |c|
|
9
|
+
c.api_key = ENV['ASANA_API_KEY']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
after do
|
14
|
+
VCR.eject_cassette
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.all' do
|
18
|
+
it 'should return all of the user\'s workspaces' do
|
19
|
+
workspaces = Workspace.all
|
20
|
+
workspaces.must_be_instance_of Array
|
21
|
+
workspaces.first.must_be_instance_of Workspace
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#create_task' do
|
26
|
+
it 'should create a new task for the given workspace' do
|
27
|
+
workspace = Workspace.all.first
|
28
|
+
task = workspace.create_task(:name => 'foo')
|
29
|
+
task.must_be_instance_of Net::HTTPCreated
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#projects' do
|
34
|
+
it 'should return all projects for the given workspace' do
|
35
|
+
workspace = Workspace.all.first
|
36
|
+
projects = workspace.projects
|
37
|
+
projects.must_be_instance_of Array
|
38
|
+
projects.first.must_be_instance_of Project
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#tasks' do
|
43
|
+
it 'should return all tasks for the given workspace' do
|
44
|
+
workspace = Workspace.all.first
|
45
|
+
user = User.all.first
|
46
|
+
tasks = workspace.tasks(user.id)
|
47
|
+
tasks.must_be_instance_of Array
|
48
|
+
tasks.first.must_be_instance_of Task
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#users' do
|
53
|
+
it 'should return all users for the given workspace' do
|
54
|
+
workspace = Workspace.all.first
|
55
|
+
users = workspace.users
|
56
|
+
users.must_be_instance_of Array
|
57
|
+
users.first.must_be_instance_of User
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#create' do
|
62
|
+
it 'should raise an ActiveResource::MethodNotAllowed exception' do
|
63
|
+
workspace = Workspace.new
|
64
|
+
lambda { workspace.save }.must_raise ActiveResource::MethodNotAllowed
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#destroy' do
|
69
|
+
it 'should raise an ActiveResource::MethodNotAllowed exception' do
|
70
|
+
workspace = Workspace.all.first
|
71
|
+
lambda { workspace.destroy }.must_raise ActiveResource::MethodNotAllowed
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activeresource
|
@@ -27,6 +27,86 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 3.2.3
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: growl
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.0.3
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.0.3
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: guard-minitest
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.5.0
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.5.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: minitest
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.12.1
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.12.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: vcr
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 2.1.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.1.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: webmock
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 1.8.6
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.8.6
|
30
110
|
description: Ruby wrapper for the Asana REST API
|
31
111
|
email:
|
32
112
|
- ryan@rbright.net
|
@@ -36,6 +116,7 @@ extra_rdoc_files: []
|
|
36
116
|
files:
|
37
117
|
- .gitignore
|
38
118
|
- Gemfile
|
119
|
+
- Guardfile
|
39
120
|
- LICENSE
|
40
121
|
- README.md
|
41
122
|
- Rakefile
|
@@ -49,6 +130,12 @@ files:
|
|
49
130
|
- lib/asana/resources/user.rb
|
50
131
|
- lib/asana/resources/workspace.rb
|
51
132
|
- lib/asana/version.rb
|
133
|
+
- spec/asana/resources/project_spec.rb
|
134
|
+
- spec/asana/resources/story_spec.rb
|
135
|
+
- spec/asana/resources/task_spec.rb
|
136
|
+
- spec/asana/resources/user_spec.rb
|
137
|
+
- spec/asana/resources/workspace_spec.rb
|
138
|
+
- spec/spec_helper.rb
|
52
139
|
homepage: http://github.com/rbright/asana
|
53
140
|
licenses: []
|
54
141
|
post_install_message:
|
@@ -73,5 +160,11 @@ rubygems_version: 1.8.21
|
|
73
160
|
signing_key:
|
74
161
|
specification_version: 3
|
75
162
|
summary: Ruby wrapper for the Asana REST API
|
76
|
-
test_files:
|
163
|
+
test_files:
|
164
|
+
- spec/asana/resources/project_spec.rb
|
165
|
+
- spec/asana/resources/story_spec.rb
|
166
|
+
- spec/asana/resources/task_spec.rb
|
167
|
+
- spec/asana/resources/user_spec.rb
|
168
|
+
- spec/asana/resources/workspace_spec.rb
|
169
|
+
- spec/spec_helper.rb
|
77
170
|
has_rdoc:
|