asana-ruby 0.0.2 → 0.0.3

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fcb87ac5035e40cf6275846cbeb6eb1d2bfa544c
4
+ data.tar.gz: 64791fb64e5711bd87b63eec22392c4a24fb3fc1
5
+ SHA512:
6
+ metadata.gz: dab1fb334f808dd446e96b13a7f3bab3d02cfe76d6bde00934d0eeed21ff58e6a21c78e79408156ba0a96b0394989c5a909d32ff7e383e178f1eb0bf94b249be
7
+ data.tar.gz: f117a8d20c4e1de00c7544050183183f29187b23797017ef99e761d8c73e70401b110cd4ab430d54a8eb3329af2dc7616032a510918d3ac45cb2ecf759a605a2
@@ -0,0 +1 @@
1
+ asana-ruby
@@ -0,0 +1 @@
1
+ 2.0.0
@@ -21,7 +21,7 @@ Gem::Specification.new do |gem|
21
21
  gem.add_development_dependency 'rspec', '~> 2.11'
22
22
  gem.add_development_dependency 'guard'
23
23
  gem.add_development_dependency 'guard-rspec'
24
- gem.add_development_dependency 'vcr', '~> 2.2.4'
24
+ gem.add_development_dependency 'vcr', '2.6.0'
25
25
  gem.add_development_dependency 'webmock', '~> 1.8.8'
26
26
  gem.add_development_dependency 'pry'
27
27
  gem.add_development_dependency 'pry-debugger'
@@ -1,3 +1,5 @@
1
1
  class Asana::Tag < Asana::Resource
2
-
2
+ def tasks
3
+ get(:tasks)
4
+ end
3
5
  end
@@ -1,5 +1,5 @@
1
1
  module Asana
2
- class Task < Asana::Resource
2
+ class Task < Resource
3
3
  # don't want update_attribute because it posts all data to asana instead of just changed attributes
4
4
  alias :update_attribute :method_not_allowed
5
5
  # create a task via a project or workspace instead
@@ -1,4 +1,3 @@
1
- require 'pry'
2
1
  module Asana
3
2
  class Workspace < Asana::Resource
4
3
  def create_task(options = {})
@@ -20,24 +19,47 @@ module Asana
20
19
  def tasks(options = {})
21
20
  options.merge!(assignee: 'me') unless options[:assignee] or options['assignee']
22
21
 
23
- get("tasks?assignee=#{options[:assignee]}").map{|h| Asana::Task.find h["id"]}
22
+ url = "tasks?assignee=#{options[:assignee]}"
23
+
24
+ url += "&include_archived=true" if options[:include_archived]
25
+
26
+ get(url).map { |h| Asana::Task.find h["id"] }
24
27
  rescue Exception => e
25
28
  $stderr.puts "ERROR: #{e.message}"
26
29
  $stderr.puts "RESPONSE: #{e.response.body}" if e.respond_to?(:response)
27
30
  end
28
31
 
32
+ def completed_tasks
33
+ tasks.select(&:completed?)
34
+ end
35
+
29
36
  # TODO imporve this when Asana API is more advanced
30
37
  def find_or_create_tag(options = {})
31
- tags.find {|t| t.name == options[:name]} || create_tag(options)
38
+ options[:name].strip! if options[:name]
39
+
40
+ # try to load from cache first, if not found, force reload, if still not found, create one
41
+ find_tag_from_list(tags, options) || find_tag_from_list(tags(true), options) || create_tag(options)
32
42
  end
33
43
 
34
44
  def create_tag(options = {})
35
45
  response = post("tags", nil, {data: options}.to_json)
36
- Asana::Tag.new(connection.format.decode(response.body))
46
+ Asana::Tag.new(connection.format.decode(response.body), true)
37
47
  end
38
48
 
39
- def tags
49
+ # Resource.new(record, true) is the trick to initialize a persisted record
50
+ def tags(force_reload = false)
51
+ return @tags if defined?(@tags) and !force_reload
52
+ @tags ||= get(:tags).map{|h| Asana::Tag.new(h, true)}
53
+ end
54
+
55
+ # expensive query: reload each task by id
56
+ # only use this if Asana::Tag.new(tag, true) doesn't work as expected
57
+ def load_tags_by_id
40
58
  get(:tags).map{|h| Asana::Tag.find h["id"]}
41
59
  end
60
+
61
+ def find_tag_from_list(tag_list, options = {})
62
+ tag_list.find {|t| t.name && options[:name] && t.name.strip == options[:name] }
63
+ end
42
64
  end
43
65
  end
@@ -1,3 +1,3 @@
1
1
  module Asana
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,8 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Asana
4
- describe Project do
5
- use_vcr_cassette
4
+ describe Project, vcr: true do
6
5
  before do
7
6
  authorize_with_asana
8
7
  end
@@ -10,7 +9,7 @@ module Asana
10
9
  describe '.all' do
