pinpress 1.2.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/HISTORY.md +11 -0
- data/README.md +3 -13
- data/Rakefile +7 -6
- data/bin/pinpress +97 -15
- data/features/support/env.rb +1 -0
- data/lib/pinpress.rb +152 -139
- data/lib/pinpress/constants.rb +2 -2
- data/lib/pinpress/template.rb +12 -0
- data/pinpress.gemspec +2 -1
- data/spec/spec_helper.rb +16 -0
- data/support/sample_config.yaml +1 -1
- metadata +23 -17
- data/lib/pinpress/templates/pin_template.rb +0 -13
- data/lib/pinpress/templates/tag_template.rb +0 -13
- data/lib/pinpress/templates/template.rb +0 -41
- data/test/pin_template_test.rb +0 -21
- data/test/pinpress_template_test.rb +0 -20
- data/test/tag_template_test.rb +0 -21
- data/test/test_helper.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5ad4abe5c4ffac712cbc94f5ab57629d55c7392
|
4
|
+
data.tar.gz: 13b08c63e46a7045d8a2568c133074831da84243
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14951a1894355244746786152988d68e94f0a3c124ef73ba25e23f7eb2324853613fa9d965293cf1852e12339056e91f9c3d4163d06fcbfdffcbbf53e6f678fd
|
7
|
+
data.tar.gz: 08617ed674306742f5778696a0584cd3deef296f27cb3903404694789a60b02682050e340655506944558e2e38ad32c621bab046a43ea989936e7def6230eb15
|
data/Gemfile
CHANGED
data/HISTORY.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 1.3.1 (2014-05-06)
|
2
|
+
|
3
|
+
* Modified last-run to store DateTime, rather than just a Date
|
4
|
+
|
5
|
+
# 1.3.0 (2014-05-05)
|
6
|
+
|
7
|
+
* Huge refactoring; much cleaner
|
8
|
+
* Added HTML encoding to pin desriptions
|
9
|
+
* Fixed bugs with application of tags to both `pins` and `tags` command
|
10
|
+
* Bumped CLIUtils to version 2.2.3
|
11
|
+
|
1
12
|
# 1.2.3 (2014-05-04)
|
2
13
|
|
3
14
|
* Fixed a bug where error management failed
|
data/README.md
CHANGED
@@ -42,7 +42,7 @@ SYNOPSIS
|
|
42
42
|
pinpress [global options] command [command options] [arguments...]
|
43
43
|
|
44
44
|
VERSION
|
45
|
-
1.
|
45
|
+
1.3.1
|
46
46
|
|
47
47
|
GLOBAL OPTIONS
|
48
48
|
--help - Show this message
|
@@ -158,7 +158,6 @@ grab:
|
|
158
158
|
|
159
159
|
* `-s`: the start date to use (uses [Chronic](https://github.com/mojombo/chronic "Chronic"), which allows dates like "last Tuesday")
|
160
160
|
* `-e`: the end date to use (also uses [Chronic](https://github.com/mojombo/chronic "Chronic"))
|
161
|
-
* `-t`: a CSV list of tags (e.g., "tag1,tag2") to examine for association (see [below](#getting-tags-that-have-been-used-with-other-tags)).
|
162
161
|
|
163
162
|
## Getting Tags From a Date Forward
|
164
163
|
|
@@ -184,15 +183,6 @@ $ pinpress tags -e 2014-01-01
|
|
184
183
|
$ pinpress tags -s 2014-01-01 -e 2014-01-31
|
185
184
|
```
|
186
185
|
|
187
|
-
## Getting Tags that Have Been Used With Other Tags
|
188
|
-
|
189
|
-
```bash
|
190
|
-
$ pinpress tags -t 'tag1,tag2' -s 2014-01-01
|
191
|
-
```
|
192
|
-
|
193
|
-
...returns all tags that have been used *alongside* `tag1` and `tag2`, starting
|
194
|
-
on Jarnuary 1, 2014.
|
195
|
-
|
196
186
|
## Getting Tags Used Since Last Run
|
197
187
|
|
198
188
|
```bash
|
@@ -397,10 +387,10 @@ pinpress:
|
|
397
387
|
# The default `tags` template to use
|
398
388
|
default_tag_template
|
399
389
|
|
400
|
-
# The default tags to be used when
|
390
|
+
# The default tags to be used when running `pinpress pins`
|
401
391
|
default_tags: ['tag1', 'tag2']
|
402
392
|
|
403
|
-
# The tags to
|
393
|
+
# The tags to that are removed from the results when running `pinpress tags`
|
404
394
|
ignored_tags: ['bad-tag', 'bad-tag2']
|
405
395
|
|
406
396
|
# The default number of results to return
|
data/Rakefile
CHANGED
@@ -8,11 +8,11 @@ end
|
|
8
8
|
|
9
9
|
spec = eval(File.read('pinpress.gemspec'))
|
10
10
|
|
11
|
-
require '
|
12
|
-
desc
|
13
|
-
|
14
|
-
t.
|
15
|
-
t.
|
11
|
+
require 'rspec/core/rake_task'
|
12
|
+
desc "Run the specs."
|
13
|
+
RSpec::Core::RakeTask.new do |t|
|
14
|
+
t.pattern = "spec/**/*_spec.rb"
|
15
|
+
t.verbose = false
|
16
16
|
end
|
17
17
|
|
18
18
|
require 'cucumber'
|
@@ -53,4 +53,5 @@ task :build do
|
|
53
53
|
FileUtils.mv("./pinpress-#{ version }.gem", "pkg")
|
54
54
|
end
|
55
55
|
|
56
|
-
task :default => [:yard, :
|
56
|
+
task :default => [:yard, :spec, :features]
|
57
|
+
# task :default => [:spec]
|
data/bin/pinpress
CHANGED
@@ -33,6 +33,7 @@
|
|
33
33
|
require 'chronic'
|
34
34
|
require 'cliutils'
|
35
35
|
require 'gli'
|
36
|
+
require 'htmlentities'
|
36
37
|
require 'pinboard'
|
37
38
|
require 'pinpress'
|
38
39
|
|
@@ -49,15 +50,16 @@ version PinPress::VERSION
|
|
49
50
|
# ======================================================
|
50
51
|
# Global Flags and Switches
|
51
52
|
# ======================================================
|
53
|
+
switch([:v], desc: 'Run pinpress in verbose mode')
|
52
54
|
|
53
55
|
# ======================================================
|
54
|
-
# Pre
|
56
|
+
# Pre (runs before every command)
|
55
57
|
# ======================================================
|
56
58
|
pre do |global, command, options, args|
|
57
59
|
# Load PinPress configuration module.
|
58
60
|
load_configuration(PinPress::CONFIG_FILEPATH)
|
59
61
|
file_logger = Logger.new(PinPress::LOG_FILEPATH)
|
60
|
-
file_logger.level = LOG_LEVELS[configuration.pinpress
|
62
|
+
file_logger.level = LOG_LEVELS[configuration.pinpress.log_level || 'DEBUG']
|
61
63
|
messenger.attach(LOGFILE: file_logger)
|
62
64
|
|
63
65
|
if File.exist?(PinPress::CONFIG_FILEPATH)
|
@@ -80,10 +82,16 @@ pre do |global, command, options, args|
|
|
80
82
|
true
|
81
83
|
end
|
82
84
|
|
85
|
+
# ======================================================
|
86
|
+
# Post (runs after every command)
|
87
|
+
# ======================================================
|
83
88
|
post do |global, command, options, args|
|
84
89
|
|
85
90
|
end
|
86
91
|
|
92
|
+
# ======================================================
|
93
|
+
# Error (runs when an exception is raised)
|
94
|
+
# ======================================================
|
87
95
|
on_error do |exception|
|
88
96
|
messenger.error(exception.to_s)
|
89
97
|
exit!(1)
|
@@ -103,6 +111,8 @@ desc 'Install and initialize dependencies'
|
|
103
111
|
command :init do |c|
|
104
112
|
c.switch([:s], desc: 'Run init from scratch')
|
105
113
|
c.action do |global_options, options, args|
|
114
|
+
PinPress.verbose = global_options[:v]
|
115
|
+
|
106
116
|
if options[:s]
|
107
117
|
PinPress.init(true)
|
108
118
|
else
|
@@ -124,22 +134,58 @@ command :pins do |c|
|
|
124
134
|
c.flag([:s], desc: 'The start date to pull pins from')
|
125
135
|
c.flag([:t], desc: 'The tags to use (e.g., "ruby,pinboard")')
|
126
136
|
|
137
|
+
c.desc 'Gets pins from Pinboard'
|
138
|
+
c.action do |global_options, options, args|
|
139
|
+
PinPress.verbose = global_options[:v]
|
140
|
+
|
141
|
+
# Figure out the template to use based on the passed argument (if any)
|
142
|
+
# and/or the presence of a default template.
|
143
|
+
template = PinPress.init_template(args[0], PinPress::Template::TYPE_PIN)
|
144
|
+
|
145
|
+
# Assuming a valid template is found, transform CLI flags into options for
|
146
|
+
# the Pinboard gem.
|
147
|
+
opts = {}
|
148
|
+
opts.merge!(todt: Chronic.parse(options[:e])) if options[:e]
|
149
|
+
opts.merge!(fromdt: Chronic.parse(options[:s])) if options[:s]
|
150
|
+
opts.merge!(PinPress.merge_common_options(options))
|
151
|
+
|
152
|
+
# Request pin data from Pinboard and output the return data.
|
153
|
+
output = PinPress.pin_yield(template, opts)
|
154
|
+
puts output if output
|
155
|
+
|
156
|
+
# Save the last-run date to the configuration file.
|
157
|
+
configuration.pinpress.last_pins_run = Time.now.utc.iso8601
|
158
|
+
configuration.save
|
159
|
+
end
|
160
|
+
|
127
161
|
c.desc 'Gets all pins from the last run date + 1'
|
128
162
|
c.command :last do |last|
|
129
163
|
last.action do |global_options, options, args|
|
130
|
-
|
164
|
+
PinPress.verbose = global_options[:v]
|
165
|
+
|
166
|
+
last_run_date = configuration.pinpress.last_pins_run
|
131
167
|
if last_run_date
|
132
|
-
|
133
|
-
|
168
|
+
# Figure out the template to use based on the passed argument (if any)
|
169
|
+
# and/or the presence of a default template.
|
170
|
+
template = PinPress.init_template(args[0], PinPress::Template::TYPE_PIN)
|
171
|
+
|
172
|
+
# Set one option: the start date. Set it to the last-run date + 1.
|
173
|
+
opts = {}
|
174
|
+
opts.merge!(fromdt: last_run_date + 1)
|
175
|
+
opts.merge!(PinPress.merge_common_options(options))
|
176
|
+
|
177
|
+
# Request pin data from Pinboard and output the return data.
|
178
|
+
output = PinPress.pin_yield(template, opts)
|
179
|
+
puts output if output
|
180
|
+
|
181
|
+
# Save the last-run date to the configuration file.
|
182
|
+
configuration.pinpress.last_pins_run = Time.now.utc.iso8601
|
183
|
+
configuration.save
|
134
184
|
else
|
135
185
|
messenger.warn("`pinpress pins` hasn't been run before.")
|
136
186
|
end
|
137
187
|
end
|
138
188
|
end
|
139
|
-
|
140
|
-
c.action do |global_options, options, args|
|
141
|
-
puts PinPress.get_data(PinPress::Template::TEMPLATE_TYPE_PIN, args, options)
|
142
|
-
end
|
143
189
|
end
|
144
190
|
|
145
191
|
# ------------------------------------------------------
|
@@ -156,32 +202,68 @@ command :tags do |c|
|
|
156
202
|
c.desc 'Gets all tags from the last run date + 1'
|
157
203
|
c.command :last do |last|
|
158
204
|
last.action do |global_options, options, args|
|
159
|
-
last_run_date = configuration.pinpress
|
205
|
+
last_run_date = configuration.pinpress.last_tags_run
|
160
206
|
if last_run_date
|
161
|
-
|
162
|
-
|
207
|
+
PinPress.verbose = global_options[:v]
|
208
|
+
|
209
|
+
# Figure out the template to use based on the passed argument (if any)
|
210
|
+
# and/or the presence of a default template.
|
211
|
+
template = PinPress.init_template(args[0], PinPress::Template::TYPE_TAG)
|
212
|
+
|
213
|
+
# Set one option: the start date. Set it to the last-run date + 1.
|
214
|
+
opts = {}
|
215
|
+
opts.merge!(fromdt: last_run_date + 1)
|
216
|
+
opts.merge!(PinPress.merge_common_options(options))
|
217
|
+
|
218
|
+
# Request tag data from Pinboard and output the return data.
|
219
|
+
output = PinPress.tag_yield(template, opts)
|
220
|
+
puts output if output
|
221
|
+
|
222
|
+
# Save the last-run date to the configuration file.
|
223
|
+
configuration.pinpress.last_tags_run = Time.now.utc.iso8601
|
224
|
+
configuration.save
|
163
225
|
else
|
164
226
|
messenger.warn("`pinpress tags` hasn't been run before.")
|
165
227
|
end
|
166
228
|
end
|
167
229
|
end
|
168
230
|
|
169
|
-
c.desc 'Gets
|
231
|
+
c.desc 'Gets unique tags based on the passed criteria'
|
170
232
|
c.action do |global_options, options, args|
|
171
|
-
|
233
|
+
PinPress.verbose = global_options[:v]
|
234
|
+
|
235
|
+
# Figure out the template to use based on the passed argument (if any)
|
236
|
+
# and/or the presence of a default template.
|
237
|
+
template = PinPress.init_template(args[0], PinPress::Template::TYPE_TAG)
|
238
|
+
|
239
|
+
# Assuming a valid template is found, transform CLI flags into options for
|
240
|
+
# the Pinboard gem.
|
241
|
+
opts = {}
|
242
|
+
opts.merge!(todt: Chronic.parse(options[:e])) if options[:e]
|
243
|
+
opts.merge!(fromdt: Chronic.parse(options[:s])) if options[:s]
|
244
|
+
opts.merge!(PinPress.merge_common_options(options))
|
245
|
+
|
246
|
+
# Request tag data from Pinboard and output the return data.
|
247
|
+
output = PinPress.tag_yield(template, opts)
|
248
|
+
puts output if output
|
249
|
+
|
250
|
+
# Save the last-run date to the configuration file.
|
251
|
+
configuration.pinpress.last_tags_run = Time.now.utc.iso8601
|
252
|
+
configuration.save
|
172
253
|
end
|
173
254
|
end
|
174
255
|
|
175
256
|
# ------------------------------------------------------
|
176
257
|
# templates command
|
177
258
|
#
|
178
|
-
# Manages pin templates.
|
259
|
+
# Manages pin and tag templates.
|
179
260
|
# ------------------------------------------------------
|
180
261
|
desc 'Work with templates for pin output'
|
181
262
|
command :templates do |c|
|
182
263
|
c.desc 'List current templates'
|
183
264
|
c.command :list do |list|
|
184
265
|
list.action do |global_options, options, args|
|
266
|
+
PinPress.verbose = global_options[:v]
|
185
267
|
PinPress.list_templates
|
186
268
|
end
|
187
269
|
end
|
data/features/support/env.rb
CHANGED
data/lib/pinpress.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'pinpress/constants'
|
2
|
-
require 'pinpress/
|
3
|
-
require 'pinpress/templates/pin_template'
|
4
|
-
require 'pinpress/templates/tag_template'
|
2
|
+
require 'pinpress/template'
|
5
3
|
|
6
4
|
# The PinPress module, which wraps everything
|
7
5
|
# in this gem.
|
8
6
|
module PinPress
|
7
|
+
extend self
|
8
|
+
|
9
9
|
class << self
|
10
10
|
# Stores whether initalization has completed.
|
11
11
|
# @return [Boolean]
|
@@ -16,137 +16,63 @@ module PinPress
|
|
16
16
|
attr_accessor :verbose
|
17
17
|
end
|
18
18
|
|
19
|
-
#
|
20
|
-
#
|
21
|
-
# @param [
|
22
|
-
# @
|
23
|
-
# @
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
fail 'Invalid template provided and/or no default template'
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# Generates a string of items from pins.
|
37
|
-
# @param [Fixnum] template_type
|
38
|
-
# @param [PinPress::Template] template
|
39
|
-
# @param [Array] pins
|
40
|
-
# @return [String]
|
41
|
-
def self.generate_items(template_type, template, pins, opts)
|
42
|
-
output = ''
|
43
|
-
case template_type
|
44
|
-
when PinPress::Template::TEMPLATE_TYPE_PIN
|
45
|
-
pins.each do |p|
|
46
|
-
href = p[:href]
|
47
|
-
description = p[:description]
|
48
|
-
extended = p[:extended]
|
49
|
-
tag = p[:tag]
|
50
|
-
time = p[:time]
|
51
|
-
replace = p[:replace]
|
52
|
-
shared = p[:shared]
|
53
|
-
toread = p[:toread]
|
54
|
-
output += ERB.new(template.item).result(binding)
|
55
|
-
end
|
56
|
-
configuration.pinpress[:last_pins_run] = Date.today
|
57
|
-
when PinPress::Template::TEMPLATE_TYPE_TAG
|
58
|
-
tags = []
|
59
|
-
pins.each { |p| tags += p[:tag] }
|
60
|
-
tags = tags.uniq.map { |t| { tag: t, count: tags.count(t) } }
|
61
|
-
tags.each do |t|
|
62
|
-
unless t[:tag] == opts[:tag]
|
63
|
-
tag = t[:tag]
|
64
|
-
count = t[:count]
|
65
|
-
output += ERB.new(template.item).result(binding)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
configuration.pinpress[:last_tags_run] = Date.today
|
69
|
-
end
|
70
|
-
output
|
71
|
-
end
|
72
|
-
|
73
|
-
# Generic function to get data from Pinboard.
|
74
|
-
# @param [Fixnum] template_type
|
75
|
-
# @param [Array] args
|
76
|
-
# @param [Hash] options
|
77
|
-
# @return [String]
|
78
|
-
def self.get_data(template_type, args, options)
|
79
|
-
output = ''
|
80
|
-
|
81
|
-
# Two scenarios covered here:
|
82
|
-
# 1. If the user passes a valid name, grab that template.
|
83
|
-
# 2. If no name is passed, grabbed the default template
|
84
|
-
# If both of these conditions fail, an error message is shown.
|
85
|
-
# t_type = PinPress::Template::TEMPLATE_TYPE_PIN
|
86
|
-
# t_name = args.empty? ? nil : args[0]
|
87
|
-
t_name = args.empty? ? nil : args[0]
|
88
|
-
|
89
|
-
PinPress.execute_template(template_type, t_name) do |template, client|
|
90
|
-
opts = {}
|
91
|
-
opts.merge!(todt: Chronic.parse(options[:e])) if options[:e]
|
92
|
-
opts.merge!(fromdt: Chronic.parse(options[:s])) if options[:s]
|
93
|
-
|
94
|
-
if options[:n]
|
95
|
-
opts.merge!(results: options[:n])
|
96
|
-
elsif configuration.pinpress[:default_num_results]
|
97
|
-
opts.merge!(results: configuration.pinpress[:default_num_results])
|
98
|
-
end
|
99
|
-
|
100
|
-
if options[:t]
|
101
|
-
tags = options[:t].split(',')
|
102
|
-
elsif configuration.pinpress[:default_tags]
|
103
|
-
tags = configuration.pinpress[:default_tags]
|
104
|
-
end
|
105
|
-
|
106
|
-
ignored_tags = configuration.pinpress[:ignored_tags]
|
107
|
-
tags -= ignored_tags if ignored_tags
|
108
|
-
opts.merge!(tag: tags) if tags
|
109
|
-
|
110
|
-
begin
|
111
|
-
pins = client.posts(opts)
|
112
|
-
if pins.empty?
|
113
|
-
messenger.warn('No matching pins...')
|
114
|
-
else
|
115
|
-
output += template.opener if template.opener
|
116
|
-
output += PinPress.generate_items(template_type, template, pins, opts)
|
117
|
-
output += template.closer if template.closer
|
118
|
-
end
|
119
|
-
|
120
|
-
configuration.save
|
121
|
-
return output
|
122
|
-
rescue StandardError => e
|
123
|
-
messenger.debug(e.to_s)
|
124
|
-
raise "Pinboard API failed; are you sure you've run " \
|
125
|
-
" `pinpress init` (and that your API key is correct)?"
|
19
|
+
# Grabs Pinboard data (passed on passed options) and yields a block that
|
20
|
+
# allows the user to act upon that returned data.
|
21
|
+
# @param [Hash] pinboard_opts
|
22
|
+
# @yield pins
|
23
|
+
# @raise StandardError if Pinboard client fails
|
24
|
+
def execute_template(pinboard_opts)
|
25
|
+
begin
|
26
|
+
client = Pinboard::Client.new(token: configuration.pinpress.api_token)
|
27
|
+
pins = client.posts(pinboard_opts)
|
28
|
+
if pins.empty?
|
29
|
+
messenger.warn('No data matching your arguments...')
|
30
|
+
else
|
31
|
+
yield pins
|
126
32
|
end
|
33
|
+
rescue StandardError => e
|
34
|
+
messenger.debug(e.to_s)
|
35
|
+
puts e.to_s
|
36
|
+
raise "Pinboard API failed; are you sure you've run " \
|
37
|
+
" `pinpress init` (and that your API key is correct)?"
|
127
38
|
end
|
128
39
|
end
|
129
40
|
|
130
|
-
#
|
131
|
-
# @param [
|
132
|
-
# @param [
|
133
|
-
# @return [
|
134
|
-
def
|
41
|
+
# Returns a template Hash from the configuration file.
|
42
|
+
# @param [String] template_name The name of the template to get
|
43
|
+
# @param [Fixnum] template_type The template type
|
44
|
+
# @return [Hash]
|
45
|
+
def get_template(template_name, template_type)
|
135
46
|
case template_type
|
136
|
-
when Template::
|
137
|
-
default_t_name = configuration.pinpress[:default_pin_template]
|
47
|
+
when PinPress::Template::TYPE_PIN
|
138
48
|
templates = configuration.pin_templates
|
139
|
-
when Template::
|
140
|
-
default_t_name = configuration.pinpress[:default_tag_template]
|
49
|
+
when PinPress::Template::TYPE_TAG
|
141
50
|
templates = configuration.tag_templates
|
142
|
-
else
|
143
|
-
fail 'Invalid template type given'
|
144
51
|
end
|
52
|
+
templates.find { |t| t[:name] == template_name }
|
53
|
+
end
|
145
54
|
|
146
|
-
|
147
|
-
|
55
|
+
# "Initializes" a passed template:
|
56
|
+
# 1. If the template exists, returns it.
|
57
|
+
# 2. If not, return a default template (if it exists).
|
58
|
+
# 3. Throw an exception if #1 and #2 fail.
|
59
|
+
# @param [String] explicit_template A template name passed in via the CLI
|
60
|
+
# @param [Fixnum] template_type The template type
|
61
|
+
# @return [Hash]
|
62
|
+
# @raise StandardError if no explicit or default template is found
|
63
|
+
def init_template(explicit_template, template_type)
|
64
|
+
pin_t_sym = :default_pin_template
|
65
|
+
tag_t_sym = :default_tag_template
|
66
|
+
s = (template_type == PinPress::Template::TYPE_PIN ? pin_t_sym : tag_t_sym)
|
67
|
+
default_template = configuration.pinpress[s]
|
68
|
+
if PinPress.is_template?(explicit_template, template_type)
|
69
|
+
messenger.debug("Using explicit template: #{ explicit_template }")
|
70
|
+
return PinPress.get_template(explicit_template, template_type)
|
71
|
+
elsif PinPress.is_template?(default_template, template_type)
|
72
|
+
messenger.debug("Using default template: #{ default_template }")
|
73
|
+
return PinPress.get_template(default_template, template_type)
|
148
74
|
else
|
149
|
-
|
75
|
+
fail 'Invalid template defined and/or no default template specified'
|
150
76
|
end
|
151
77
|
end
|
152
78
|
|
@@ -154,51 +80,64 @@ module PinPress
|
|
154
80
|
# collecting all necessary items and info.
|
155
81
|
# @param [Boolean] from_scratch
|
156
82
|
# @return [void]
|
157
|
-
def
|
83
|
+
def init(from_scratch = false)
|
158
84
|
messenger.section('INITIALIZING...')
|
159
85
|
if from_scratch
|
160
86
|
configuration.reset
|
161
|
-
configuration.add_section(:pinpress)
|
162
|
-
configuration.add_section(:pin_templates)
|
163
|
-
configuration.add_section(:tag_templates)
|
164
87
|
|
165
|
-
configuration.
|
88
|
+
# Add initial configuration info.
|
89
|
+
configuration.add_section(:pinpress)
|
90
|
+
configuration.pinpress = {
|
166
91
|
config_location: configuration.config_path,
|
167
92
|
default_pin_template: 'pinpress_default',
|
168
93
|
default_tag_template: 'pinpress_default',
|
169
94
|
log_level: 'WARN',
|
170
95
|
version: PinPress::VERSION
|
171
|
-
|
96
|
+
}
|
172
97
|
|
98
|
+
# Add a single default pin and tag template
|
173
99
|
default_pin_template = {
|
174
100
|
name: 'pinpress_default',
|
175
101
|
opener: '<ul>',
|
176
|
-
item: '<li
|
102
|
+
item: '<li><%= href %></li>',
|
177
103
|
closer: '</ul>'
|
178
104
|
}
|
179
|
-
|
180
105
|
default_tag_template = {
|
181
106
|
name: 'pinpress_default',
|
182
107
|
item: '<%= tag %> (<%= count %>),'
|
183
108
|
}
|
184
|
-
|
185
|
-
configuration.
|
186
|
-
configuration.data['tag_templates'] = [default_tag_template]
|
109
|
+
configuration.pin_templates = [default_pin_template]
|
110
|
+
configuration.tag_templates = [default_tag_template]
|
187
111
|
end
|
188
112
|
|
113
|
+
# Run through installation prompts and ingest the results into
|
114
|
+
# the configuration.
|
189
115
|
pm = CLIUtils::Prefs.new(PinPress::PREF_FILES['INIT'], configuration)
|
190
116
|
pm.ask
|
191
117
|
configuration.ingest_prefs(pm)
|
192
118
|
|
193
|
-
|
194
|
-
|
119
|
+
m = "Configuration values after pref collection: #{ configuration.data }"
|
120
|
+
messenger.debug(m)
|
195
121
|
configuration.save
|
196
122
|
@initialized = true
|
197
123
|
end
|
198
124
|
|
125
|
+
# Determines whether a template exists in the configuration file.
|
126
|
+
# @param [String] template_name The name of the template to search for
|
127
|
+
# @param [Fixnum] template_type The template type
|
128
|
+
def is_template?(template_name, template_type)
|
129
|
+
case template_type
|
130
|
+
when PinPress::Template::TYPE_PIN
|
131
|
+
templates = configuration.pin_templates
|
132
|
+
when PinPress::Template::TYPE_TAG
|
133
|
+
templates = configuration.tag_templates
|
134
|
+
end
|
135
|
+
!templates.find { |t| t[:name] == template_name }.nil?
|
136
|
+
end
|
137
|
+
|
199
138
|
# Present a list of installed templates to the user
|
200
139
|
# @return [void]
|
201
|
-
def
|
140
|
+
def list_templates
|
202
141
|
pin_templates = configuration.pin_templates
|
203
142
|
tag_templates = configuration.tag_templates
|
204
143
|
|
@@ -221,10 +160,84 @@ module PinPress
|
|
221
160
|
end
|
222
161
|
end
|
223
162
|
|
163
|
+
# Helper method to merge command line options that are relevant for both pin
|
164
|
+
# and tag requests.
|
165
|
+
# @param [Hash] options
|
166
|
+
# @return [Hash]
|
167
|
+
def merge_common_options(options)
|
168
|
+
opts = {}
|
169
|
+
if options[:n]
|
170
|
+
opts.merge!(results: options[:n])
|
171
|
+
elsif configuration.pinpress.default_num_results
|
172
|
+
opts.merge!(results: configuration.pinpress.default_num_results)
|
173
|
+
end
|
174
|
+
|
175
|
+
if options[:t]
|
176
|
+
opts.merge!(tag: options[:t])
|
177
|
+
elsif configuration.pinpress.default_tags
|
178
|
+
opts.merge!(tag: configuration.pinpress.default_tags.join(','))
|
179
|
+
end
|
180
|
+
opts
|
181
|
+
end
|
182
|
+
|
183
|
+
# Creates text output from pin data (based upon a passed template).
|
184
|
+
# @param [Hash] template The template to use
|
185
|
+
# @param [Hash] opts CLI options to use
|
186
|
+
# @return [String]
|
187
|
+
def pin_yield(template, opts)
|
188
|
+
output = ''
|
189
|
+
PinPress.execute_template(opts) do |data|
|
190
|
+
html_coder = HTMLEntities.new
|
191
|
+
|
192
|
+
output += template[:opener] if template[:opener]
|
193
|
+
data.each do |i|
|
194
|
+
href = i[:href]
|
195
|
+
description = html_coder.encode(i[:description])
|
196
|
+
extended = i[:extended]
|
197
|
+
tag = i[:tag]
|
198
|
+
time = i[:time]
|
199
|
+
replace = i[:replace]
|
200
|
+
shared = i[:shared]
|
201
|
+
toread = i[:toread]
|
202
|
+
output += ERB.new(template[:item]).result(binding)
|
203
|
+
end
|
204
|
+
output += template[:closer] if template[:closer]
|
205
|
+
end
|
206
|
+
output
|
207
|
+
end
|
208
|
+
|
209
|
+
# Creates text output from tag data (based upon a passed template).
|
210
|
+
# @param [Hash] template The template to use
|
211
|
+
# @param [Hash] opts CLI options to use
|
212
|
+
# @return [String]
|
213
|
+
def tag_yield(template, opts)
|
214
|
+
output = ''
|
215
|
+
PinPress.execute_template(opts) do |data|
|
216
|
+
tags = []
|
217
|
+
ignored_tags = configuration.pinpress.ignored_tags
|
218
|
+
|
219
|
+
data.each { |i| tags += i[:tag] }
|
220
|
+
tags = (tags -= ignored_tags if ignored_tags).uniq.map do |t|
|
221
|
+
{ tag: t, count: tags.count(t) }
|
222
|
+
end
|
223
|
+
|
224
|
+
output += template[:opener] if template[:opener]
|
225
|
+
tags.each do |t|
|
226
|
+
unless t[:tag] == opts[:tag]
|
227
|
+
tag = t[:tag]
|
228
|
+
count = t[:count]
|
229
|
+
output += ERB.new(template.item).result(binding)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
output += template[:closer] if template[:closer]
|
233
|
+
end
|
234
|
+
output
|
235
|
+
end
|
236
|
+
|
224
237
|
# Notifies the user that the config file needs to be
|
225
238
|
# re-done and does it.
|
226
239
|
# @return [void]
|
227
|
-
def
|
240
|
+
def update_config_file
|
228
241
|
m = "This version needs to make some config changes. Don't worry; " \
|
229
242
|
"when prompted, your current values for existing config options " \
|
230
243
|
"will be presented (so it'll be easier to fly through the upgrade)."
|
data/lib/pinpress/constants.rb
CHANGED
@@ -9,7 +9,7 @@ module PinPress
|
|
9
9
|
|
10
10
|
# The Gem's description
|
11
11
|
DESCRIPTION = %q(A Pinboard application that allows for the creation of
|
12
|
-
|
12
|
+
pin and tag templates in almost any conceivable format.)
|
13
13
|
|
14
14
|
# The last version to require a config update
|
15
15
|
NEWEST_CONFIG_VERSION = '1.2.1'
|
@@ -28,5 +28,5 @@ module PinPress
|
|
28
28
|
SUMMARY = 'A simple CLI to create HTML templates of Pinboard data.'
|
29
29
|
|
30
30
|
# The Gem's version
|
31
|
-
VERSION = '1.
|
31
|
+
VERSION = '1.3.0'
|
32
32
|
end
|
data/pinpress.gemspec
CHANGED
@@ -16,10 +16,11 @@ Gem::Specification.new do |spec|
|
|
16
16
|
|
17
17
|
spec.add_development_dependency('aruba', '0.5.4')
|
18
18
|
spec.add_development_dependency('rake', '10.1.1')
|
19
|
-
spec.add_development_dependency('
|
19
|
+
spec.add_development_dependency('rspec', '2.14.1')
|
20
20
|
spec.add_development_dependency('yard', '0.8.7.4')
|
21
21
|
spec.add_runtime_dependency('chronic', '0.10.2')
|
22
22
|
spec.add_runtime_dependency('cliutils', '~> 2')
|
23
23
|
spec.add_runtime_dependency('gli', '2.9.0')
|
24
|
+
spec.add_runtime_dependency('htmlentities', '4.3.1')
|
24
25
|
spec.add_runtime_dependency('pinboard', '0.1.1')
|
25
26
|
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# require 'coveralls'
|
2
|
+
require 'rspec'
|
3
|
+
# require 'simplecov'
|
4
|
+
require 'stringio'
|
5
|
+
|
6
|
+
# SimpleCov.start
|
7
|
+
# Coveralls.wear!
|
8
|
+
|
9
|
+
def capture_stdout
|
10
|
+
old = $stdout
|
11
|
+
$stdout = fake = StringIO.new
|
12
|
+
yield
|
13
|
+
fake.string
|
14
|
+
ensure
|
15
|
+
$stdout = old
|
16
|
+
end
|
data/support/sample_config.yaml
CHANGED
@@ -8,7 +8,7 @@ pinpress:
|
|
8
8
|
pin_templates:
|
9
9
|
- name: pinpress_default
|
10
10
|
opener: "<ul>"
|
11
|
-
item: <li
|
11
|
+
item: <li><%= href %></li>
|
12
12
|
closer: "</ul>"
|
13
13
|
tag_templates:
|
14
14
|
- name: pinpress_default
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pinpress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Bach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aruba
|
@@ -39,19 +39,19 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 10.1.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 2.14.1
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 2.14.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: yard
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 2.9.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: htmlentities
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 4.3.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 4.3.1
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: pinboard
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,7 +138,7 @@ dependencies:
|
|
124
138
|
version: 0.1.1
|
125
139
|
description: |-
|
126
140
|
A Pinboard application that allows for the creation of
|
127
|
-
|
141
|
+
pin and tag templates in almost any conceivable format.
|
128
142
|
email:
|
129
143
|
- bachya1208@googlemail.com
|
130
144
|
executables:
|
@@ -147,16 +161,11 @@ files:
|
|
147
161
|
- features/support/env.rb
|
148
162
|
- lib/pinpress.rb
|
149
163
|
- lib/pinpress/constants.rb
|
150
|
-
- lib/pinpress/
|
151
|
-
- lib/pinpress/templates/tag_template.rb
|
152
|
-
- lib/pinpress/templates/template.rb
|
164
|
+
- lib/pinpress/template.rb
|
153
165
|
- pinpress.gemspec
|
166
|
+
- spec/spec_helper.rb
|
154
167
|
- support/preference_prompts.yaml
|
155
168
|
- support/sample_config.yaml
|
156
|
-
- test/pin_template_test.rb
|
157
|
-
- test/pinpress_template_test.rb
|
158
|
-
- test/tag_template_test.rb
|
159
|
-
- test/test_helper.rb
|
160
169
|
homepage: https://github.com/bachya/pinpress
|
161
170
|
licenses:
|
162
171
|
- MIT
|
@@ -187,8 +196,5 @@ test_files:
|
|
187
196
|
- features/3.templates.feature
|
188
197
|
- features/step_definitions/pinpress_steps.rb
|
189
198
|
- features/support/env.rb
|
190
|
-
-
|
191
|
-
- test/pinpress_template_test.rb
|
192
|
-
- test/tag_template_test.rb
|
193
|
-
- test/test_helper.rb
|
199
|
+
- spec/spec_helper.rb
|
194
200
|
has_rdoc:
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module PinPress
|
2
|
-
# A template for a pin; even though
|
3
|
-
# currently empty, allows for future
|
4
|
-
# flexibility.
|
5
|
-
class PinTemplate < Template
|
6
|
-
# Initializes a new Pin Template.
|
7
|
-
# @param [Hash] params
|
8
|
-
# @return [void]
|
9
|
-
def initialize(params = {})
|
10
|
-
super(params)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module PinPress
|
2
|
-
# A template for a tag; even though
|
3
|
-
# currently empty, allows for future
|
4
|
-
# flexibility.
|
5
|
-
class TagTemplate < Template
|
6
|
-
# Initializes a new Tag Template.
|
7
|
-
# @param [Hash] params
|
8
|
-
# @return [void]
|
9
|
-
def initialize(params = {})
|
10
|
-
super(params)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module PinPress
|
2
|
-
# A template for outputting Pinboard data
|
3
|
-
class Template
|
4
|
-
# Defines a pin template
|
5
|
-
# @return [Fixnum]
|
6
|
-
TEMPLATE_TYPE_PIN = 1
|
7
|
-
|
8
|
-
# Defines a tag template
|
9
|
-
# @return [Fixnum]
|
10
|
-
TEMPLATE_TYPE_TAG = 2
|
11
|
-
|
12
|
-
# Holds the "closer" (the string that
|
13
|
-
# should come after all template items
|
14
|
-
# are output)
|
15
|
-
# @return [String]
|
16
|
-
attr_accessor :closer
|
17
|
-
|
18
|
-
# Holds the string that defines what
|
19
|
-
# an item should look like.
|
20
|
-
# @return [String]
|
21
|
-
attr_accessor :item
|
22
|
-
|
23
|
-
# Holds the name of the template.
|
24
|
-
# @return [String]
|
25
|
-
attr_accessor :name
|
26
|
-
|
27
|
-
# Holds the "opener" (the string that
|
28
|
-
# should come before all template items
|
29
|
-
# are output)
|
30
|
-
# @return [String]
|
31
|
-
attr_accessor :opener
|
32
|
-
|
33
|
-
# Initializes this class by ingesting
|
34
|
-
# passed parameters.
|
35
|
-
# @param [Hash] params
|
36
|
-
# @return [void]
|
37
|
-
def initialize(params = {})
|
38
|
-
params.each { |key, value| send("#{ key }=", value) }
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/test/pin_template_test.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), '..', 'lib/pinpress/templates/template')
|
4
|
-
require File.join(File.dirname(__FILE__), '..', 'lib/pinpress/templates/pin_template')
|
5
|
-
|
6
|
-
class TestPinTemplate < Test::Unit::TestCase
|
7
|
-
def test_initialization
|
8
|
-
parameters = {
|
9
|
-
closer: '</ul>',
|
10
|
-
item: '<li></li>',
|
11
|
-
name: 'default',
|
12
|
-
opener: '</ul>',
|
13
|
-
}
|
14
|
-
|
15
|
-
t = PinPress::PinTemplate.new(parameters)
|
16
|
-
assert_equal(t.closer, parameters[:closer])
|
17
|
-
assert_equal(t.item, parameters[:item])
|
18
|
-
assert_equal(t.name, parameters[:name])
|
19
|
-
assert_equal(t.opener, parameters[:opener])
|
20
|
-
end
|
21
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), '..', 'lib/pinpress/templates/template')
|
4
|
-
|
5
|
-
class TestPinPressTemplate < Test::Unit::TestCase
|
6
|
-
def test_initialization
|
7
|
-
parameters = {
|
8
|
-
closer: '</ul>',
|
9
|
-
item: '<li></li>',
|
10
|
-
name: 'default',
|
11
|
-
opener: '</ul>',
|
12
|
-
}
|
13
|
-
|
14
|
-
t = PinPress::Template.new(parameters)
|
15
|
-
assert_equal(t.closer, parameters[:closer])
|
16
|
-
assert_equal(t.item, parameters[:item])
|
17
|
-
assert_equal(t.name, parameters[:name])
|
18
|
-
assert_equal(t.opener, parameters[:opener])
|
19
|
-
end
|
20
|
-
end
|
data/test/tag_template_test.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), '..', 'lib/pinpress/templates/template')
|
4
|
-
require File.join(File.dirname(__FILE__), '..', 'lib/pinpress/templates/tag_template')
|
5
|
-
|
6
|
-
class TestTagTemplate < Test::Unit::TestCase
|
7
|
-
def test_initialization
|
8
|
-
parameters = {
|
9
|
-
closer: '</ul>',
|
10
|
-
item: '<li></li>',
|
11
|
-
name: 'default',
|
12
|
-
opener: '</ul>',
|
13
|
-
}
|
14
|
-
|
15
|
-
t = PinPress::TagTemplate.new(parameters)
|
16
|
-
assert_equal(t.closer, parameters[:closer])
|
17
|
-
assert_equal(t.item, parameters[:item])
|
18
|
-
assert_equal(t.name, parameters[:name])
|
19
|
-
assert_equal(t.opener, parameters[:opener])
|
20
|
-
end
|
21
|
-
end
|