pinboard 0.1.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c2a6d08711c6876f6bdd956a05bc2fb1a6b5cf26
4
- data.tar.gz: 825e67c3b384583775f37ea079094eff0f537c5a
3
+ metadata.gz: 58de47162982b5d30e0005929b84ba6e7a079f63
4
+ data.tar.gz: ebca1893e1b75d58f66a879deb5b07a2b7c59381
5
5
  SHA512:
6
- metadata.gz: 818560e95ef122daea35a48300980d767d98a3266fc9e7955ffbad72226084959739d1c91e5710021f4292ba6bf76031e7b7d1305fd15d6b63e1923090058270
7
- data.tar.gz: cae21f19f48dda2edbb1414b65d11257751129d64e2b4fd4c8233aa2f2e50cda0cb8f6a6ba73b60c4770195c1dd017a11dafc169d52965776b3060cf5c58f209
6
+ metadata.gz: 0af9563d66912472406c124c1b3904e0d0e6537da9c76090b24cb48644967bf76650cb4a06d6908f9be60e83b522ecaec36f63fe2d7e4d22adb6539dcdd89a04
7
+ data.tar.gz: a4820f99cfac42ac1554d28e18cc8e7548ae38ca4c1adaf17b57c3a2a6cd1af2ffd848cf9f3fb03ad00c5666030fd08ae7cd081da571a83f5adb4c080e5a37b7
data/.rspec CHANGED
@@ -1,3 +1,3 @@
1
1
  --color
2
- --format=nested
2
+ --format=doc
3
3
  --backtrace
@@ -1,5 +1,7 @@
1
+ language: ruby
2
+ sudo: false
1
3
  rvm:
4
+ - 2.1
5
+ - 2.2
2
6
  - 1.9.3
3
- - 2.0.0
4
7
  - jruby
5
- - ruby-head
@@ -1,4 +1,5 @@
1
1
  Copyright (c) 2011 Ryan Walker
2
+ Copyright (c) 2013-2014 Jan-Erik Rediger
2
3
 
3
4
  Permission is hereby granted, free of charge, to any person obtaining