11
10
  it 'should return all of the user\'s projects' do
12
11
  projects = Project.all
13
- projects.should be_instance_of Array
12
+ projects.should be_instance_of ActiveResource::Collection
14
13
  projects.first.should be_instance_of Project
15
14
  end
16
15
  end
@@ -2,6 +2,23 @@ require 'spec_helper'
2
2
 
3
3
  module Asana
4
4
  describe Tag do
5
+ describe "#tasks" do
6
+ let(:tag) { Tag.new }
5
7
 
8
+ before do
9
+ Asana.configure do |nothing|
10
+ end
11
+
12
+ tag.stub(:id).and_return("1234")
13
+ end
14
+
15
+ it "should get the info from /tags/<tag id>/tasks" do
16
+ fake_response = double("response", body: "{}")
17
+ fake_connection = double("ActiveResource::Connection")
18
+ expect(fake_connection).to receive(:get).with("/api/1.0/tags/1234/tasks", anything()).and_return(fake_response)
19
+ expect(tag).to receive(:connection).and_return(fake_connection)
20
+ tag.tasks
21
+ end
22
+ end
6
23
  end
7
24
  end
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Asana::Task do
4
- use_vcr_cassette
3
+ describe Asana::Task, vcr: true do
5
4
  before do
6
5
  authorize_with_asana
7
6
  end
@@ -1,8 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Asana
4
- describe User do
5
- use_vcr_cassette
4
+ describe User, vcr: true do
6
5
  before do
7
6
  authorize_with_asana
8
7
  end
@@ -1,8 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Asana
4
- describe Workspace do
5
- use_vcr_cassette
4
+ describe Workspace, vcr: true do
6
5
  before do
7
6
  authorize_with_asana
8
7
  end
@@ -40,25 +39,64 @@ module Asana
40
39
  it "should return task instances" do
41
40
  workspace.tasks.first.should be_instance_of Task
42
41
  end
