wl 0.0.4 → 0.0.5

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/lib/wl.rb CHANGED
@@ -4,6 +4,7 @@ module Wl
4
4
  autoload :Client, 'wl/client'
5
5
  autoload :CLI, 'wl/cli'
6
6
  autoload :Dotwl, 'wl/dotwl'
7
+ autoload :List, 'wl/list'
7
8
  autoload :Login, 'wl/login'
8
9
  autoload :Task, 'wl/task'
9
10
  end
@@ -11,7 +11,6 @@ module Wl
11
11
  password = options[:password] || ui.ask('Wunderlist password: ') { |q| q.echo = '*' }
12
12
 
13
13
  login = client.login(email, password)
14
- dotwl.login(login)
15
14
 
16
15
  say login.to_json
17
16
  end
@@ -21,13 +20,14 @@ module Wl
21
20
  say client.tasks.to_json
22
21
  end
23
22
 
24
- private
25
- def client
26
- @client ||= Wl::Client.new(dotwl: dotwl)
23
+ desc 'lists', 'Lists all your lists'
24
+ def lists
25
+ say client.lists.to_json
27
26
  end
28
27
 
29
- def dotwl
30
- @dotwl ||= Dotwl.new
28
+ private
29
+ def client
30
+ @client ||= Wl::Client.new(dotwl: Dotwl.new)
31
31
  end
32
32
 
33
33
  def ui
@@ -2,18 +2,26 @@ require 'shy'
2
2
  require 'api_smith'
3
3
 
4
4
  module Wl
5
- class Client < Shy.new(:dotwl)
5
+ class Client
6
+ include Shy
6
7
  include APISmith::Client
7
8
  base_uri 'https://api.wunderlist.com/'
9
+ shy :dotwl
8
10
 
9
11
  def login(email, password)
10
- post('login', extra_query: {email: email, password: password}, transformer: Login)
12
+ login = post('login', extra_query: {email: email, password: password}, transformer: Login)
13
+ dotwl.login(login)
14
+ login
11
15
  end
12
16
 
13
17
  def tasks
14
18
  get('me/tasks', transformer: Task)
15
19
  end
16
20
 
21
+ def lists
22
+ get('me/lists', transformer: List)
23
+ end
24
+
17
25
  def base_request_options
18
26
  if dotwl.token
