pinboard_tools 0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 54e48d7bb927ea39cb94f22ad0a3d55ab930db5f
4
+ data.tar.gz: 77044fc0e716639ae0907dd1a354b2d478b9be1f
5
+ SHA512:
6
+ metadata.gz: f4d8b22711c00c3c1c921b44b5829f5a9529f051f1d24085c68a4820b28962fd83568d69f2b7d60b3c49ca827be1fc725ab39f0138fec8a08b7ba6074c33f2c3
7
+ data.tar.gz: 61f216d601ebc4598154720cd37719f7df11180f56a3e6a4da9bb117e298d7d941e76c9e0a8fd69694a86ef399effa50612b446171c094cf316c4e8afddebf69
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.gitignore ADDED
@@ -0,0 +1,56 @@
1
+ # rcov generated
2
+ coverage
3
+ coverage.data
4
+
5
+ # rdoc generated
6
+ rdoc
7
+
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+
12
+ # bundler
13
+ .bundle
14
+
15
+ # config files
16
+ .yml
17
+
18
+ # jeweler generated
19
+ pkg
20
+
21
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
22
+ #
23
+ # * Create a file at ~/.gitignore
24
+ # * Include files you want ignored
25
+ # * Run: git config --global core.excludesfile ~/.gitignore
26
+ #
27
+ # After doing this, these files will be ignored in all your git projects,
28
+ # saving you from having to 'pollute' every project you touch with them
29
+ #
30
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
31
+ #
32
+ # For MacOS:
33
+ #
34
+ .DS_Store
35
+ *.yml
36
+ .env
37
+ *.gem
38
+ Gemfile.lock
39
+
40
+ # For TextMate
41
+ #*.tmproj
42
+ #tmtags
43
+
44
+ # For emacs:
45
+ #*~
46
+ #\#*
47
+ #.\#*
48
+
49
+ # For vim:
50
+ #*.swp
51
+
52
+ # For redcar:
53
+ #.redcar
54
+
55
+ # For rubinius:
56
+ #*.rbc
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.1
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'pinboard'
4
+ gem 'nokogiri-plist'
5
+ gem 'embedly'
6
+ gem 'progress_bar'
7
+ gem "docopt"
8
+ gem "highline"
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2013 Nick Prokesch
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ 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.
data/README.md ADDED
@@ -0,0 +1,73 @@
1
+ #Pinboard Tools
2
+
3
+ ## Synopsis
4
+
5
+ Pinboard Tools is a helpful organizer for your existing [Pinboard](http://www.pinboard.in) bookmarks. When run against user-specified tags, it will find the appropriate title, synopsis and keyword tags for each matching article URL and save them to Pinboard as unread items. Pinboard Tools uses the [Embedly API][7071-001], in order to optimize speed, quality, and consistency.
6
+
7
+ ## Code Example
8
+
9
+ |2.0.0-p0| giggy in ~/dev/pinboard_tools
10
+ $ pinboard_tools tag fever
11
+ => [##########################################################] [1/1] [100.00%] [00:03] [00:00] [0.32/s]
12
+
13
+
14
+ ## Motivation
15
+
16
+ I have been saving articles to Pinboard for about a year, but attempted to use various auto-tagging systems, such as [delicio.us](http://delicio.us) tagging suggestions and [IFTTT](http://IFTTT.com) RSS tags. The result of those two workflows resulted in a mess of useless tags, and an almost useless tag cloud.
17
+
18
+ I needed a way to make sense of my existing bookmarks, to make them browsable by tag and searchable, with correct article titles (not just the ones added by saving from an article link), and usable descriptions. The [Embedly Extract API][7071-002] does a beautiful job of handling these tasks, using a hierarchy of acceptable meta data sources within articles. [Embedly][7071-001] can determine which element on a page is best suited for the data you want to retrieve.
19
+
20
+ After a bit of tinkering, I came up with this simple script. It gets all of your pinboard articles, filters them by tag, and passes each one through Embedly, replacing existing meta-data.
21
+
22
+ ## Installation
23
+
24
+ You will need:
25
+
26
+ * A [Pinboard][7071-003] account
27
+ * An [Embedly API ][7071-001] key (free for 5000 requests per month)
28
+
29
+ Install the gem
30
+
31
+ gem install pinboard_tools
32
+
33
+ To configure, run the `init` command to store your Pinboard login and Embedly API token
34
+
35
+ pinboard_tools init
36
+
37
+ You will be prompted for you [pinboard][7071-003] username and password, as well as your [Embedly][7071-001] API key.
38
+
39
+ * I have only tested against Ruby 2.1.1
40
+
41
+
42
+
43
+
44
+ ## Usage
45
+
46
+ pinboard_tools <command> <argument>
47
+
48
+ Pinboard Tools accepts two arguments.
49
+
50
+ pinboard_tools safari [-v]
51
+ Runs the Safari Reading List import to Pinboard task. This will parse your Reading List plist file, extract resolvable URLs, use Embedly to determine the correct metadata, and add each item to Pinboard. Once complete, it will clear out the Reading List to prevent duplicate tasks and minimize future Embedly API usage.
52
+
53
+ pinboardtools tag [optional tag name] [-v]
54
+ Runs the pinboard re-tagger task. When run without a tag name, it will process every article you saved to Pinboard. If you specify a tag (case sensitive), it will process every article that has that tag, and replace the metadata of the item with Embedly data.
55
+
56
+ Adding the `-v` option to either command will display a progress bar for the parsing queue.
57
+
58
+ ## Tests
59
+
60
+ Tests are written in cucumber, and ensure your connection to pinboard and Embedly.
61
+
62
+ ## Contributors
63
+
64
+ All suggestions and pull requests are welcome. Add all issues and bugs to the Issues page.
65
+
66
+ ## License
67
+
68
+ Licensed under the [MIT license][7071-005].
69
+ [7071-001]: http://embed.ly/ "Embedly: Front-end developer tools for websites and apps"
70
+ [7071-002]: http://embed.ly/docs/extract/api "Extract - API | Embedly"
71
+ [7071-003]: http://pinboard.in/ "Pinboard: social bookmarking for introverts"
72
+ [7071-004]: https://github.com/bundler/bundler/ "bundler/bundler · GitHub"
73
+ [7071-005]: http://opensource.org/licenses/MIT "The MIT License (MIT) | Open Source Initiative"
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ require 'highline/import'
4
+ require 'yaml'
5
+ namespace :pinboard do
6
+ task :login do
7
+ say("\nPlease enter your Pinboard credentials")
8
+ puts ""
9
+ user = ask("Pinboard username: ")
10
+ pass = ask("Pinboard password: ") { |q| q.echo = "*" }
11
+ embedly = ask("Embedly API key: ")
12
+ this = {pinboard_user: user.to_s, pinboard_pass: pass.to_s, embedly_key: embedly.to_s}
13
+ puts this.to_yaml
14
+ dir = %x{mkdir -p config} rescue false
15
+
16
+ config_path = File.expand_path("../config/pinboard.yml", __FILE__)
17
+ File.open(config_path, "w") do |f|
18
+ f.write(this.to_yaml)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require_relative '../lib/pinboard_tools'
4
+ require "docopt"
5
+ doc = <<DOCOPT
6
+ LazyCupid
7
+
8
+ Usage:
9
+ #{__FILE__} init
10
+ #{__FILE__} tag [<tag>] [-v]
11
+ #{__FILE__} safari [-v]
12
+
13
+ Options:
14
+ -h Show this screen.
15
+ --version Show version.
16
+ tag=<tag> tags to target for re-tagging.
17
+ safari import safari reading list.
18
+ -v Show console output.
19
+ init Setup pingboard and Embedly credentials.
20
+
21
+ DOCOPT
22
+
23
+
24
+ begin
25
+ begin
26
+ options = Docopt::docopt(doc)
27
+ rescue Exception => e
28
+ puts e.message
29
+ exit
30
+ end
31
+ # puts options
32
+ verbose = options["-v"]
33
+
34
+ if options["-h"]
35
+ require "pp"
36
+ pp Docopt::docopt(doc)
37
+ elsif options["init"]
38
+ say("\nPlease enter your Pinboard credentials")
39
+ user = ask("Pinboard username: ")
40
+ pass = ask("Pinboard password: ") { |q| q.echo = "*" }
41
+ embedly = ask("Embedly API key: ")
42
+ this = {pinboard_user: user.to_s, pinboard_pass: pass.to_s, embedly_key: embedly.to_s}
43
+ dir = %x{mkdir -p ../../config}
44
+ %x{touch ../../config/pinboard.yml}
45
+ config_path = File.expand_path("../../config/pinboard.yml", __FILE__)
46
+ File.open(config_path, "w") do |f|
47
+ f.write(this.to_yaml)
48
+ end
49
+ elsif options["tag"]
50
+ tags = options["<tag>"]
51
+ tagger = PinboardTools::Tagger.new(tag: tags, verbose: verbose)
52
+ tagger.run
53
+ elsif options["-s"] || options["safari"]
54
+ import = PinboardTools::SafariReadingListImporter.new(verbose: verbose)
55
+ import.run
56
+ end
57
+ rescue Interrupt, SystemExit
58
+ print "\rShutting down..."
59
+ end
Binary file
@@ -0,0 +1,10 @@
1
+ require_relative "pinboard_tools/version"
2
+ require 'highline/import'
3
+
4
+ module PinboardTools
5
+
6
+ Dir[File.dirname(__FILE__) + '/pinboard_tools/*.rb'].each do |file|
7
+ require file
8
+ end
9
+
10
+ end
@@ -0,0 +1,116 @@
1
+ require 'pinboard'
2
+ require 'progress_bar'
3
+ require 'embedly'
4
+ require 'yaml'
5
+ require 'open-uri'
6
+
7
+ # Detect if a string contains only a numeric value
8
+ class String
9
+ def is_number?
10
+ true if Float(self) rescue false
11
+ end
12
+ end
13
+
14
+
15
+ module PinboardTools
16
+
17
+ # Replaces keywords on select Pinboard articles via Embed.ly
18
+ #
19
+ # @param tag [Symbol] defines a string tag for tagger to filter articles by
20
+ #
21
+ class Tagger
22
+ attr_reader :pb_user, :pb_pass, :pinboard
23
+
24
+ def initialize(args)
25
+ config_path = File.expand_path("../../../config/pinboard.yml", __FILE__)
26
+ @config = YAML.load_file(config_path)
27
+ begin
28
+ @embedly_key = @config[:embedly_key].to_s
29
+ @pb_user = @config[:pinboard_user]
30
+ @pb_pass = @config[:pinboard_pass]
31
+ rescue
32
+ puts "Credentials not found. Please run `pinboardtools init`"
33
+ exit
34
+ end
35
+ @errors = 0
36
+ # @_tag = Array.new
37
+ @_tag = args[:tag]
38
+ @verbose = args[:verbose]
39
+ @pinboard = {}
40
+ end
41
+
42
+ # Handles downloading new metadata for articles via Embed.ly Extract API
43
+ #
44
+ # @param url [String] URL of article to fetch keywords for
45
+ # @return [Hash] A collection of important metadata tags for article:
46
+ # keywords [Array] 5 most relevant keywords for article
47
+ # title [String] the most likely title for the article
48
+ # excert [String] an excerpt or description for the article
49
+ #
50
+ def get_metadata(url)
51
+ title, description, tags, error_code, type = "", "", Array.new, nil, nil
52
+ embedly_api = Embedly::API.new :key => @embedly_key
53
+ # single url
54
+ obj = embedly_api.extract :url => url
55
+ obj.each do |i|
56
+ i.keywords.each do |k|
57
+ tags.push k["name"] unless k["name"].is_number?
58
+ end
59
+ tags << "unread"
60
+ title = i.title
61
+ desription = i.description
62
+ error_code = ""
63
+ error_code = i.respond_to?(:error_code) ? i.error_code : 200
64
+ # p i
65
+ type = i.type
66
+ end
67
+ return {keywords: tags.take(5), title: title, excerpt: description, error_code: error_code, type: type}
68
+ end
69
+
70
+ # Initiates new Pinboard session, fetches articles to be re-tagged, and applies new tags
71
+ #
72
+ def run
73
+ pinboard = Pinboard::Client.new(:username => @pb_user, password: @pb_pass)
74
+ posts = []
75
+ # unless @_tag.empty? && @_tag.is_a Array
76
+ if @_tag.is_a? Array
77
+ @_tag.each do |t|
78
+ pinboard.posts(tag: t).each {|p| posts << p}
79
+ end
80
+ else
81
+ begin
82
+ posts = pinboard.posts(:tag => @_tag)
83
+ rescue Exception => e
84
+ posts = pinboard.posts
85
+ end
86
+ end
87
+ # else
88
+ # posts = pinboard.posts(:results => 10)
89
+ # end
90
+ bar = ProgressBar.new(posts.size)
91
+ posts.each do |post|
92
+
93
+ tag_list = Array.new
94
+ post_metadata = get_metadata(post.href)
95
+ params = {
96
+ url: post.href,
97
+ description: post_metadata[:title],
98
+ tags: post_metadata[:keywords],
99
+ replace: true,
100
+ :public => true,
101
+ :toread => true,
102
+ :type => post_metadata[:type]
103
+ }
104
+ if post_metadata[:error_code] == 404
105
+ pinboard.delete(post.href)
106
+ elsif params[:type] != "html"
107
+ pinboard.add(url: post.href, tags: [params[:type]], description: post.href)
108
+ else
109
+ pinboard.add(params) rescue @errors += 1
110
+ end
111
+ bar.increment! if @verbose
112
+ end
113
+ puts "#{@errors} errors."
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'net/https'
4
+ require 'open-uri'
5
+ require 'pinboard'
6
+ require 'progress_bar'
7
+ require 'embedly'
8
+ require_relative 'pinboard_tagger'
9
+
10
+ class String
11
+ def is_number?
12
+ true if Float(self) rescue false
13
+ end
14
+ end
15
+
16
+ module PinboardTools
17
+
18
+ class SafariReadingListImporter
19
+ attr_accessor :tagger
20
+
21
+ def initialize(args)
22
+ @tagger = Tagger.new(tag: nil, verbose: args[:verbose])
23
+ end
24
+
25
+ def run
26
+ links = Array.new
27
+
28
+ # from gist: https://gist.github.com/andphe/3232343
29
+ input = %x[/usr/bin/plutil -convert xml1 -o - ~/Library/Safari/Bookmarks.plist | grep -E -o '<string>http[s]{0,1}:/.*</string>' | grep -v icloud | sed -E 's/<\/{0,1}string>/g']
30
+
31
+ input.scan(/(http.+){/).each do |url|
32
+ links.push url.first
33
+
34
+ # p link
35
+ end
36
+
37
+ pinboard, bar = Pinboard::Client.new(:username => tagger.pb_user, password: tagger.pb_pass), ProgressBar.new(links.size)
38
+
39
+ links.reverse_each do |url|
40
+ begin
41
+ meta = tagger.get_metadata(url)
42
+
43
+ article = {
44
+ url: url,
45
+ description: meta[:title],
46
+ extended: meta[:excerpt],
47
+ tags: meta[:keywords],
48
+ replace: true,
49
+ toread: true,
50
+ :public => false
51
+ }
52
+
53
+ pinboard.add(article) rescue false
54
+ rescue
55
+ end
56
+
57
+ bar.increment!
58
+ end
59
+ clear_list = %x{cp -R ~/dev/pinboard_tools/lib/Bookmarks.plist ~/Library/Safari/Bookmarks.plist}
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,3 @@
1
+ module PinboardTools
2
+ PinboardTools::VERSION = '0.4'
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'pinboard_tools/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pinboard_tools"
8
+ spec.version = PinboardTools::VERSION
9
+ spec.authors = ["Nick Prokesch"]
10
+ spec.email = ["nick@prokes.ch"]
11
+ spec.summary = %q{a helpful organizer for your existing Pinboard bookmarks}
12
+ spec.description = %q{Auto-tagger with embedly support, safari reading list importer, dead link remover}
13
+ spec.homepage = "https://github.com/prokizzle/pinboard_tools"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.require_paths = ["lib"]
18
+ spec.bindir = 'bin'
19
+ spec.executables << 'pinboard_tools'
20
+
21
+ spec.add_dependency "pinboard", "~> 0.1"
22
+ spec.add_dependency "nokogiri-plist", "~> 0.5"
23
+ spec.add_dependency "progress_bar", "~> 1.0"
24
+ spec.add_dependency "embedly", "~> 1.8"
25
+ spec.add_dependency "docopt", "~> 0.5"
26
+ spec.add_dependency "highline", "~> 1.6"
27
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'pinboard_tagger'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestPinboardTagger < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pinboard_tools
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.4'
5
+ platform: ruby
6
+ authors:
7
+ - Nick Prokesch
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pinboard
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri-plist
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: progress_bar
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: embedly
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.8'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.8'
69
+ - !ruby/object:Gem::Dependency
70
+ name: docopt
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.5'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: highline
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ description: Auto-tagger with embedly support, safari reading list importer, dead
98
+ link remover
99
+ email:
100
+ - nick@prokes.ch
101
+ executables:
102
+ - pinboard_tools
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - ".document"
107
+ - ".gitignore"
108
+ - ".ruby-version"
109
+ - Gemfile
110
+ - LICENSE.txt
111
+ - README.md
112
+ - Rakefile
113
+ - bin/pinboard_tools
114
+ - config/pinboard.yml
115
+ - lib/Bookmarks.plist
116
+ - lib/pinboard_tools.rb
117
+ - lib/pinboard_tools/pinboard_tagger.rb
118
+ - lib/pinboard_tools/srl_to_pinboard.rb
119
+ - lib/pinboard_tools/version.rb
120
+ - pinboard_tools.gemspec
121
+ - test/helper.rb
122
+ - test/test_pinboard_tagger.rb
123
+ homepage: https://github.com/prokizzle/pinboard_tools
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.2.2
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: a helpful organizer for your existing Pinboard bookmarks
147
+ test_files: []