tumblr_draftking 0.7.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +80 -0
- data/LICENSE +67 -0
- data/README.md +293 -0
- data/Rakefile +22 -0
- data/bin/dk +7 -0
- data/lib/draftking/cli/cli_helpers.rb +61 -0
- data/lib/draftking/cli/cli_options.rb +31 -0
- data/lib/draftking/cli/commands/_template.rb +4 -0
- data/lib/draftking/cli/commands/accounts.rb +66 -0
- data/lib/draftking/cli/commands/blogs.rb +26 -0
- data/lib/draftking/cli/commands/comment.rb +34 -0
- data/lib/draftking/cli/commands/console.rb +18 -0
- data/lib/draftking/cli/commands/movedrafts.rb +33 -0
- data/lib/draftking/cli/commands/status.rb +24 -0
- data/lib/draftking/cli/commands/strip.rb +19 -0
- data/lib/draftking/cli/commands/tag.rb +21 -0
- data/lib/draftking/cli/commands/user_command.rb +45 -0
- data/lib/draftking/cli.rb +62 -0
- data/lib/draftking/client.rb +80 -0
- data/lib/draftking/config/config_setup.rb +56 -0
- data/lib/draftking/config.rb +151 -0
- data/lib/draftking/constants.rb +25 -0
- data/lib/draftking/dependency_patches.rb +2 -0
- data/lib/draftking/drafts.rb +53 -0
- data/lib/draftking/patches/thor.rb +12 -0
- data/lib/draftking/patches/tumblr_client.rb +10 -0
- data/lib/draftking/posts/post.rb +150 -0
- data/lib/draftking/posts/posts_helpers.rb +55 -0
- data/lib/draftking/posts.rb +173 -0
- data/lib/draftking/queue.rb +17 -0
- data/lib/draftking/reporter.rb +62 -0
- data/lib/draftking/tqueue/future_queue_methods.rb +97 -0
- data/lib/draftking/version.rb +3 -0
- data/lib/tasks/build.rake +33 -0
- data/lib/tasks/rubo.rake +36 -0
- data/lib/tumblr_draftking.rb +18 -0
- metadata +170 -0
@@ -0,0 +1,150 @@
|
|
1
|
+
require_relative 'posts_helpers'
|
2
|
+
include DK::Posts
|
3
|
+
|
4
|
+
module DK
|
5
|
+
# Tumblr Post
|
6
|
+
class Post
|
7
|
+
attr_accessor :id, :state, :tags, :comment, :summary, :reblog_key
|
8
|
+
attr_accessor :keep_tree, :changed, :saved, :blog_url
|
9
|
+
attr_accessor :image
|
10
|
+
attr_reader :data
|
11
|
+
|
12
|
+
# @param hash [Hash] Post Data
|
13
|
+
# @param keep_tree [Bool] Attach Reblog Tree?
|
14
|
+
def initialize(hash, keep_tree: nil)
|
15
|
+
return if hash.nil?
|
16
|
+
@data = JSON.parse(hash.to_json, object_class: OpenStruct)
|
17
|
+
@id = @data.id # hash['id']
|
18
|
+
@state = process_state(@data.state) # hash['state'])
|
19
|
+
@tags = @data.tags # hash['tags']
|
20
|
+
@comment = @data.reblog.comment # hash['reblog']['comment']
|
21
|
+
@summary = @data.summary # hash['summary']
|
22
|
+
@blog_url = tumblr_url(@data.blog_name) # hash['blog_name'])
|
23
|
+
@reblog_key = @data.reblog_key # hash['reblog_key']
|
24
|
+
@image = begin
|
25
|
+
@data.photos.first.original_size.url
|
26
|
+
rescue
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
@keep_tree = keep_tree.nil? ? false : keep_tree
|
30
|
+
@changed = false
|
31
|
+
@saved = 0
|
32
|
+
end
|
33
|
+
|
34
|
+
# String of post data
|
35
|
+
def to_s
|
36
|
+
"id = #{@id}\n" \
|
37
|
+
"state = #{@state}\n" \
|
38
|
+
"tags = #{@tags}\n" \
|
39
|
+
"comment = #{@comment}\n" \
|
40
|
+
"summary = #{@summary}\n" \
|
41
|
+
"blog_url = #{@blog_url}\n" \
|
42
|
+
"reblog_key = #{@reblog_key}\n" \
|
43
|
+
"keep_tree = #{@keep_tree}\n" \
|
44
|
+
"changed = #{@changed}\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
# Change the state of a post
|
48
|
+
# @param state [String] New State
|
49
|
+
def change_state(state)
|
50
|
+
return false unless VALID_STATE.include?(state)
|
51
|
+
return false if @state == state
|
52
|
+
@state = state
|
53
|
+
@changed = true
|
54
|
+
end
|
55
|
+
|
56
|
+
# Add a comment to a post
|
57
|
+
# @param comment [String] New Comment
|
58
|
+
def replace_comment_with(comment)
|
59
|
+
return false if comment.nil? || @comment.include?(comment)
|
60
|
+
@comment = comment
|
61
|
+
@changed = true
|
62
|
+
end
|
63
|
+
|
64
|
+
# Check if a post needs to be modified
|
65
|
+
# @param key_text [String] key_text
|
66
|
+
def has_key_text?(key_text)
|
67
|
+
return true if key_text.nil?
|
68
|
+
@comment.include?(key_text)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Delete a Post
|
72
|
+
# @param client [Tumblr::Client] Instance of Tumblr Client
|
73
|
+
# @param simulate [Bool] Simulate Action?
|
74
|
+
def delete(client:, simulate: nil)
|
75
|
+
return 1 if simulate
|
76
|
+
res = client.delete @blog_url, @id
|
77
|
+
@changed = true if res['id']
|
78
|
+
res['id'] ? 1 : 0
|
79
|
+
end
|
80
|
+
|
81
|
+
# Reblog a Post
|
82
|
+
# @param client [Tumblr::Client] Instance of Tumblr Client
|
83
|
+
# @param simulate [Bool] Simulate Action?
|
84
|
+
def reblog(client:, simulate: nil)
|
85
|
+
return 1 if simulate
|
86
|
+
client.reblog @blog_url,
|
87
|
+
id: @id,
|
88
|
+
reblog_key: @reblog_key,
|
89
|
+
comment: @comment
|
90
|
+
end
|
91
|
+
|
92
|
+
# Save a post
|
93
|
+
# @param client [Tumblr::Client] Instance of Tumblr Client
|
94
|
+
# @param simulate [Bool] Simulate Action?
|
95
|
+
def save(client:, simulate: nil)
|
96
|
+
return 0 unless @changed
|
97
|
+
return @saved = 1 if simulate
|
98
|
+
res = client.edit @blog_url,
|
99
|
+
id: @id,
|
100
|
+
reblog_key: @reblog_key,
|
101
|
+
state: @state,
|
102
|
+
attach_reblog_tree: @keep_tree,
|
103
|
+
tags: @tags.join(','),
|
104
|
+
caption: @comment
|
105
|
+
return 0 unless res && res['id']
|
106
|
+
@changed = false
|
107
|
+
@saved = 1
|
108
|
+
end
|
109
|
+
|
110
|
+
# Generate post tags from post comment
|
111
|
+
# @param keep_tags [Bool] Preserve Existing Tags?
|
112
|
+
# @param add_tags [String] New tags
|
113
|
+
# @param exclude [String] Tags to exclude
|
114
|
+
# @param credit [Bool] Give draftking a tag credit
|
115
|
+
def generate_tags(keep_tags: nil, add_tags: nil, exclude: nil, credit: false)
|
116
|
+
tags = comment_to_tags(@comment)
|
117
|
+
tags += csv_to_a(add_tags) if add_tags
|
118
|
+
tags += @tags if keep_tags
|
119
|
+
tags << DK::CREDIT_TAG if credit
|
120
|
+
tags -= csv_to_a(exclude) if exclude
|
121
|
+
@changed = true unless @tags.sort.uniq == tags.sort.uniq
|
122
|
+
@tags = tags
|
123
|
+
end
|
124
|
+
|
125
|
+
# Remove existing Post tags
|
126
|
+
def clear_tags
|
127
|
+
@changed = true unless @tags.empty?
|
128
|
+
@tags = []
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def process_state(state)
|
134
|
+
return DK::DRAFT unless state
|
135
|
+
return DK::QUEUE if state == 'queued'
|
136
|
+
state
|
137
|
+
end
|
138
|
+
|
139
|
+
def comment_to_tags(comment)
|
140
|
+
comment.gsub(HTML_TAG_PATTERN, '') # Remove HTML Tags
|
141
|
+
.gsub(%r{[\/\\|]}, ',') # Convert Separators
|
142
|
+
.gsub(' , ', ',') # Clean up tags
|
143
|
+
.split(',') # Return array
|
144
|
+
end
|
145
|
+
|
146
|
+
def csv_to_a(csv)
|
147
|
+
csv.split(',')
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module DK
|
2
|
+
# Helper Methods
|
3
|
+
module Posts
|
4
|
+
# Display progress percentage
|
5
|
+
# @param current [Int] Progress Counter
|
6
|
+
# @param total [Int] # Items to be processed
|
7
|
+
# @param message [String] Display message for process
|
8
|
+
# @param done [Bool] Processing Complete?
|
9
|
+
# @param modified [Int] # of items modified
|
10
|
+
def show_progress(current: 0, total: 0, message: '', done: false, modified: 0)
|
11
|
+
indicator, newline, progress = setup_done(modified) if done
|
12
|
+
indicator, newline, progress = setup_undone(current, total) unless done
|
13
|
+
print "#{indicator}#{message}#{progress}#{' ' * 30}\r#{newline}"
|
14
|
+
$stdout.flush unless done
|
15
|
+
end
|
16
|
+
|
17
|
+
# Values for displaying completed process
|
18
|
+
def setup_done(modified)
|
19
|
+
indicator = '√ '
|
20
|
+
newline = "\n"
|
21
|
+
progress = "(#{modified} modified)"
|
22
|
+
[indicator, newline, progress]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Values for displaying in-progress process
|
26
|
+
def setup_undone(current, total)
|
27
|
+
tildes = current.to_i % 4
|
28
|
+
indicator = "~#{'~' * tildes}#{' ' * (3 - tildes)}> "
|
29
|
+
newline = nil
|
30
|
+
percentage = total > 0 ? ((current.to_f / total.to_f) * 100).round : 0
|
31
|
+
progress = "#{current} / #{total} [#{percentage}\%] "
|
32
|
+
[indicator, newline, progress]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Construct Tumblr URL string
|
36
|
+
# @param blog_name [String] Blog Name
|
37
|
+
def tumblr_url(blog_name)
|
38
|
+
blog_name += '.tumblr.com' unless blog_name.include?('.')
|
39
|
+
blog_name
|
40
|
+
end
|
41
|
+
|
42
|
+
# Convert source symbol to string
|
43
|
+
# @param symbol [Symbol] Source Symbol
|
44
|
+
def source_string(symbol)
|
45
|
+
return 'draft' unless symbol
|
46
|
+
symbol.to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
# index < limit
|
50
|
+
def index_within_limit?(index, limit)
|
51
|
+
return true if limit.nil? || limit.zero?
|
52
|
+
index < limit
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require_relative 'posts/posts_helpers'
|
2
|
+
require_relative 'posts/post'
|
3
|
+
require 'thread'
|
4
|
+
|
5
|
+
module DK
|
6
|
+
# Post operations common to queue/draft
|
7
|
+
module Posts
|
8
|
+
# Common code for Post operations
|
9
|
+
# @param options[:limit] [Int] Maximum number of posts to process
|
10
|
+
# @param options[:message] [String] Message to display during processing
|
11
|
+
# @param options[:shuffle] [Bool] Randomize order of posts
|
12
|
+
# @param options[:blog_name] [String] Name of blog to target
|
13
|
+
# @param options[:mute] [String] Suppress progress indicator
|
14
|
+
# @param options[:test_data] [[Hash]] Array of post hash data
|
15
|
+
# @param options[:simulate] [bool] Simulation?
|
16
|
+
# @return [int] Number of modified posts
|
17
|
+
def post_operation(options, &block)
|
18
|
+
work, total, results, reporter = setup_operation(options)
|
19
|
+
workers = (0...DK::MAX_THREADS).map { Thread.new { generate_worker(work, results, total, block) } }
|
20
|
+
workers.map(&:join)
|
21
|
+
mod_count, mod_posts = calculate_result(results)
|
22
|
+
show_progress(message: message, done: true, modified: mod_count) unless @mute
|
23
|
+
reporter.new(objects: mod_posts, title: REPORT_TITLE, fields: REPORT_FIELDS, simulate: @simulate).show unless @mute
|
24
|
+
act_on_blog(name: @blog_name) # Refresh account info
|
25
|
+
[mod_count, mod_posts]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Work queue processor
|
29
|
+
def generate_worker(*data, block)
|
30
|
+
work, results, total = data
|
31
|
+
begin
|
32
|
+
while post = work.pop(true)
|
33
|
+
po = Post.new(post, keep_tree: @keep_tree)
|
34
|
+
block.call(po, results.size) # Do work on Post
|
35
|
+
po.save(client: @client, simulate: @simulate)
|
36
|
+
results.push(po)
|
37
|
+
show_progress(current: results.size, total: total, message: message) unless @mute
|
38
|
+
end
|
39
|
+
rescue ThreadError # Queue empty
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Common initialization for post operations
|
44
|
+
def setup_operation(options)
|
45
|
+
process_options(options)
|
46
|
+
act_on_blog(name: @blog_name)
|
47
|
+
posts = @shuffle ? get_posts.shuffle : get_posts
|
48
|
+
work = posts_to_queue(posts)
|
49
|
+
reporter = options[:reporter] || DK::Reporter
|
50
|
+
[work, work.size, Queue.new, reporter]
|
51
|
+
end
|
52
|
+
|
53
|
+
# Create queue of Posts for worker threads
|
54
|
+
def posts_to_queue(posts)
|
55
|
+
work_q = Queue.new
|
56
|
+
posts.each { |p| work_q.push(p) }
|
57
|
+
work_q
|
58
|
+
end
|
59
|
+
|
60
|
+
# Determine number of modified posts
|
61
|
+
def calculate_result(result_q)
|
62
|
+
mod_count = 0
|
63
|
+
mod_posts = []
|
64
|
+
return [mod_count, mod_posts] if result_q.empty?
|
65
|
+
while post = result_q.pop
|
66
|
+
mod_count += post.saved
|
67
|
+
mod_posts << post if post.saved > 0
|
68
|
+
break if result_q.empty?
|
69
|
+
end
|
70
|
+
[mod_count, mod_posts]
|
71
|
+
end
|
72
|
+
|
73
|
+
# Add a comment to Posts
|
74
|
+
# @param options[:credit] [Bool] Give dk credit?
|
75
|
+
# @param options[:comment] [string] String to add as comment
|
76
|
+
# @param options[:limit] [Int] Max number of modified posts
|
77
|
+
# @param options[:message] [String] Message to display during processing
|
78
|
+
# @param options[:source] [Symbol] Target posts from :draft or :queue
|
79
|
+
# @param options[:simulate] [bool] Simulation?
|
80
|
+
# @param options[:mute] [String] Suppress progress indicator
|
81
|
+
# @return [int] Number of modified posts
|
82
|
+
def comment_posts(options = {})
|
83
|
+
src = source_string(options[:source])
|
84
|
+
options[:message] = "Adding #{src} comment \'#{comment}\': "
|
85
|
+
mod_count, _mod_posts = post_operation(options) do |post, _|
|
86
|
+
post.replace_comment_with(@comment)
|
87
|
+
post.generate_tags(keep_tags: @keep_tags,
|
88
|
+
add_tags: @tags,
|
89
|
+
exclude: @comment,
|
90
|
+
credit: @credit) if @auto_tag
|
91
|
+
end
|
92
|
+
mod_count
|
93
|
+
end
|
94
|
+
|
95
|
+
# @param options[:credit] [Bool] Give dk credit?
|
96
|
+
# @param options[:source] [Symbol] Target posts from :draft or :queue
|
97
|
+
# @param options[:mute] [String] Suppress progress indicator
|
98
|
+
# @param options[:blog_name] [String] Name of blog to target
|
99
|
+
# @param options[:keep_tags] [bool] Preserve existing post tags
|
100
|
+
# @param options[:keep_tree] [bool] Preserve existing post comments
|
101
|
+
# @param options[:simulate] [bool] Simulation?
|
102
|
+
# @param options[:comment] [String] Exclude :comment from tags
|
103
|
+
# @return [int] Number of modified posts
|
104
|
+
def tag_posts(options)
|
105
|
+
src = source_string(options[:source])
|
106
|
+
options[:message] = "Tagging #{src} with #{options[:add_tags]}: "
|
107
|
+
mod_count, _mod_posts = post_operation(options) do |post, _|
|
108
|
+
post.generate_tags(keep_tags: @keep_tags,
|
109
|
+
add_tags: @tags,
|
110
|
+
exclude: @comment,
|
111
|
+
credit: @credit) if @auto_tag
|
112
|
+
end
|
113
|
+
mod_count
|
114
|
+
end
|
115
|
+
|
116
|
+
# Determine draft data to use.
|
117
|
+
# @param options[:test_data] [[Hash]] Array of post hash data
|
118
|
+
# @param options[:limit] [Int] Limit # of posts selected
|
119
|
+
# @param options[:blog_url] [string] URL of blog to read from
|
120
|
+
# @param options[:source] [Symbol] Get posts from :draft or :queue
|
121
|
+
# @param options[:before_id] [Int] [:draft] ID of post to begin reading from
|
122
|
+
# @param options[:offset] [Int] [:queue] Post index to start reading from
|
123
|
+
# @return [[Post]] Array of Post Hash data
|
124
|
+
def get_posts
|
125
|
+
return some_test_data if @test_data
|
126
|
+
return all_posts.uniq unless @limit
|
127
|
+
return some_posts(offset: @offset, before_id: @before_id) if @limit <= 50
|
128
|
+
limited_posts
|
129
|
+
end
|
130
|
+
|
131
|
+
# Get up to 50 Posts
|
132
|
+
# @param before_id [Int] [:draft] ID of post to begin reading from
|
133
|
+
# @param offset [Int] [:queue] Post index to start reading from
|
134
|
+
# @return [[Post]] Array of Post Hash data
|
135
|
+
def some_posts(before_id: 0, offset: 0)
|
136
|
+
options = { limit: [(@limit || 50), 50].min }
|
137
|
+
options[@source == :draft ? :before_id : :offset] = (@source == :draft ? before_id : offset)
|
138
|
+
|
139
|
+
result = @client.send(@source, @blog_url, options).first[1]
|
140
|
+
result.is_a?(Integer) ? [] : result
|
141
|
+
end
|
142
|
+
|
143
|
+
# Get @limit # of Posts
|
144
|
+
def limited_posts
|
145
|
+
result = []
|
146
|
+
until result.size >= @limit
|
147
|
+
chunk = some_posts(offset: @offset, before_id: @before_id)
|
148
|
+
break if chunk.empty?
|
149
|
+
result += chunk
|
150
|
+
@offset = chunk.size
|
151
|
+
@before_id = chunk.last['id']
|
152
|
+
end
|
153
|
+
result.take(@limit)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Collect all Posts
|
157
|
+
# @param last_id [Int] ID of post to begin reading from (for reading Drafts)
|
158
|
+
# @param offset [Int] Post index to start reading from (for reading Queue)
|
159
|
+
# @param blog_url [string] URL of blog to read from
|
160
|
+
# @param source [Symbol] Get posts from :draft or :queue
|
161
|
+
# @return [[Post]] Array of Post Hash data
|
162
|
+
def all_posts(last_id: 0, offset: 0)
|
163
|
+
chunk = some_posts(before_id: last_id, offset: offset)
|
164
|
+
return chunk if chunk.empty?
|
165
|
+
chunk + all_posts(last_id: chunk.last['id'], offset: offset + chunk.size)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Handle limits for test data
|
169
|
+
def some_test_data
|
170
|
+
@limit ? @test_data.take(@limit) : @test_data
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DK
|
2
|
+
#----------------------------- Queue Methods ----------------------------- #
|
3
|
+
module TQueue
|
4
|
+
# Move from Queue to Drafts
|
5
|
+
# @param options[:key_text] [String] Move posts not containing :key_text
|
6
|
+
# @return [Int] Number of modified posts
|
7
|
+
def move_to_drafts(options)
|
8
|
+
options[:message] = 'Moving Queue ~> Drafts: '
|
9
|
+
options[:shuffle] = false
|
10
|
+
options[:state] = DK::DRAFT
|
11
|
+
mod_count, _mod_posts = post_operation(options) do |post, _|
|
12
|
+
post.changed = !post.has_key_text?(@key_text)
|
13
|
+
end
|
14
|
+
mod_count
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'terminal-table'
|
2
|
+
|
3
|
+
module DK
|
4
|
+
# Generate report of object data
|
5
|
+
class Reporter
|
6
|
+
attr_accessor :headers, :rows, :fields, :title, :objects, :last
|
7
|
+
def initialize(opts)
|
8
|
+
@objects = opts[:objects]
|
9
|
+
@title = build_title(opts)
|
10
|
+
@rows = opts[:rows]
|
11
|
+
@fields = @rows ? nil : populate_fields(opts[:fields], @objects.first)
|
12
|
+
@headers = populate_headers(opts[:headers])
|
13
|
+
end
|
14
|
+
|
15
|
+
# Report Title
|
16
|
+
# @param opts[:simulate] [Boolean] Show simulation indicator
|
17
|
+
# @param opts[:title] [String] Report Title
|
18
|
+
def build_title(opts)
|
19
|
+
"#{opts[:title]}#{REPORT_SIM if opts[:simulate]}"
|
20
|
+
end
|
21
|
+
|
22
|
+
# Determine Field List
|
23
|
+
# @param fields [[Symbol]] Field Symbol Array
|
24
|
+
# @param obj [Object] Example Object
|
25
|
+
# @return [[Symbol]] Field List
|
26
|
+
def populate_fields(fields, obj = nil)
|
27
|
+
# Report all fields, unless specified.
|
28
|
+
return fields if fields
|
29
|
+
obj.instance_variables.map do |x|
|
30
|
+
x = x.to_s.delete('@')
|
31
|
+
obj.respond_to?(x) ? x : nil
|
32
|
+
end.compact if obj
|
33
|
+
end
|
34
|
+
|
35
|
+
# Determine Display Headers
|
36
|
+
# @param headers [[String]] Column Headers
|
37
|
+
# @return [[String]]
|
38
|
+
def populate_headers(headers)
|
39
|
+
# Use field names as headers, unless specified
|
40
|
+
return headers if headers
|
41
|
+
return @fields.map(&:to_s) if @fields
|
42
|
+
end
|
43
|
+
|
44
|
+
# Collect report data
|
45
|
+
def populate_report_rows
|
46
|
+
# Read data based on field list
|
47
|
+
return if @rows
|
48
|
+
@rows = []
|
49
|
+
@objects.each do |object|
|
50
|
+
@rows << @fields.map { |field| object.send(field.to_sym) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Display Report
|
55
|
+
def show
|
56
|
+
populate_report_rows
|
57
|
+
opts = { rows: @rows, headings: @headers || [], title: @title }
|
58
|
+
puts Terminal::Table.new(opts) unless @rows.empty?
|
59
|
+
end
|
60
|
+
alias to_s show
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
|
2
|
+
# # Get a list of Queued posts
|
3
|
+
# # @param offset [Integer] return queued posts starting with offset index
|
4
|
+
# # @return [[Post]] Array of Post JSON objects
|
5
|
+
# def some_queue(offset = 0, limit = 1)
|
6
|
+
# queue = @client.queue @blog_url, offset: offset, limit: limit
|
7
|
+
# queue.first[1]
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# # Collect entire Queue
|
11
|
+
# # @note reads in chunks of 20 posts, so runtime can be slow.
|
12
|
+
# # @return [[Post]] Array of Post JSON objects
|
13
|
+
# def all_queue
|
14
|
+
# queue = []
|
15
|
+
# offset = 0
|
16
|
+
# loop do
|
17
|
+
# q_t = @client.queue(@blog_url, offset: offset, limit: 50).first[1]
|
18
|
+
# break if q_t.empty?
|
19
|
+
# offset += q_t.size
|
20
|
+
# queue += q_t
|
21
|
+
# end
|
22
|
+
# queue
|
23
|
+
# end
|
24
|
+
|
25
|
+
# # Add a comment to Queue
|
26
|
+
# # @param caption [string] String to add as caption
|
27
|
+
# # @param options[:all] [bool] Process entire Queue
|
28
|
+
# # @param options[:skip] [String] Do not modify Queued posts that contain string
|
29
|
+
# # @return [Integer] Number of posts modified
|
30
|
+
# def comment_queue(caption, options)
|
31
|
+
# queue = options[:all] ? all_queue : some_queue(0, 50)
|
32
|
+
# skip = options[:skip]
|
33
|
+
# modified = 0
|
34
|
+
# if skip.nil?
|
35
|
+
# queue.each do |d|
|
36
|
+
# @client.edit @blog_url, id: d['id'], reblog_key: d['reblog_key'], caption: caption, state: 'queue'
|
37
|
+
# modified += 1
|
38
|
+
# end
|
39
|
+
# else
|
40
|
+
# queue.each do |d|
|
41
|
+
# next if d['summary'].include?(skip)
|
42
|
+
# @client.edit @blog_url, id: d['id'], reblog_key: d['reblog_key'], caption: caption, state: 'queue'
|
43
|
+
# modified += 1
|
44
|
+
# end
|
45
|
+
# end
|
46
|
+
# modified
|
47
|
+
# end
|
48
|
+
|
49
|
+
# # Tag Queued posts from comment
|
50
|
+
# # @return [Integer] Number of posts modified
|
51
|
+
# def tag_queue
|
52
|
+
# puts 'Tagging Queue'
|
53
|
+
# queue = all_queue
|
54
|
+
# mod = 0
|
55
|
+
# queue.each do |d|
|
56
|
+
# caption = d['summary']
|
57
|
+
# next unless caption.include?('/')
|
58
|
+
# tags = caption.gsub(%r{[\/\\|]}, ',').gsub(' , ', ',') # Tag with caption
|
59
|
+
# puts "#{caption} => #{tags}"
|
60
|
+
# @client.edit @blog_url, id: d['id'], reblog_key: d['reblog_key'], caption: caption, tags: tags, state: 'draft'
|
61
|
+
# @client.edit @blog_url, id: d['id'], reblog_key: d['reblog_key'], caption: caption, tags: tags, state: 'queue'
|
62
|
+
# mod += 1
|
63
|
+
# end
|
64
|
+
# puts 'Done'
|
65
|
+
# puts "Tags added to #{mod} queue posts"
|
66
|
+
# mod
|
67
|
+
# end
|
68
|
+
|
69
|
+
# def auto_post(hours = 24, post_count = 50)
|
70
|
+
# puts "Auto-posting #{post_count} posts over #{hours} hours:"
|
71
|
+
# seconds = hours * 60 * 60
|
72
|
+
# sleep_time = seconds / post_count
|
73
|
+
# delay_in_mins = sleep_time / 60
|
74
|
+
# offset = 0
|
75
|
+
# limit = 1
|
76
|
+
# posts_left = post_count
|
77
|
+
# post_count.times do
|
78
|
+
# if posts_available && posts_left > 0
|
79
|
+
# publish_post(some_queue(offset, limit).first)
|
80
|
+
# posts_left -= 1
|
81
|
+
# if posts_available && posts_left > 0
|
82
|
+
# puts "Next post at #{Time.now + (delay_in_mins * 60)} mins"
|
83
|
+
# sleep sleep_time
|
84
|
+
# end
|
85
|
+
# else
|
86
|
+
# puts 'Processing complete!'
|
87
|
+
# break
|
88
|
+
# end
|
89
|
+
# end
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
# def publish_post(d)
|
93
|
+
# prInteger "Posting: #{d['summary']} .."
|
94
|
+
# @client.edit @blog_url, id: d['id'], reblog_key: d['reblog_key'], caption: d['summary'], tags: d['tags'], state: 'published'
|
95
|
+
# @q_size -= 1
|
96
|
+
# puts '.Done'
|
97
|
+
# end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative '../../codeclimate.rb'
|
2
|
+
include BuildVars
|
3
|
+
|
4
|
+
namespace :build do
|
5
|
+
desc 'Build gem.'
|
6
|
+
task :gem do
|
7
|
+
Rake::Task['build:readme'].execute
|
8
|
+
`gem build tumblr_draftking.gemspec`
|
9
|
+
end
|
10
|
+
|
11
|
+
desc 'Build and install gem.'
|
12
|
+
task :install do
|
13
|
+
Rake::Task['build:gem'].execute
|
14
|
+
file = `ls -1r *.gem | head -n 1`
|
15
|
+
puts `gem install #{file}`
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Inject table of contents into README.md'
|
19
|
+
task :readme do
|
20
|
+
`ruby readme/generate.rb`
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'Prepare gem deployment.'
|
24
|
+
task :deployment do
|
25
|
+
ENV['CODECLIMATE_REPO_TOKEN'] = CODECLIMATE_REPO_TOKEN
|
26
|
+
ENV['CI_FLAG'] = 'true'
|
27
|
+
Rake::Task['rubo:fix'].execute
|
28
|
+
puts Rake::Task['test'].execute
|
29
|
+
puts Rake::Task['build:gem'].execute
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
task build: ['build:install']
|
data/lib/tasks/rubo.rake
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
namespace :rubo do
|
2
|
+
desc 'Generate and display Rubocop HTML report.'
|
3
|
+
task :html do
|
4
|
+
`rubocop -f html -D --out rubocop/report.html`
|
5
|
+
end
|
6
|
+
|
7
|
+
desc 'Autofix Issues.'
|
8
|
+
task :fix do
|
9
|
+
`rubocop -a`
|
10
|
+
Rake::Task['rubo:html'].execute
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'AutoFix issues and display report.'
|
14
|
+
task :fix_report do
|
15
|
+
Rake::Task['rubo:fix'].execute
|
16
|
+
Rake::Task['rubo:gen_report'].execute
|
17
|
+
end
|
18
|
+
|
19
|
+
desc 'Regenerate To Do .yml'
|
20
|
+
task :autogen do
|
21
|
+
`rubocop --auto-gen-config`
|
22
|
+
end
|
23
|
+
|
24
|
+
desc 'Show rubocop HTML report'
|
25
|
+
task :gen_report do
|
26
|
+
`open rubocop/report.html`
|
27
|
+
end
|
28
|
+
|
29
|
+
desc 'Show rubocop HTML report'
|
30
|
+
task :report do
|
31
|
+
Rake::Task['rubo:html'].execute
|
32
|
+
Rake::Task['rubo:gen_report'].execute
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
task rubo: ['rubo:fix_report']
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'yaml'
|
3
|
+
require 'tumblr_client'
|
4
|
+
require 'thor'
|
5
|
+
|
6
|
+
# Workarounds for issues with depended upon projects
|
7
|
+
require_relative 'draftking/dependency_patches'
|
8
|
+
|
9
|
+
# dk
|
10
|
+
require_relative 'draftking/constants'
|
11
|
+
require_relative 'draftking/version'
|
12
|
+
require_relative 'draftking/cli'
|
13
|
+
require_relative 'draftking/config'
|
14
|
+
require_relative 'draftking/posts'
|
15
|
+
require_relative 'draftking/drafts'
|
16
|
+
require_relative 'draftking/queue'
|
17
|
+
require_relative 'draftking/client'
|
18
|
+
require_relative 'draftking/reporter'
|