pinboard_tools 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +56 -0
- data/.ruby-version +1 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +20 -0
- data/README.md +73 -0
- data/Rakefile +21 -0
- data/bin/pinboard_tools +59 -0
- data/lib/Bookmarks.plist +0 -0
- data/lib/pinboard_tools.rb +10 -0
- data/lib/pinboard_tools/pinboard_tagger.rb +116 -0
- data/lib/pinboard_tools/srl_to_pinboard.rb +62 -0
- data/lib/pinboard_tools/version.rb +3 -0
- data/pinboard_tools.gemspec +27 -0
- data/test/helper.rb +18 -0
- data/test/test_pinboard_tagger.rb +7 -0
- metadata +147 -0
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
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
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
|
data/bin/pinboard_tools
ADDED
@@ -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
|
data/lib/Bookmarks.plist
ADDED
Binary file
|
@@ -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,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
|
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: []
|