4
5
  a copy of this software and associated documentation files (the
@@ -17,4 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
18
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
19
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
20
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -12,9 +12,13 @@ Examples
12
12
  I'm currently exploring two API interfaces:
13
13
 
14
14
  ```ruby
15
- pinboard = Pinboard::Client.new(:username => 'foo', :password => 'bar')
15
+ pinboard = Pinboard::Client.new(:token => 'your_api_token')
16
16
  posts = pinboard.posts
17
17
  ```
18
+
19
+ Your [API token](https://blog.pinboard.in/2012/07/api_authentication_tokens/) can be found on your
20
+ [settings/password](https://pinboard.in/settings/password) page.
21
+
18
22
  or:
19
23
 
20
24
  ```ruby
@@ -52,6 +56,8 @@ integration and support of the following rubies in rvm:
52
56
 
53
57
  * 1.9.3
54
58
  * 2.0.0
59
+ * 2.1
60
+ * 2.2
55
61
  * jruby
56
62
  * ruby-head
57
63
 
@@ -85,6 +91,10 @@ TODO
85
91
  http://datagraph.rubyforge.org/rack-throttle/
86
92
  * If get 503 response, double the throttle to two seconds
87
93
 
88
- Copyright
89
- ---------
90
- Copyright (c) 2011 Ryan Walker. See MIT-LICENSE for details.
94
+ License
95
+ -------
96
+
97
+ See [MIT-LICENSE](MIT-LICENSE) for details.
98
+
99
+ Copyright (c) 2011 Ryan Walker.
100
+ Copyright (c) 2013-2016 Jan-Erik Rediger.
@@ -31,8 +31,14 @@ module Pinboard
31
31
 
32
32
  # Returns all bookmarks in the user's account.
33
33
  #
34
- # @return [Array<Post>] the list of bookmarks.
35
- def posts(params={})
34
+ # @option params [String] :tag filter by up to three tags
35
+ # @option params [Integer] :start offset value (default is 0)
36
+ # @option params [Integer] :results number of results to return. Default is all
37
+ # @option params [Time] :fromdt return only bookmarks created after this time
38
+ # @option params [Time] :todt return only bookmarks created before this time
39
+ # @option params [Integer] :meta include a change detection signature for each bookmark
40
+ # @return [Array<Post>] the list of bookmarks
41
+ def posts(params = {})
36
42
  options = create_params(params)
37
43
  posts = self.class.get('/posts/all', options)['posts']['post']
38
44
  posts = [] if posts.nil?
@@ -40,29 +46,84 @@ module Pinboard
40
46
  posts.map { |p| Post.new(Util.symbolize_keys(p)) }
41
47
  end
42
48
 
49
+ # Returns one or more posts on a single day matching the arguments.
50
+ # If no date or url is given, date of most recent bookmark will be used.
51
+ #
52
+ # @option params [String] :tag filter by up to three tags
53
+ # @option params [Time] :dt return results bookmarked on this day
54
+ # @option params [String] :url return bookmark for this URL
55
+ # @option params [Boolean] :meta include a change detection signature in a meta attribute
56
+ # @return [Array<Post>] the list of bookmarks
57
+ def get(params = {})
58
+ params[:dt] = params[:dt].to_date.to_s if params.is_a? Time
59
+ params[:meta] = params[:meta] ? 'yes' : 'no' if params.has_key?(:meta)
60
+ options = create_params(params)
61
+ posts = self.class.get('/posts/get', options)['posts']['post']
62
+ posts = [] if posts.nil?
63
+ posts = [posts] if posts.class != Array
64
+ posts.map { |p| Post.new(Util.symbolize_keys(p)) }
65
+ end
66
+
67
+ # Returns a list of popular tags and recommended tags for a given URL.
68
+ # Popular tags are tags used site-wide for the url; recommended tags
69
+ # are drawn from the user's own tags.
70
+ #
71
+ # @param [String] url
72
+ # @return [Hash<String, Array>]
73
+ def suggest(url)
74
+ options = create_params({url: url})
75
+ suggested = self.class.get('/posts/suggest', options)['suggested']
76
+ popular = suggested['popular']
77
+ popular = [] if popular.nil?
78
+ popular = [popular] if popular.class != Array
79
+
80
+ recommended = suggested['recommended']
81
+ recommended = [] if recommended.nil?
82
+ recommended = [recommended] if recommended.class != Array
83
+
84
+ {:popular => popular, :recommended => recommended}
85
+ end
86
+
43
87
  # Add a bookmark
44
88
  #
45
89
  # @param [Hash] params Arguments for this call
46
90
  # @option params [String] :url the URL of the item (required)
47
- # @option params [String] :description Title of the item
91
+ # @option params [String] :description Title of the item (required)
48
92
  # @option params [String] :extended Description of the item
49
93
  # @option params [Array] :tags List of up to 100 tags
50
- # @option params [Boolean] :replace Replace any existing bookmark with this URL (default: true)
51
- # @option params [Boolean] :shared Make bookmark public (default: true)
94
+ # @option params [Time] :dt creation time for this bookmark. Defaults to current
95
+ # time. Datestamps more than 10 minutes ahead of server time will be reset to
96
+ # current server time
97
+ # @option params [Boolean] :replace Replace any existing bookmark with this URL.
98
+ # Default is true. If set to false, will throw an error if bookmark exists
99
+ # @option params [Boolean] :shared Make bookmark public. Default is true unless
100
+ # user has enabled the "save all bookmarks as private" user setting, in which
101
+ # case default is false
52
102
  # @option params [Boolean] :toread Marks the bookmark as unread (default: false)
103
+ #
104
+ # @return [String] "done" when everything went as expected
105
+ # @raise [Error] if result code is not "done"
53
106
  def add(params={})
54
107
  # Pinboard expects multiple tags=foo,bar separated by comma instead of tag=foo&tag=bar
55
108
  params[:tags] = Array(params[:tags]).join(',') if params[:tags]
56
109
 
110
+ # Pinboard expects datetime as UTC timestamp in this format:
111
+ # 2010-12-11T19:48:02Z. Valid date range is Jan 1, 1 AD to January 1, 2100
112
+ params[:dt] = params[:dt].iso8601 if params[:dt].is_a? Time
113
+
57
114
  # Pinboard expects replace, shared and toread as yes/no instead of true/false
58
115
  [:replace, :shared, :toread].each do |boolean|
59
- params[boolean] = params[boolean] ? 'yes' : 'no' if params.has_key?(boolean)
116
+ if params.has_key?(boolean) && !['yes', 'no'].include?(params[boolean])
117
+ params[boolean] = params[boolean] ? 'yes' : 'no'
118
+ end
60
119
  end
61
120
 
62
121
  options = create_params(params)
63
122
  result_code = self.class.post('/posts/add', options).parsed_response["result"]["code"]
64
123
 
65
124
  raise Error.new(result_code) if result_code != "done"
125
+
126
+ result_code
66
127
  end
67
128
 
68
129
  # Returns the most recent time a bookmark was added, updated or deleted.
@@ -85,7 +146,7 @@ module Pinboard
85
146
  # @option params [String] :count Number of results to return.
86
147
  # Default is 15, max is 100
87
148
  #
88
- # @return [Array<Post>] the list of recent posts.
149
+ # @return [Array<Post>] the list of recent posts
89
150
  def recent(params={})
90
151
  options = create_params(params)
91
152
  posts = self.class.get('/posts/recent', options)['posts']['post']
@@ -94,7 +155,7 @@ module Pinboard
94
155
  posts.map { |p| Post.new(Util.symbolize_keys(p)) }
95
156
  end
96
157
 
97
- # Returns a list of dates with the number of posts at each date.
158
+ # Returns a list of dates with the number of posts at each date
98
159
  #
99
160
  # @param [String] tag Filter by up to three tags
100
161
  #
@@ -117,12 +178,17 @@ module Pinboard
117
178
  # Delete a bookmark
118
179
  #
119
180
  # @param [String] url The url to delete
181
+ #
182
+ # @return [String] "done" when everything went as expected
183
+ # @raise [Error] if result code is not "done"
120
184
  def delete(url)
121
185
  params = { url: url }
122
186
  options = create_params(params)
123
187
  result_code = self.class.get('/posts/delete', options).parsed_response["result"]["code"]
124
188
 
125
189
  raise Error.new(result_code) if result_code != "done"
190
+
191
+ result_code
126
192
  end
127
193
 
128
194
  # Returns a full list of the user's tags along with the number of
@@ -142,8 +208,10 @@ module Pinboard
142
208
  # @param [String] old_tag Tag to rename (not case sensitive)
143
209
  # @param [String] new_tag New tag (if empty nothing will happen)
144
210
  #
211
+ # @return [String] "done" when everything went as expected
145
212
  # @raise [Error] if result code is not "done"
146
- def tags_rename(old_tag, new_tag=nil, params={})
213
+ def tags_rename(old_tag, new_tag=nil)
214
+ params = {}
147
215
  params[:old] = old_tag
148
216
  params[:new] = new_tag if new_tag
149
217
 
@@ -151,6 +219,8 @@ module Pinboard
151
219
  result_code = self.class.get('/tags/rename', options).parsed_response["result"]
152
220
 
153
221
  raise Error.new(result_code) if result_code != "done"
222
+
223
+ result_code
154
224
  end
155
225
 
156
226
  # Delete an existing tag
@@ -165,6 +235,21 @@ module Pinboard
165
235
  nil
166
236
  end
167
237
 
238
+ # Returns the user's secret RSS key (for viewing private feeds)
239
+ #
240
+ # @return [String]
241
+ def user_secret()
242
+ self.class.get('/user/secret', create_params({}))['result']
243
+ end
244
+
245
+ # Returns the user's API token (for making API calls without a password)
246
+ #
247
+ # @return [String]
248
+ def user_api_token()
249
+ self.class.get('/user/api_token', create_params({}))['result']
250
+ end
251
+
252
+
168
253
  # Returns a list of the user's notes
169
254
  #
170
255
  # @return [Array<Note>] list of notes
@@ -176,6 +261,28 @@ module Pinboard
176
261
  notes.map { |p| Note.new(Util.symbolize_keys(p)) }
177
262
  end
178
263
 
264
+ # Returns an individual user note. The hash property is a
265
+ # 20 character long sha1 hash of the note text.
266
+ #
267
+ # @return [Note] the note
268
+ def notes_get(id)
269
+ options = create_params({})
270
+ note = self.class.get("/notes/#{id}", options)['note']
271
+
272
+ return nil unless note
273
+
274
+ # Complete hack, because the API is still broken
275
+ content = '__content__'
276
+ Note.new({
277
+ id: note['id'],
278
+ # Remove whitespace around the title,
279
+ # because of missing xml tag around
280
+ title: note[content].gsub(/\n| +/, ''),
281
+ length: note['length'][content].to_i,
282
+ text: note['text'][content]
283
+ })
284
+ end
285
+
179
286
  private
180
287
  # Construct params hash for HTTP request
181
288
  #
@@ -3,8 +3,8 @@ module Pinboard
3
3
  def initialize(attributes={})
4
4
  self.id = attributes[:id]
5
5
  self.title = attributes[:title]
6
- self.created_at = Util.parse_time(attributes[:created_at])
7
- self.updated_at = Util.parse_time(attributes[:updated_at])
6
+ self.created_at = attributes[:created_at] && Util.parse_time(attributes[:created_at])
7
+ self.updated_at = attributes[:updated_at] && Util.parse_time(attributes[:updated_at])
8
8
  self.length = attributes[:length].to_i
9
9
  self.text = attributes[:text]
10
10
  end
@@ -28,5 +28,22 @@ module Pinboard
28
28
  toread: toread
29
29
  }.to_json(*args)
30
30
  end
31
+
32
+ # Creates hash for API (e.g. pass it to '/posts/add')
33
+ #
34
+ # @param [Boolean, nil] replace Overwrite replace attribute if not nil
35
+ # @return [Hash]
36
+ def api_hash(replace = nil)
37
+ self.replace = replace unless replace.nil?
38
+ {
39
+ url: href,
40
+ description: description,
41
+ extended: extended,
42
+ tags: tag.join(" "),
43
+ replace: replace,
44
+ shared: shared,
45
+ toread: toread
46
+ }.select { |key, value| ! value.nil? }
47
+ end
31
48
  end
32
49
  end
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
12
12
 
13
13
  s.add_runtime_dependency 'httparty', '= 0.11.0'
14
14
  s.name = 'pinboard'
15
- s.version = '0.1.1'
16
- s.date = '2013-05-02'
15
+ s.version = '1.0.0'
16
+ s.date = '2016-01-05'
17
17
  s.summary = "Ruby wrapper for the Pinboard API"
18
18
  s.description = "Ruby wrapper for the Pinboard API"
19
19
  s.authors = ["Ry Waker", "Jan-Erik Rediger"]
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <suggested>
3
+ <popular>blog</popular>
4
+ <popular>blogs</popular>
5
+ <recommended>writing</recommended>
6
+ <recommended>weblog</recommended>
7
+ </suggested>
@@ -0,0 +1,2 @@
1
+ <suggested>
2
+ </suggested>
@@ -0,0 +1,4 @@
1
+ <suggested>
2
+ <popular>blog</popular>
3
+ <recommended>writing</recommended>
4
+ </suggested>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <result>XOG86E7JIYMI</result>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <result>6493a84f72d86e7de130</result>
@@ -339,4 +339,140 @@ describe Pinboard::Client do
339
339
  notes.first.title.should == "Paul Graham on Hirin' The Ladies"
340
340
  end
341
341
  end
342
+
343
+ describe "#user_secret" do
344
+ let(:client) { Pinboard::Client.new(auth_params) }
345
+ before do
346
+ stub_get("user/secret?").
347
+ to_return(:body => fixture("user_secret.xml"),
348
+ :headers => { 'content-type' => 'text/xml' })
349
+ end
350
+
351
+ it "returns the user's secret RSS key" do
352
+ secret = client.user_secret
353
+ secret.should == "6493a84f72d86e7de130"
354
+ end
355
+ end
356
+
357
+ describe "#user_api_token" do
358
+ let(:client) { Pinboard::Client.new(auth_params) }
359
+ before do
360
+ stub_get("user/api_token?").
361
+ to_return(:body => fixture("user_api_token.xml"),
362
+ :headers => { 'content-type' => 'text/xml' })
363
+ end
364
+
365
+ it "returns the user's API token" do
366
+ token = client.user_api_token
367
+ token.should == "XOG86E7JIYMI"
368
+ end
369
+ end
370
+
371
+ describe "#get" do
372
+ let(:client) { Pinboard::Client.new(auth_params) }
373
+
374
+ context "when there are many posts" do
375
+ before do
376
+ stub_get("posts/get?").
377
+ to_return(:body => fixture("multiple_posts.xml"),
378
+ :headers => { 'content-type' => 'text/xml' })
379
+ end
380
+
381
+ it "returns a collection of posts" do
382
+ expected =
383
+ [
384
+ Pinboard::Post.new(
385
+ :href => "http://foo.com/",
386
+ :description => "Foo!",
387
+ :extended => "long description Foo",
388
+ :tag => 'foo bar',
389
+ :toread => 'yes',
390
+ :time => Time.parse("2011-07-26T17:52:04Z")),
391
+ Pinboard::Post.new(
392
+ :href => "http://bar.com/",
393
+ :description => "Bar!",
394
+ :extended => "long description Bar",
395
+ :tag => 'foo bar',
396
+ :toread => 'yes',
397
+ :time => Time.parse("2011-07-26T17:52:04Z")),
398
+ ]
399
+
400
+ client.get.should == expected
401
+ end
402
+ end
403
+
404
+ context "where there is a single post" do
405
+ before do
406
+ stub_get("posts/get?").
407
+ to_return(:body => fixture("single_post.xml"),
408
+ :headers => { 'content-type' => 'text/xml' })
409
+ end
410
+
411
+ it "still returns an array" do
412
+ client.get.class.should == Array
413
+ end
414
+ end
415
+
416
+ context "when there are no posts" do
417
+ before do
418
+ stub_get("posts/get?").
419
+ to_return(:body => fixture("no_posts.xml"),
420
+ :headers => { 'content-type' => 'text/xml' })
421
+ end
422
+
423
+ it "returns an empty array" do
424
+ client.get.should == []
425
+ end
426
+ end
427
+ end
428
+
429
+ describe "#suggest" do
430
+ let(:client) { Pinboard::Client.new(auth_params) }
431
+ let(:url) { 'http://example.com' }
432
+
433
+ context "when there are many popular and recommended tags" do
434
+ before do
435
+ stub_get("posts/suggest").
436
+ with(:query => { 'url' => url }).
437
+ to_return(:body => fixture("multiple_suggest.xml"),
438
+ :headers => { 'content-type' => 'text/xml' })
439
+ end
440
+
441
+ it "returns a collections of tags" do
442
+ suggest = client.suggest(url)
443
+ suggest[:popular].should == %w[blog blogs]
444
+ suggest[:recommended].should == %w[writing weblog]
445
+ end
446
+ end
447
+
448
+ context "when there are single popular and recommended tags" do
449
+ before do
450
+ stub_get("posts/suggest?").
451
+ with(:query => { 'url' => url }).
452
+ to_return(:body => fixture("single_suggest.xml"),
453
+ :headers => { 'content-type' => 'text/xml' })
454
+ end
455
+
456
+ it "still returns an array" do
457
+ suggest = client.suggest(url)
458
+ suggest[:popular].class.should == Array
459
+ suggest[:recommended].class.should == Array
460
+ end
461
+ end
462
+
463
+ context "when there are no popular and recommended tags" do
464
+ before do
465
+ stub_get("posts/suggest?").
466
+ with(:query => { 'url' => url }).
467
+ to_return(:body => fixture("no_suggest.xml"),
468
+ :headers => { 'content-type' => 'text/xml' })
469
+ end
470
+
471
+ it "returns an empty array" do
472
+ suggest = client.suggest(url)
473
+ suggest[:popular].should == []
474
+ suggest[:recommended].should == []
475
+ end
476
+ end
477
+ end
342
478
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinboard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ry Waker
@@ -9,146 +9,146 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-02 00:00:00.000000000 Z
12
+ date: 2016-01-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: yard
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0.7'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0.7'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0.9'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0.9'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: rspec
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ~>
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: '2.6'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ~>
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: '2.6'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: webmock
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ~>
60
+ - - "~>"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '1.6'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ~>
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '1.6'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: guard-rspec
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ~>
74
+ - - "~>"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0.5'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - ~>
81
+ - - "~>"
82
82
  - !ruby/object:Gem::Version
83
83
  version: '0.5'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: guard-bundler
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: libnotify
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: '0'
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: rb-inotify
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - '>='
116
+ - - ">="
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - '>='
123
+ - - ">="
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: rb-fsevent
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - '>='
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - '>='
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: terminal-notifier-guard
142
142
  requirement: !ruby/object:Gem::Requirement
143
143
  requirements:
144
- - - '>='
144
+ - - ">="
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  type: :development
148
148
  prerelease: false
149
149
  version_requirements: !ruby/object:Gem::Requirement
150
150
  requirements:
151
- - - '>='
151
+ - - ">="
152
152
  - !ruby/object:Gem::Version
153
153
  version: '0'
154
154
  - !ruby/object:Gem::Dependency
@@ -171,10 +171,10 @@ executables: []
171
171
  extensions: []
172
172
  extra_rdoc_files: []
173
173
  files:
174
- - .autotest
175
- - .gitignore
176
- - .rspec
177
- - .travis.yml
174
+ - ".autotest"
175
+ - ".gitignore"
176
+ - ".rspec"
177
+ - ".travis.yml"
178
178
  - Gemfile
179
179
  - Guardfile
180
180
  - MIT-LICENSE
@@ -194,11 +194,16 @@ files:
194
194
  - spec/fixtures/missing_description.xml
195
195
  - spec/fixtures/missing_url.xml
196
196
  - spec/fixtures/multiple_posts.xml
197
+ - spec/fixtures/multiple_suggest.xml
197
198
  - spec/fixtures/no_posts.xml
199
+ - spec/fixtures/no_suggest.xml
198
200
  - spec/fixtures/not_found.xml
199
201
  - spec/fixtures/notes_list.xml
200
202
  - spec/fixtures/post_update.xml
201
203
  - spec/fixtures/single_post.xml
204
+ - spec/fixtures/single_suggest.xml
205
+ - spec/fixtures/user_api_token.xml
206
+ - spec/fixtures/user_secret.xml
202
207
  - spec/helper.rb
203
208
  - spec/pinboard/client_spec.rb
204
209
  - spec/pinboard/post_spec.rb
@@ -212,17 +217,17 @@ require_paths:
212
217
  - lib
213
218
  required_ruby_version: !ruby/object:Gem::Requirement
214
219
  requirements:
215
- - - '>='
220
+ - - ">="
216
221
  - !ruby/object:Gem::Version
217
222
  version: '0'
218
223
  required_rubygems_version: !ruby/object:Gem::Requirement
219
224
  requirements:
220
- - - '>='
225
+ - - ">="
221
226
  - !ruby/object:Gem::Version
222
227
  version: 1.3.6
223
228
  requirements: []
224
229
  rubyforge_project:
225
- rubygems_version: 2.0.3
230
+ rubygems_version: 2.5.1
226
231
  signing_key:
227
232
  specification_version: 4
228
233
  summary: Ruby wrapper for the Pinboard API
@@ -234,11 +239,16 @@ test_files:
234
239
  - spec/fixtures/missing_description.xml
235
240
  - spec/fixtures/missing_url.xml
236
241
  - spec/fixtures/multiple_posts.xml
242
+ - spec/fixtures/multiple_suggest.xml
237
243
  - spec/fixtures/no_posts.xml
244
+ - spec/fixtures/no_suggest.xml
238
245
  - spec/fixtures/not_found.xml
239
246
  - spec/fixtures/notes_list.xml
240
247
  - spec/fixtures/post_update.xml
241
248
  - spec/fixtures/single_post.xml
249
+ - spec/fixtures/single_suggest.xml
250
+ - spec/fixtures/user_api_token.xml
251
+ - spec/fixtures/user_secret.xml
242
252
  - spec/helper.rb
243
253
  - spec/pinboard/client_spec.rb
244
254
  - spec/pinboard/post_spec.rb