42
+
43
+ context "with include_archived set to true in options" do
44
+ it "should pass the option as part of the query string for the API endpoint" do
45
+ stub_request(:any, "app.asana.com")
46
+ workspace.tasks(include_archived: true)
47
+
48
+ to_url = %r{app.asana.com/api/1.0/workspaces/#{workspace.id}/tasks}
49
+ a_request(:get, to_url).with(
50
+ query: hash_including({include_archived: 'true'})
51
+ ).should have_been_made
52
+ end
53
+ end
54
+ end
55
+
56
+ describe ".completed_tasks" do
57
+ it "returns only completed tasks" do
58
+ expect(workspace.completed_tasks.all?(&:completed)).to be
59
+ end
43
60
  end
44
61
 
45
62
  describe "tags" do
63
+ let(:fake_tag) { double("Asana::Tag", name: "Test") }
64
+
46
65
  subject { workspace }
47
66
  its(:tags) { should be_instance_of Array }
48
67
  it "should return task instances" do
49
68
  workspace.tags.first.should be_instance_of Tag
50
69
  end
70
+
71
+ it "should memoize tags" do
72
+ expect(Asana::Tag).to receive(:new).and_return(fake_tag)
73
+ Asana::Tag.stub(:new).and_return(fake_tag)
74
+ expect(workspace).to receive(:get).once.and_return([fake_tag])
75
+ workspace.tags # first time
76
+ workspace.tags # second time
77
+ end
78
+
79
+ it "should return the same result with force_reload (if no changes)" do
80
+ expect(workspace.tags.size).to be > 0 # it'd be meaningless to compare if there are no tags
81
+ expect(workspace.tags).to eq workspace.tags(true)
82
+ end
51
83
  end
52
84
 
53
85
  describe ".find_or_create_tag" do
86
+ let(:fake_tag) { double("Asana::Tag", name: "Test") }
87
+
88
+ before do
89
+ expect(workspace).to receive(:tags).at_least(:once).and_return([fake_tag])
90
+ end
91
+
54
92
  it "should not create two tags of the same name" do
55
- tag1 = workspace.find_or_create_tag(name: 'test .find_or_create_tag')
56
- tag2 = workspace.find_or_create_tag(name: 'test .find_or_create_tag')
57
- tag1.id.should == tag2.id
93
+ test_tag = workspace.find_or_create_tag(name: "Test")
94
+ expect(test_tag).to be(fake_tag)
58
95
  end
59
96
 
60
- it "should only create tag account by one" do
61
- expect { 3.times { workspace.find_or_create_tag(name: '3 times') } }.to change { workspace.tags.size }.by(1)
97
+ it "should create a tag that doesn't yet exist" do
98
+ new_tag = workspace.find_or_create_tag(name: "Nope")
99
+ expect(new_tag).to be_instance_of(Asana::Tag)
62
100
  end
63
101
  end
64
102
  end
@@ -1,4 +1,5 @@
1
1
  require 'asana'
2
+ require 'webmock/rspec'
2
3
  require 'vcr'
3
4
  require 'active_resource'
4
5
 
@@ -6,10 +7,7 @@ VCR.configure do |c|
6
7
  c.cassette_library_dir = 'spec/fixtures/cassettes'
7
8
  c.hook_into :webmock
8
9
  c.default_cassette_options = { :record => :new_episodes }
9
- end
10
-
11
- RSpec.configure do |c|
12
- c.extend VCR::RSpec::Macros
10
+ c.configure_rspec_metadata!
13
11
  end
14
12
 
15
13
  def authorize_with_asana
metadata CHANGED
@@ -1,115 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asana-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Harley Trung
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-07-31 00:00:00.000000000 Z
11
+ date: 2013-10-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activeresource
16
- requirement: &2164496820 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '3.0'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *2164496820
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: rake
27
- requirement: &2164495280 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *2164495280
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: rspec
38
- requirement: &2164530680 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ~>
42
46
  - !ruby/object:Gem::Version
43
47
  version: '2.11'
44
48
  type: :development
45
49
  prerelease: false
46
- version_requirements: *2164530680
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.11'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: guard
49
- requirement: &2164528100 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - ! '>='
59
+ - - '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  type: :development
56
63
  prerelease: false
57
- version_requirements: *2164528100
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: guard-rspec
60
- requirement: &2164525920 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
- - - ! '>='
73
+ - - '>='
64
74
  - !ruby/object:Gem::Version
65
75
  version: '0'
66
76
  type: :development
67
77
  prerelease: false
68
- version_requirements: *2164525920
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: vcr
71
- requirement: &2152078520 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
- - - ~>
87
+ - - '='
75
88
  - !ruby/object:Gem::Version
76
- version: 2.2.4
89
+ version: 2.6.0
77
90
  type: :development
78
91
  prerelease: false
79
- version_requirements: *2152078520
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 2.6.0
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: webmock
82
- requirement: &2152058920 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
101
  - - ~>
86
102
  - !ruby/object:Gem::Version
87
103
  version: 1.8.8
88
104
  type: :development
89
105
  prerelease: false
90
- version_requirements: *2152058920
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 1.8.8
91
111
  - !ruby/object:Gem::Dependency
92
112
  name: pry
93
- requirement: &2152053660 !ruby/object:Gem::Requirement
94
- none: false
113
+ requirement: !ruby/object:Gem::Requirement
95
114
  requirements:
96
- - - ! '>='
115
+ - - '>='
97
116
  - !ruby/object:Gem::Version
98
117
  version: '0'
99
118
  type: :development
100
119
  prerelease: false
101
- version_requirements: *2152053660
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
102
125
  - !ruby/object:Gem::Dependency
103
126
  name: pry-debugger
104
- requirement: &2164691420 !ruby/object:Gem::Requirement
105
- none: false
127
+ requirement: !ruby/object:Gem::Requirement
106
128
  requirements:
107
- - - ! '>='
129
+ - - '>='
108
130
  - !ruby/object:Gem::Version
109
131
  version: '0'
110
132
  type: :development
111
133
  prerelease: false
112
- version_requirements: *2164691420
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
113
139
  description: Ruby API wrapper for Asana, supporting workspaces, projects, tasks, tags,
114
140
  users and stories
115
141
  email:
@@ -119,6 +145,8 @@ extensions: []
119
145
  extra_rdoc_files: []
120
146
  files:
121
147
  - .gitignore
148
+ - .ruby-gemset
149
+ - .ruby-version
122
150
  - Gemfile
123
151
  - Guardfile
124
152
  - LICENSE
@@ -146,33 +174,26 @@ files:
146
174
  - spec/spec_helper.rb
147
175
  homepage: ''
148
176
  licenses: []
177
+ metadata: {}
149
178
  post_install_message:
150
179
  rdoc_options: []
151
180
  require_paths:
152
181
  - lib
153
182
  required_ruby_version: !ruby/object:Gem::Requirement
154
- none: false
155
183
  requirements:
156
- - - ! '>='
184
+ - - '>='
157
185
  - !ruby/object:Gem::Version
158
186
  version: '0'
159
- segments:
160
- - 0
161
- hash: 4158906422461001836
162
187
  required_rubygems_version: !ruby/object:Gem::Requirement
163
- none: false
164
188
  requirements:
165
- - - ! '>='
189
+ - - '>='
166
190
  - !ruby/object:Gem::Version
167
191
  version: '0'
168
- segments:
169
- - 0
170
- hash: 4158906422461001836
171
192
  requirements: []
172
193
  rubyforge_project:
173
- rubygems_version: 1.8.17
194
+ rubygems_version: 2.0.3
174
195
  signing_key:
175
- specification_version: 3
196
+ specification_version: 4
176
197
  summary: Ruby wrapper for Asana
177
198
  test_files:
178
199
  - spec/asana/asana_spec.rb