19
27
  {
@@ -0,0 +1,16 @@
1
+ require 'api_smith'
2
+
3
+ module Wl
4
+ class List < APISmith::Smash
5
+ property :title
6
+ property :created_at
7
+ property :updated_at
8
+ property :version
9
+ property :local_identifier
10
+ property :position
11
+ property :type
12
+ property :id
13
+ property :owner_id
14
+ property :errors
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  module Wl
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -0,0 +1,98 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.wunderlist.com/me/lists?
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Authorization:
11
+ - Bearer 131378dbc2490bf87b6080ad6aeb758a46673270bbca9c7ea26f434473bbe741
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ Cache-Control:
18
+ - must-revalidate, private, max-age=0
19
+ Content-Type:
20
+ - application/json; charset=utf-8
21
+ Date:
22
+ - Mon, 25 Mar 2013 01:42:49 GMT
23
+ Etag:
24
+ - ! '"902626f7ad1045f6eda77cced7000115"'
25
+ Server:
26
+ - nginx
27
+ Status:
28
+ - 200 OK
29
+ Vary:
30
+ - Accept-Encoding
31
+ X-6w-Client-Status:
32
+ - unknown
33
+ X-6w-Timestamp:
34
+ - '1364175769'
35
+ X-Rack-Cache:
36
+ - miss
37
+ X-Ratelimit-Delay-Hard:
38
+ - '0'
39
+ X-Ratelimit-Delay-Soft:
40
+ - '840'
41
+ X-Request-Id:
42
+ - ce14d77649bb5889ee4638a164a3a824
43
+ X-Server:
44
+ - ip-10-226-39-240
45
+ Transfer-Encoding:
46
+ - chunked
47
+ Connection:
48
+ - keep-alive
49
+ body:
50
+ encoding: US-ASCII
51
+ string: ! '[{"id":"ABIdAARgVkA","created_at":"2013-03-24T07:29:40Z","updated_at":"2013-03-24T07:29:40Z","title":"Private","local_identifier":"localId:prepopulated:AAIdAABMQ6I:List:private","version":1,"type":"List","owner_id":"AAIdAABMQ6I","position":8.0e-05},{"id":"ABIdAARgVkI","created_at":"2013-03-24T07:29:40Z","updated_at":"2013-03-24T07:29:40Z","title":"Work","local_identifier":"localId:prepopulated:AAIdAABMQ6I:List:work","version":1,"type":"List","owner_id":"AAIdAABMQ6I","position":10.0},{"id":"ABIdAARgVkM","created_at":"2013-03-24T07:29:40Z","updated_at":"2013-03-24T07:29:40Z","title":"Shopping","local_identifier":"localId:prepopulated:AAIdAABMQ6I:List:shopping","version":1,"type":"List","owner_id":"AAIdAABMQ6I","position":20.00002},{"id":"ABIdAARgVkQ","created_at":"2013-03-24T07:29:40Z","updated_at":"2013-03-24T07:29:40Z","title":"Movies
52
+ to Watch","local_identifier":"localId:prepopulated:AAIdAABMQ6I:List:movies","version":1,"type":"List","owner_id":"AAIdAABMQ6I","position":29.99998},{"id":"ABIdAARgVkU","created_at":"2013-03-24T07:29:40Z","updated_at":"2013-03-24T07:29:40Z","title":"Wishlist","local_identifier":"localId:prepopulated:AAIdAABMQ6I:List:wishlist","version":1,"type":"List","owner_id":"AAIdAABMQ6I","position":39.99992}]'
53
+ http_version:
54
+ recorded_at: Mon, 25 Mar 2013 01:42:53 GMT
55
+ - request:
56
+ method: get
57
+ uri: https://api.wunderlist.com/me/lists?
58
+ body:
59
+ encoding: US-ASCII
60
+ string: ''
61
+ headers: {}
62
+ response:
63
+ status:
64
+ code: 401
65
+ message: Unauthorized
66
+ headers:
67
+ Cache-Control:
68
+ - no-cache
69
+ Content-Type:
70
+ - application/json; charset=utf-8
71
+ Date:
72
+ - Mon, 25 Mar 2013 01:45:28 GMT
73
+ Server:
74
+ - nginx
75
+ Status:
76
+ - 401 Unauthorized
77
+ X-6w-Client-Status:
78
+ - unknown
79
+ X-6w-Timestamp:
80
+ - '1364175928'
81
+ X-Rack-Cache:
82
+ - miss
83
+ X-Ratelimit-Delay-Hard:
84
+ - '0'
85
+ X-Ratelimit-Delay-Soft:
86
+ - '893'
87
+ X-Request-Id:
88
+ - 91356407bc4e11c09b196c5665a3f43a
89
+ Content-Length:
90
+ - '85'
91
+ Connection:
92
+ - keep-alive
93
+ body:
94
+ encoding: US-ASCII
95
+ string: ! '{"errors":{"message":"You must be authenticated to continue.","type":"unauthorized"}}'
96
+ http_version:
97
+ recorded_at: Mon, 25 Mar 2013 01:45:31 GMT
98
+ recorded_with: VCR 2.4.0
@@ -29,11 +29,6 @@ module Wl
29
29
  output.should include('"name":"fake@example.com"')
30
30
  end
31
31
 
32
- it 'stores the token' do
33
- dotwl.should_receive(:login).with(an_instance_of(Login))
34
- capture(:stdout) { subject }
35
- end
36
-
37
32
  context 'when an email and password are not provided' do
38
33
  let(:args) { %w"login" }
39
34
 
@@ -65,5 +60,19 @@ module Wl
65
60
  JSON.parse(output).should have(3).tasks
66
61
  end
67
62
  end
63
+
64
+ describe 'lists', vcr: {cassette_name: 'lists'} do
65
+ let(:args) { %w"lists" }
66
+
67
+ before do
68
+ dotwl.stub(token: '131378dbc2490bf87b6080ad6aeb758a46673270bbca9c7ea26f434473bbe741')
69
+ end
70
+
71
+ it 'prints all the tasks' do
72
+ output = capture(:stdout) { subject }
73
+
74
+ JSON.parse(output).should have(5).lists
75
+ end
76
+ end
68
77
  end
69
78
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  module Wl
4
4
  describe Client do
5
- let(:dotwl) { double(Dotwl, token: nil) }
5
+ let(:dotwl) { double(Dotwl, token: nil).as_null_object }
6
6
 
7
7
  subject do
8
8
  Client.new(dotwl: dotwl)
@@ -16,6 +16,11 @@ module Wl
16
16
  response.email.should == 'fake@example.com'
17
17
  response.errors.should be_nil
18
18
  end
19
+
20
+ it 'stores the token' do
21
+ dotwl.should_receive(:login).with(an_instance_of(Login))
22
+ subject.login('fake@example.com', 'fakepass')
23
+ end
19
24
  end
20
25
 
21
26
  context 'when something goes wrong' do
@@ -51,5 +56,25 @@ module Wl
51
56
  end
52
57
  end
53
58
  end
59
+
60
+ describe '#lists' do
61
+ context 'when the user has logged in', vcr: {cassette_name: 'lists'} do
62
+ before do
63
+ dotwl.stub(token: '131378dbc2490bf87b6080ad6aeb758a46673270bbca9c7ea26f434473bbe741')
64
+ end
65
+
66
+ it 'lists all lists' do
67
+ lists = subject.lists
68
+ lists.map(&:title).should eq ["Private", "Work", "Shopping", "Movies to Watch", "Wishlist"]
69
+ end
70
+ end
71
+
72
+ context 'when the user has not logged in', vcr: {cassette_name: 'lists'} do
73
+ it 'fails gracefully' do
74
+ lists = subject.lists
75
+ lists.errors['type'].should eq('unauthorized')
76
+ end
77
+ end
78
+ end
54
79
  end
55
80
  end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module Wl
4
+ describe List do
5
+ it { should be_an(APISmith::Smash) }
6
+ end
7
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
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: 2013-03-24 00:00:00.000000000 Z
12
+ date: 2013-03-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -178,9 +178,11 @@ files:
178
178
  - lib/wl/cli.rb
179
179
  - lib/wl/client.rb
180
180
  - lib/wl/dotwl.rb
181
+ - lib/wl/list.rb
181
182
  - lib/wl/login.rb
182
183
  - lib/wl/task.rb
183
184
  - lib/wl/version.rb
185
+ - spec/cassettes/lists.yml
184
186
  - spec/cassettes/login.yml
185
187
  - spec/cassettes/tasks.yml
186
188
  - spec/helpers/capture_output.rb
@@ -189,6 +191,7 @@ files:
189
191
  - spec/wl/cli_spec.rb
190
192
  - spec/wl/client_spec.rb
191
193
  - spec/wl/dotwl_spec.rb
194
+ - spec/wl/list_spec.rb
192
195
  - spec/wl/login_spec.rb
193
196
  - spec/wl/task_spec.rb
194
197
  - wl.gemspec
@@ -207,7 +210,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
207
210
  version: '0'
208
211
  segments:
209
212
  - 0
210
- hash: 110259217908952548
213
+ hash: 3677924530743277966
211
214
  required_rubygems_version: !ruby/object:Gem::Requirement
212
215
  none: false
213
216
  requirements:
@@ -216,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
216
219
  version: '0'
217
220
  segments:
218
221
  - 0
219
- hash: 110259217908952548
222
+ hash: 3677924530743277966
220
223
  requirements: []
221
224
  rubyforge_project:
222
225
  rubygems_version: 1.8.25
@@ -225,6 +228,7 @@ specification_version: 3
225
228
  summary: ! '`wl` is an unofficial Ruby client and command line interface for the truly
226
229
  awesome Wunderlist'
227
230
  test_files:
231
+ - spec/cassettes/lists.yml
228
232
  - spec/cassettes/login.yml
229
233
  - spec/cassettes/tasks.yml
230
234
  - spec/helpers/capture_output.rb
@@ -233,5 +237,6 @@ test_files:
233
237
  - spec/wl/cli_spec.rb
234
238
  - spec/wl/client_spec.rb
235
239
  - spec/wl/dotwl_spec.rb
240
+ - spec/wl/list_spec.rb
236
241
  - spec/wl/login_spec.rb
237
242
  - spec/wl/task_spec.rb