tumblr_autofixer 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2dc965b3871e2579c7bce04740856c529f770e9e
4
- data.tar.gz: 2e8db8131862e98242a4992cb7039a22de0b831f
3
+ metadata.gz: 78babced78ceb2710811757881225b103d94eeed
4
+ data.tar.gz: fb77a09e95ac5aeb4c85ee33c3a98e5437f5d1d6
5
5
  SHA512:
6
- metadata.gz: a7994886283bf16acffcc4ee019210061f4c7601e53fea87775da79840ada2ebce745bc25c2e6f858dbfdc34405452e1010fd6a0b20cbf4e98d252b4d7b211bc
7
- data.tar.gz: '0096975af9698b872ee57572590b879bf6d9198588c16a94a5e32130ed65004d4c69a26c29018efb050beca2def4dfa845adb9eca432f431ccae970ebc0890fd'
6
+ metadata.gz: a6c2f0b5c7941307976ab267904738b044a845b5acd9e33682ad7fd52b863f94359823f9f711f317ee30b59128fe717d05efbd6ffe0dad9ff33f0d89d173fff7
7
+ data.tar.gz: 0334ba951d9c8a4bf7cdcfa60ad626019d38368a1ae398df94354771141246117a0a28990b207b9cc305a27e8802cf5d71ac6af7f42f2fb586a3b919889cde1c
data/README.md CHANGED
@@ -1,30 +1,77 @@
1
1
  # About
2
2
  \- tumblr_autofix is a configurable comment generator for Tumblr.
3
- \- Two configuration files are created in your home directory: taf_data.yml & taf_summary.yml
3
+ \- Generated files are stored in ~/config_md/taf/
4
4
  \- Careful when editing configuration files, as with all YAML files, indentation is crucial!
5
5
 
6
+ # Version 0.1.0
7
+ - New: [Tag Matcher](#using-the-tag-matcher)! Use a whitelist of tags to improve Autofixer's ability to
8
+ - Ability to include DK::Autofixer in your programs
9
+ - Started building out the test suite
10
+ - Extensive refactoring
11
+ - Please report any [issues](https://github.com/meissadia/tumblr_autofix/issues)
12
+
13
+ # Using the Tag Matcher
14
+ In order to utilize the Tag Matcher we'll need to generate a list of acceptable tags. To do this, we'll collect the tags of your last 1,000 posts as a starting point.
15
+
16
+ ## Basic
17
+ `taf g:tags`
18
+
19
+ This will generate a file in your home directory '~/config_md/taf/tags.yml'
20
+ You can edit this file and delete any lines which contain tags you do not want used to automatically generate post comments.
21
+
22
+ ## Advanced
23
+ You can specify a few options for the g:tags command
24
+
25
+ | Option | Description |
26
+ | :--- | :--- |
27
+ | `-l [LIMIT]` | Maximum number of posts to scan. |
28
+ | `-b [BLOG]` | Blog name to scan. Only required if scanning a secondary blog. |
29
+ | `--source [SOURCE]` | draft, queue, or publish.|
30
+ | `--config [CONFIG]` | Autofixer uses DraftKing to connect to tumblr, specify your saved config here. |
31
+
32
+
33
+ Example:
34
+ `taf -l 200 -b secondary-blog-name --source queue`
35
+
6
36
  # Using ~/config_md/taf/data.yml
7
- no_names [Array] - Blogs listed here will be ignored during processing
8
- summary [Array] - Will apply capitalization, add prefix and postfix strings
9
- last_tag [Array] - Use the last available tag as your comment
10
- tag_idx [[Array]] - Indicated which tag to use as the new comment
11
- - Blogs listed in the first tag_idx[0] will use the first tag
12
- - Blogs listed in tag_idx[1] will use the second
37
+ data.yml allows you to configure, on a blog-by-blog basis, the source of the data used to generate new comments. You may use a specific tag index, the last tag, or simply reuse the existing summary.
38
+
39
+ | Field | Type | Description |
40
+ | :--- | :---: | :--- |
41
+ | `ignore` | Array | Blogs listed here will only be processed with the Tag Matcher
42
+ | `last_tag` | Array | Use the last available tag as your comment
43
+ | `summary` | Array | Use full text of existing post.summary
44
+ | `tag_idx` | [Array] | Indicates which tag index to use as the new comment
45
+ | | | - Blogs listed in tag_idx[0] will use the first tag
46
+ | | | - Blogs listed in tag_idx[1] will use the second
13
47
 
14
48
 
15
49
  # Using ~/config_md/taf/summary.yml
16
- ## Available variables
17
- \- `summary` - the plain text of the current post's caption
18
- \- `res` - lower case version of summary, useful for simplified text searching
19
- \- `from` - the blog name of the user you reblogged the post from
20
- \- `lines` - original summary text, split into lines
50
+ The summary.yml configuration allows you to code the processing steps needed
51
+ to extract the information you want from a post's comment. This can be set up on
52
+ a blog-by-blog basis.
53
+
54
+ ## Available variables
55
+ | Variable | Description |
56
+ | :--- | :--- |
57
+ | `summary` | the plain text of the current post's caption
58
+ | `res` | lower case version of summary, useful for simplified text searching
59
+ | `from` | the blog name of the user you reblogged the post from
60
+ | `lines` | original summary text, split into lines
61
+
62
+ ## Available methods
63
+ | Method | Description |
64
+ | :--- | :---: |
65
+ | `normalize(string)` | Applies capitalization, adds configured prefix/postfix strings
21
66
 
22
67
  ## Returning
23
- \- using `return <value>` in your summary.yml will make that string your new comment
24
- \- storing your new comment in the `res` variable, without explicitly returning it, will subject it to a couple more modifications:
25
- 1. capitalization - each word in the string will be capitalized
26
- 2. prefix - a string passed via the `-p <PREFIX>` option will be prepended to `res`
27
- 3. postfix - a string passed via the `-P <POSTFIX>` option will be appended to `res`
68
+ | Method | Description |
69
+ | :--- | :--- |
70
+ | `return <value> `| Use the <value> string as the comment for this post
71
+ | `res = 'your value'` | storing your new comment in the `res` variable, without explicitly returning it, will subject it to a couple more modifications:
72
+ | | 1. capitalization - each word in the string will be capitalized
73
+ | | 2. prefix - a string passed via the `-p <PREFIX>` option will be prepended to `res`
74
+ | | 3. postfix - a string passed via the `-P <POSTFIX>` option will be appended to `res`
28
75
 
29
76
  ## Summary Example
30
77
 
data/bin/taf CHANGED
@@ -1,7 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
3
  require 'tumblr_draftking'
4
- require_relative '../lib/tumblr_autofixer'
5
- # require File.join(Dir.home, '/coding/ruby/tumblr_autofixer/lib/tumblr_autofixer') # DEV ONLY - Run development source using system installed cli
4
+ if ENV['DEV_ENV']
5
+ # DEV ONLY - Run development source using system installed cli
6
+ require File.join(Dir.home, "#{ENV['DIR_RUBY']}/tumblr_autofixer/lib/tumblr_autofixer")
7
+ else
8
+ require_relative '../lib/tumblr_autofixer'
9
+ end
6
10
 
7
- DK::Idable.new(ARGV)
11
+ DK::Autofixer.new(ARGV).run
@@ -0,0 +1,294 @@
1
+ module DK
2
+ class Autofixer
3
+ ERROR = '**'
4
+ POSTS = '/Users/meis/coding/rails/autofixer/db/test.posts'
5
+ CONFIGDIR = '/config_md/taf/'
6
+ INFO = 'info'
7
+ WARN = 'warning'
8
+ ERRO = 'error'
9
+
10
+ attr_accessor :dk # DraftKing for Tumblr
11
+ attr_accessor :simulate, :limit # DraftKing Settings
12
+ attr_accessor :config_dir # Autofixer Required Structure
13
+ attr_accessor :last_tag, :summary, :tag_idx # Autofixer Tagging Config
14
+ attr_accessor :spliter, :prefix, :postfix # Autofixer Tagging Options
15
+ attr_accessor :clear, :use_test, :reprocess # Autofixer Processing Options
16
+ attr_accessor :show_results, :hide_pics # Autofixer Result Options
17
+ attr_accessor :processed, :review, :updated # Autofixer Results
18
+
19
+ def initialize(opts = {})
20
+ set_instance_vars(opts)
21
+ installed_test_configuration?
22
+ read_configuration
23
+ end
24
+
25
+ # Automated Processing
26
+ def run
27
+ perform_command? # Commands will exit(#)
28
+ process(get_filtered_posts)
29
+ @review = apply_tag_matcher_to(@review)
30
+ @review = clear(@review)
31
+ show_results
32
+ end
33
+
34
+ # Execute Command
35
+ def perform_command?
36
+ show_help
37
+ show_config
38
+ show_version
39
+ open_results
40
+ generate_tags_yml
41
+ if @options.first && !@options.first[0].eql?('-')
42
+ puts "\nCommand '#{@options.first}' not found.\n\n"
43
+ exit(1)
44
+ end
45
+ end
46
+
47
+ # Load data and filter out processed or seemingly unprocessible posts
48
+ def get_filtered_posts
49
+ drafts = @usetestdata ? load_test_data : @dk.get_posts
50
+ @total = drafts.size
51
+ drafts.map do |draft|
52
+ draft = DK::Post.new draft
53
+ next if filter_processed? draft
54
+ next if filter_by_info? draft
55
+ next if filter_by_trail? draft
56
+ draft
57
+ end.compact
58
+ end
59
+
60
+ # Construct new post comments based on available configurations
61
+ def process(posts)
62
+ posts.each_with_index do |post, idx|
63
+ tags = post.tags
64
+ blog = post.trail.first.blog.name
65
+ summary = post.summary
66
+
67
+ next if ignore? blog, post
68
+ # Scan for configured tag-index
69
+ comment = use_tag_index blog, post
70
+ # Use coded configuration
71
+ comment ||= use_commands blog, summary
72
+ # Use full summary text
73
+ comment ||= use_summary blog, summary
74
+ # Use last tag
75
+ comment ||= use_tag_index blog, post, @last_tag.include?(blog)
76
+ # No automated processing
77
+ comment ||= ERROR
78
+
79
+ success = update_post_comment(post, comment)
80
+ (success ? @updated : @review) << post
81
+ end
82
+ end
83
+
84
+ # Contruct a comment using any whitelisted tags
85
+ # return: [String] Normalized Comment
86
+ def tag_matcher(tags)
87
+ return ERROR if tags.empty?
88
+ joiner = ' | '
89
+ matches = tags.select{ |tag| @gtags.include? tag.downcase }
90
+ return ERROR if matches.empty?
91
+ new_comment = matches.join(joiner)
92
+ normalize(new_comment)
93
+ end
94
+
95
+ # Mass processing based on whitelisted tags
96
+ # return: [Array] Unmatched Posts
97
+ def apply_tag_matcher_to(posts)
98
+ return posts unless @gtags
99
+ return posts if @gtags.empty?
100
+ not_matched = []
101
+ while (post = posts.shift)
102
+ next if post.tags.empty?
103
+ new_comment = tag_matcher(post.tags)
104
+ if new_comment.eql?(ERROR)
105
+ not_matched << post
106
+ next
107
+ end
108
+ success = update_post_comment(post, new_comment)
109
+ (success ? @updated : not_matched) << post
110
+ end
111
+ not_matched
112
+ end
113
+
114
+ private
115
+
116
+ # **************************************************************************
117
+ # Processing Methods
118
+ # **************************************************************************
119
+ # Use the user coded processing for this blog
120
+ def use_commands(blog, summary)
121
+ commands = restore(@sstore, blog.to_sym)
122
+ special_summary(summary, blog, commands)
123
+ end
124
+
125
+ # Normalize and use the full summary text
126
+ def use_summary(blog, summary)
127
+ return nil unless @summary.include?(blog)
128
+ special_summary(summary, blog, [])
129
+ end
130
+
131
+ # Use the tag at the configured index, if available
132
+ # return: [boolean] Success?
133
+ def use_tag_index(blog_name, post, last=nil)
134
+ return normalize post.tags.last if last
135
+ @tag_idx.each_with_index do |names, idx|
136
+ next unless names.include?(blog_name)
137
+ return normalize(post.tags[idx])
138
+ end
139
+ nil
140
+ end
141
+
142
+ def update_post_comment(post, comment)
143
+ return false if comment.eql? ERROR
144
+ post.replace_comment_with(comment)
145
+ post.save(client: @dk.client, simulate: @dk.simulate)
146
+ end
147
+
148
+ def special_summary(summary, from, commands)
149
+ return nil if summary.nil? || from.nil?
150
+ return nil unless commands
151
+ lines = summary.split("\n")
152
+ res = summary.downcase
153
+ b = binding
154
+ commands.each{ |x| eval(x, b) }
155
+ normalize(res)
156
+ endormalize(res)
157
+ end
158
+
159
+ def clear(posts)
160
+ return posts unless @clear
161
+ error = []
162
+ posts.each do |post|
163
+ success = update_post_comment(post, @prefix)
164
+ (success ? @updated : error) << post
165
+ end
166
+ error
167
+ end
168
+
169
+ def affix(s)
170
+ result = ''
171
+ result += "#{@prefix}" if @prefix
172
+ result += "#{' ' + @spliter + ' '}"
173
+ result += "#{s}"
174
+ if @postfix
175
+ result += "#{' ' + @spliter + ' '}"
176
+ result += "#{@postfix}"
177
+ end
178
+ result
179
+ end
180
+
181
+ def log(type, msg)
182
+ @messages << "#{type.capitalize}: #{msg}"
183
+ end
184
+
185
+ # **************************************************************************
186
+ # Filtration Methods
187
+ # **************************************************************************
188
+ def filter_processed?(draft)
189
+ if draft.processed?(skip: @reprocess, prefix: @prefix)
190
+ @processed << draft
191
+ return true
192
+ end
193
+ false
194
+ end
195
+
196
+ def filter_by_info?(draft)
197
+ unless draft.has_info?
198
+ @review << draft
199
+ return true
200
+ end
201
+ false
202
+ end
203
+
204
+ def filter_by_trail?(draft)
205
+ unless draft.has_trail?
206
+ @review << draft
207
+ return true
208
+ end
209
+ false
210
+ end
211
+
212
+ def ignore?(blog, post)
213
+ return false unless @ignore.include? blog
214
+ @review << post
215
+ true
216
+ end
217
+
218
+ # **************************************************************************
219
+ # Configuration Methods
220
+ # **************************************************************************
221
+ def dk_opts
222
+ { simulate: @simulate, limit: @limit }
223
+ end
224
+
225
+ def home_file(file)
226
+ DK::Config.home_path_file(file)
227
+ end
228
+
229
+ def confile(fname)
230
+ @config_dir + fname
231
+ end
232
+
233
+ def set_instance_vars(opts)
234
+ @options = opts
235
+ @simulate = @options.include?('-s')
236
+ @limit = @options[@options.find_index('-l') + 1].to_i rescue nil
237
+ @spliter = @options[@options.find_index('-S') + 1] rescue ' '
238
+ @prefix = @options[@options.find_index('-p') + 1] rescue nil
239
+ @postfix = @options[@options.find_index('-P') + 1] rescue nil
240
+ @clear = @options.find_index('--clear')
241
+ @reprocess = @options.find_index('--reprocess')
242
+ @hide_pics = @options.find_index('--no-pics')
243
+ @usetestdata = @options.find_index('--test')
244
+ @show_results = @options.find_index('--show')
245
+ @config_dir = home_file(CONFIGDIR)
246
+ @dk = DK::Client.new(dk_opts)
247
+ @messages = []
248
+ @processed = []
249
+ @updated = []
250
+ @review = []
251
+ end
252
+
253
+ def read_configuration
254
+ # Ensure directory structure exists
255
+ FileUtils::makedirs @config_dir unless Dir.exist?(@config_dir)
256
+
257
+ # Ensure configuration files are present
258
+ @ystore = YAML::Store.new("#{confile('data.yml')}")
259
+ @sstore = YAML::Store.new("#{confile('summary.yml')}")
260
+ @tstore = YAML::Store.new("#{confile('tags.yml')}")
261
+ prep_user_data_files
262
+
263
+ # Cache config data
264
+ @last_tag = restore(@ystore, :last_tag)
265
+ @tag_idx = restore(@ystore, :tag_idx)
266
+ @summary = restore(@ystore, :summary)
267
+ @ignore = restore(@ystore, :ignore)
268
+ @gtags = restore(@tstore, :good)
269
+ end
270
+
271
+ def load_test_data
272
+ return eval(File.open(POSTS, 'r').read) if File.exist? POSTS
273
+ log INFO, "Saved post data to #{POSTS}"
274
+ posts = @dk.get_posts
275
+ File.open(POSTS, 'w') { |f| f.write posts }
276
+ posts
277
+ end
278
+
279
+ def installed_test_configuration?(result=nil)
280
+ data_yml = home_file('/coding/ruby/tumblr_autofixer/data.yml.bak')
281
+ summary_yml = home_file('/coding/ruby/tumblr_autofixer/summary.yml')
282
+ if File.exist? data_yml
283
+ `cp #{data_yml} #{confile('data.yml')}`
284
+ result = true
285
+ end
286
+ if File.exist? summary_yml
287
+ `cp #{summary_yml} #{confile('summary.yml')}`
288
+ result = true
289
+ end
290
+ result
291
+ end
292
+
293
+ end # end of DK::Autofixer
294
+ end # end of DK
@@ -0,0 +1,69 @@
1
+ module DK
2
+ class Autofixer
3
+ # Command
4
+ def generate_tags_yml
5
+ return unless @options.include?('g:tags')
6
+ GenerateTagsYml.new(ARGV)
7
+ exit(0)
8
+ end
9
+
10
+ # Generate tags.yml using DK
11
+ class GenerateTagsYml
12
+ def initialize(opts)
13
+ options = {}
14
+ options[:limit] = opt_val('-l') || 50
15
+ options[:blog] = opt_val('-b')
16
+ options[:config] = opt_val('--config')
17
+ options[:source] = opt_val('--source') || DK::PUBLISH
18
+ # Get Posts
19
+ dk = DK::Client.new(options)
20
+ posts = dk.get_posts.map { |post| DK::Post.new post }
21
+ posts = posts.select { |post| !post.tags.empty? }
22
+ # Collect Tags
23
+ @tags = []
24
+ posts.each { |post| @tags += post.tags }
25
+ @tstore = YAML::Store.new("#{confile('tags.yml')}")
26
+ # Preserve existing
27
+ existing = restore(@tstore, :good)
28
+ puts "Found #{existing.size} tags." if existing
29
+ @tags += existing if existing
30
+ @tags = @tags.map(&:downcase)
31
+ @tags.uniq!
32
+ @tags.sort!
33
+ # Save
34
+ puts "Saving #{@tags.size} tags"
35
+ store(@tstore, :good, @tags)
36
+
37
+ end
38
+
39
+ def opt_val(opt, default=nil)
40
+ ARGV[ARGV.find_index(opt) + 1] rescue default
41
+ end
42
+
43
+ def home_file(file)
44
+ DK::Config.home_path_file(file)
45
+ end
46
+
47
+ def confile(fname)
48
+ home_file('/config_md/taf/') + fname
49
+ end
50
+
51
+ # Code to extract from summary
52
+ # unless @split = opt_val('-S')
53
+ # puts "Please provide at least one delimiter"
54
+ # puts "eg. taf g:tags -S |"
55
+ # puts "eg. taf g:tags -S ,|/\\"
56
+ # exit(1)
57
+ # end
58
+ # posts.each do |post|
59
+ # comment = post.comment
60
+ # result = nil
61
+ # @split.each do |str|
62
+ # result ||= comment.split str
63
+ # result = result.map { |str2| str2.split str }.flatten
64
+ # end
65
+ # @tags += result
66
+ # end
67
+ end # of GenerateTagsYml
68
+ end # of Autofixer
69
+ end # of DK
@@ -1,8 +1,8 @@
1
1
  module DK
2
- class Idable
3
- def open_results(args)
4
- return unless args.include?('open')
5
- file = confile('need_review.html')
2
+ class Autofixer
3
+ def open_results
4
+ return unless @options.include?('open')
5
+ file = confile('updated.html')
6
6
  `open #{file}` && exit(0) if File.exist?(file)
7
7
  puts
8
8
  puts 'Error:'
@@ -0,0 +1,9 @@
1
+ module DK
2
+ class Autofixer
3
+ def show_config
4
+ return unless @options.include?('config')
5
+ `open #{@config_dir + 'view_config.html'}`
6
+ exit(0)
7
+ end
8
+ end
9
+ end
@@ -1,13 +1,14 @@
1
1
  module DK
2
- class Idable
3
- def show_help(args, opts)
4
- return unless (args.include?('help') || opts.find_index('-h'))
2
+ class Autofixer
3
+ def show_help
4
+ return unless (@options.include?('help') || @options.find_index('-h'))
5
5
  puts 'Usage: '
6
6
  puts ' $ taf <command?> [options?]'
7
7
  puts
8
8
  puts ' Commands:'
9
9
  puts ' help Show this menu.'
10
10
  puts ' open Open a webpage with the latest taf results.'
11
+ puts ' g:tags <command> [options] Generate a list of tags from your latest posts to serve as a whitelist for the Tag Matcher.'
11
12
  puts
12
13
  puts ' Options:'
13
14
  puts ' -s Simulate Run (no changes saved)'
@@ -1,7 +1,7 @@
1
1
  module DK
2
- class Idable
3
- def show_version(opts)
4
- return unless opts.include?('-v')
2
+ class Autofixer
3
+ def show_version
4
+ return unless @options.include?('-v') || @options.include?('--version')
5
5
  puts "\ntumblr_autofixer v#{VERSION}"
6
6
  puts
7
7
  exit(0)
@@ -0,0 +1,40 @@
1
+ <html>
2
+ <head>
3
+ <title><%= fname %></title>
4
+ <%= style %>
5
+ </head>
6
+ <body>
7
+ <h1>Ignore</h1>
8
+ <ul>
9
+ <% @ignore.each do |i| %>
10
+ <li><%= i %></li>
11
+ <% end %>
12
+ </ul>
13
+
14
+ <h1>Last Tag</h1>
15
+ <ul>
16
+ <% @last_tag.each do |i| %>
17
+ <li><%= i %></li>
18
+ <% end %>
19
+ </ul>
20
+
21
+ <h1>Summary</h1>
22
+ <ul>
23
+ <% @summary.each do |i| %>
24
+ <li><%= i %></li>
25
+ <% end %>
26
+ </ul>
27
+
28
+ <h1>Tag Index</h1>
29
+ <% @tag_idx.each_with_index do |blog_list, idx| %>
30
+ <h2>Tag <%= idx %></h2>
31
+ <ul>
32
+ <% blog_list.each do |blog| %>
33
+ <li><%= blog %></li>
34
+ <% end %>
35
+ </ul>
36
+ <% end %>
37
+
38
+ <footer>Updated at <%= Time.now.strftime('%d/%m/%Y') %></footer>
39
+ </body>
40
+ </html>
@@ -0,0 +1,60 @@
1
+ require 'tumblr_draftking'
2
+ require 'yaml/store'
3
+ require 'fileutils'
4
+ require 'erb'
5
+
6
+ def store(dstore, key, value)
7
+ dstore.transaction do
8
+ dstore[key] = value
9
+ end
10
+ end
11
+
12
+ def restore(dstore, key, default=nil)
13
+ dstore.transaction do
14
+ dstore[key] || default
15
+ end
16
+ end
17
+
18
+ def style
19
+ %q(
20
+ <style>
21
+ h1,h2 { width: 100%; background-color: rgb(140, 129, 38); color: white; text-align: center; }
22
+ ul, li { width: 100%; text-align: center; vertical-align: middle; padding: 0; margin: 0 auto;}
23
+ ul li { list-style: none; padding: 0; margin: 0 auto; }
24
+ ul li:hover { background-color: rgb(200, 200, 102); }
25
+ a, a:visited { color: white; vertical-align: middle; line-height: 100px; }
26
+ </style>
27
+ )
28
+ end
29
+
30
+ def script
31
+ %q(
32
+ <script>
33
+
34
+ </script>
35
+ )
36
+ end
37
+
38
+ if $0 == __FILE__
39
+ data_yml = YAML::Store.new(DK::Config.home_path_file('/config_md/taf/data.yml'))
40
+ # special_yml = YAML::Store.new(DK::Config.home_path_file('summary.yml'))
41
+
42
+ # Cache config data
43
+ @last_tag = restore(data_yml, :last_tag)
44
+ @tag_idx = restore(data_yml, :tag_idx)
45
+ @summary = restore(data_yml, :summary)
46
+ @ignore = restore(data_yml, :ignore)
47
+
48
+ template = '.html.erb'
49
+ fname = File.basename(__FILE__, '.rb')
50
+ tname = fname + template
51
+ tdata = File.open(tname, 'rb', &:read)
52
+ result = ERB.new(tdata).result(binding)
53
+
54
+ out_file = DK::Config.home_path_file('/config_md/taf/view_config.html')
55
+ File.open(out_file, 'w') do |f|
56
+ f << result
57
+ end
58
+
59
+ `open #{out_file}`
60
+ end
@@ -1,5 +1,5 @@
1
1
  module DK
2
- class Idable
2
+ class Autofixer
3
3
  private
4
4
 
5
5
  def store(dstore, key, value)
@@ -1,9 +1,8 @@
1
1
  module DK
2
- class Idable
3
- private
4
-
5
- def dk_opts
6
- { simulate: @simulate, limit: @limit }
2
+ class Autofixer
3
+ def normalize(tag, from='')
4
+ return ERROR if tag.nil?
5
+ affix(capitalize(tag))
7
6
  end
8
7
 
9
8
  def capitalize(s)
@@ -13,12 +12,7 @@ module DK
13
12
  res.join(' ')
14
13
  end
15
14
 
16
- def prefix(s)
17
- "#{@prefix}#{' ' + @spliter + ' ' if @spliter}#{s}#{@postfix}"
18
- end
19
-
20
- def link_to_edit(post)
21
- id = post.id rescue post['id']
15
+ def link_to_edit(id)
22
16
  "https://www.tumblr.com/edit/#{id}"
23
17
  end
24
18
 
@@ -33,9 +27,5 @@ module DK
33
27
  s
34
28
  end
35
29
 
36
- def home_file(file)
37
- DK::Config.home_path_file(file)
38
- end
39
-
40
30
  end
41
31
  end
@@ -0,0 +1,25 @@
1
+ module DK
2
+ class Post
3
+ # Post has a summary or tags?
4
+ def has_info?
5
+ has_summary? || !tags.empty?
6
+ end
7
+
8
+ # Do we know where it was reblogged from?
9
+ def has_trail?
10
+ !trail.empty?
11
+ end
12
+
13
+ # Post already has prefix?
14
+ def processed?(skip: false, prefix: '')
15
+ return false if skip
16
+ return false if prefix.empty?
17
+ l_comment = Sanitize.fragment(comment).strip
18
+ l_comment.start_with?(prefix) || summary.strip.start_with?(prefix)
19
+ end
20
+
21
+ def has_summary?
22
+ summary.strip.empty?
23
+ end
24
+ end
25
+ end
@@ -1,5 +1,5 @@
1
1
  module DK
2
- class Idable
2
+ class Autofixer
3
3
  private
4
4
 
5
5
  def bfrom(post)
@@ -9,44 +9,45 @@ module DK
9
9
  def show_results
10
10
  cli_header
11
11
 
12
- fname1 = confile('already_processed.html')
13
- fname2 = confile('need_review.html')
12
+ fname1 = confile('processed.html')
13
+ fname2 = confile('review.html')
14
14
  fname3 = confile('updated.html')
15
15
 
16
16
  @file_index = [
17
- ["Needs Review (#{@need_review.size})", fname2],
18
- ["Updated (#{@updated.size})", fname3],
19
- ["Already Processed (#{@already_processed.size})", fname1]
17
+ ["Review (#{@review.size})", fname2],
18
+ ["Updated (#{@updated.size})", fname3],
19
+ ["Preprocessed (#{@processed.size})", fname1]
20
20
  ]
21
21
 
22
- msg1 = "(#{@already_processed.size}) Drafts are ready to be queued."
23
- msg2 = "(#{@need_review.size}) Drafts need visual review."
22
+ msg1 = "(#{@processed.size}) Drafts are ready to be queued."
23
+ msg2 = "(#{@review.size}) Drafts need visual review."
24
24
  msg3 = "(#{@updated.size}) Drafts were Autofixed."
25
25
 
26
26
 
27
27
  # Already Processed
28
- @already_processed.sort_by!{ |x| x.id }
29
- generate_review_webpage(@already_processed, fname1, msg1)
28
+ @processed.sort_by!{ |x| x.id }
29
+ generate_review_webpage(@processed, fname1, msg1)
30
30
 
31
31
  # Need Review
32
- @need_review.sort_by! do |x|
32
+ @review.sort_by! do |x|
33
33
  bname = bfrom(x)
34
34
  [bname, x.id]
35
35
  end
36
- generate_review_webpage(@need_review, fname2, msg2)
36
+ generate_review_webpage(@review, fname2, msg2)
37
37
 
38
- # updated
38
+ # Updated
39
39
  @updated.sort_by!{ |x| bfrom(x)}
40
40
  generate_review_webpage(@updated, fname3, msg3)
41
41
 
42
42
  puts
43
43
  puts
44
- `open #{@file_index.first.last}` if @showres
44
+ `open #{@file_index.first.last}` if @show_results
45
45
  end
46
46
 
47
47
  def generate_review_webpage(post_info, fname, msg1='')
48
48
  page = "<html><head>#{style}</head><body>"
49
49
  page += page_nav
50
+ page += messages_html unless @messages.empty?
50
51
  page += '<table>'
51
52
  page += '<caption>'
52
53
  page += "<p>***** SIMULATION RUN *****</p>" if @simulate
@@ -63,19 +64,28 @@ module DK
63
64
  page += "</body></html>"
64
65
 
65
66
  # Create directory structure and file if it doesn't exist
66
- # FileUtils::mkdir_p File.dirname(fname) unless File.exist?(fname)
67
67
  File.open(fname, 'w'){|f| f.puts page}
68
68
  puts "** Updated file: #{fname} **:\n"
69
69
  end
70
70
 
71
+ def messages_html
72
+ msgs = @messages.map { |msg| "<p class='log'>#{msg}</p>" }
73
+ "<div>#{msgs}</div>"
74
+ end
75
+
71
76
  def post_image_code(post)
72
77
  # Alt Sizes (0 - 6) Large to Small
73
78
  count = post.photos.size
74
- photo = count > 0 ? post.photos.first.alt_sizes[4].url : image_missing
75
- res = "<td><a target='_blank' href='#{link_to_edit(post)}'>"
79
+ photo = post.photos.first.alt_sizes[4].url rescue image_missing
80
+ photo = image_missing if @hide_pics
81
+ from = bfrom(post)
82
+ url = 'http://' + tumblr_url(from)
83
+ # byebug unless url
84
+ res = "<td><a target='_blank' href='#{link_to_edit(post.id)}'>"
76
85
  res += "<img src='#{photo}'>#{' (' + count.to_s + ')' if count > 1}</a></td>"
77
- res += "<td><p>#{bfrom(post)}</p></td>"
78
- res += "<td><p>#{post.comment.empty? ? '-no comment-' : post.comment}</p></td>"
86
+ res += "<td><p><a class='blog_link' href='#{url}' target='_blank'>#{from}</a></p></td>"
87
+ res += "<td><p>#{post.comment.empty? ? '' : post.comment}</p></td>"
88
+ res += "<td><p>#{post.summary.empty? ? '' : post.summary}</p></td>"
79
89
  res += "<td><p>#{post.tags.empty? ? '-no tags-' : post.tags.join(', ')}</p></td>"
80
90
  end
81
91
 
@@ -91,8 +101,8 @@ module DK
91
101
  puts
92
102
  puts "#{@total} drafts were retrieved."
93
103
  puts "#{pad(@updated.size, @total, 1)} drafts were Autofixed."
94
- puts "#{pad(@already_processed.size, @total, 1)} drafts were marked 'already processed'."
95
- puts "#{pad(@need_review.size, @total, 1)} drafts require visual review."
104
+ puts "#{pad(@processed.size, @total, 1)} drafts were marked 'already processed'."
105
+ puts "#{pad(@review.size, @total, 1)} drafts require visual review."
96
106
  puts '_'*40
97
107
  puts
98
108
  end
@@ -109,7 +119,8 @@ module DK
109
119
  res = '<thead><tr>'
110
120
  res += '<th>Photo</th>'
111
121
  res += '<th>Source</th>'
112
- res += '<th>Caption</th>'
122
+ res += '<th>Comment</th>'
123
+ res += '<th>Summary</th>'
113
124
  res += '<th>Tags</th>'
114
125
  res += '</tr></thead>'
115
126
  end
@@ -126,12 +137,14 @@ module DK
126
137
  nav ul li a { display: inline-block; width: 100%; }
127
138
  nav ul li:hover { background-color: rgb(43, 171, 171); }
128
139
  a, a:visited { color: white; vertical-align: middle; line-height: 100px; }
140
+ a.blog_link { color: black; }
141
+ p.log { width: 100%; background-color: rgb(56, 103, 103); color: white; text-align: center; }
129
142
  </style>
130
143
  )
131
144
  end
132
145
 
133
146
  def image_missing
134
- 'https://us-east-1.tchyn.io/snopes-production/uploads/2018/03/rating-false.png'
147
+ 'https://image.freepik.com/free-icon/male-user-shadow_318-34042.jpg'
135
148
  end
136
149
 
137
150
  end
@@ -1,5 +1,5 @@
1
1
  module DK
2
- class Idable
3
- VERSION = '0.0.2'
2
+ class Autofixer
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
@@ -2,179 +2,9 @@ require 'tumblr_draftking'
2
2
  require 'yaml/store'
3
3
  require 'sanitize'
4
4
  require 'fileutils'
5
+ require 'byebug'
5
6
  Dir[File.join(__dir__, 'autofixer', '**', '*.rb')].each {|file| require file }
6
- require 'pry'
7
-
8
- module DK
9
- class Idable
10
- C_LEN = 25
11
- ERROR_STRING = '**'
12
- def initialize(opts)
13
- @config_dir = home_file('/config_md/taf/')
14
-
15
- check_for_command(ARGV, opts)
16
- extract_opts(opts)
17
-
18
- @dk = DK::Client.new(dk_opts)
19
-
20
- # Ensure my latest config files are in place.
21
- `cp data.yml.bak #{confile('data.yml')}` if File.exist?('data.yml.bak')
22
- `cp summary.yml #{confile('summary.yml')}` if File.exist?('summary.yml')
23
-
24
- read_configuration
25
- @already_processed, @need_review, @updated = [], [], []
26
-
27
- autofixer(get_informative_posts)
28
- @need_review = clear(@need_review) if @clear
29
- show_results
30
- end
31
-
32
- private
33
-
34
- def read_configuration
35
- # Ensure directory structure exists
36
- FileUtils::makedirs @config_dir unless Dir.exist?(@config_dir)
37
-
38
- # Ensure configuration files are present
39
- @ystore = YAML::Store.new("#{confile('data.yml')}")
40
- @sstore = YAML::Store.new("#{confile('summary.yml')}")
41
- prep_user_data_files
42
-
43
- # Cache config data
44
- @last_tag = restore(@ystore, :last_tag)
45
- @tag_idx = restore(@ystore, :tag_idx)
46
- @summary = restore(@ystore, :summary)
47
- @ignore = restore(@ystore, :ignore)
48
- end
49
-
50
- def check_for_command(args, opts)
51
- show_help(args, opts)
52
- show_version(opts)
53
- open_results(args)
54
- end
55
-
56
- def confile(fname)
57
- @config_dir + fname
58
- end
59
-
60
- def extract_opts(opts)
61
- @simulate = opts.include?('-s')
62
- @limit = opts[opts.find_index('-l') + 1].to_i rescue nil
63
- @spliter = opts[opts.find_index('-S') + 1] rescue ' '
64
- @prefix = opts[opts.find_index('-p') + 1] rescue ''
65
- @postfix = opts[opts.find_index('-P') + 1] rescue ''
66
- @showres = opts.find_index('--show')
67
- @clear = opts.find_index('--clear')
68
- end
69
-
70
- def get_informative_posts
71
- drafts = @dk.get_posts.map{|post| DK::Post.new(post)}
72
- @total = drafts.size
73
- drafts.select do |draft|
74
- ((@already_processed << draft) && next) if post_already_processed?(draft)
75
- ((@need_review << draft) && next) unless post_has_info?(draft)
76
- ((@need_review << draft) && next) unless post_has_trail?(draft)
77
- true
78
- end
79
- end
80
-
81
- # Post already has prefix?
82
- def post_already_processed?(post)
83
- summary = post.summary.chomp.strip
84
- user_c = Sanitize.fragment(post.comment).strip
85
-
86
- user_c.start_with?(@prefix) || summary.start_with?(@prefix)
87
- end
88
-
89
- # Post has a summary or tags?
90
- def post_has_info?(post)
91
- summary = post.summary.chomp.strip
92
- !summary.empty? || !post.tags.empty?
93
- end
94
-
95
- # Do we know where it was reblogged from?
96
- def post_has_trail?(post)
97
- !post.trail.empty?
98
- end
99
-
100
-
101
- def autofixer(posts)
102
- posts.each_with_index do |post, idx|
103
- tags = post.tags
104
- trail_name = post.trail.first.blog.name
105
- post_summary = post.summary
106
-
107
- ((@need_review << post) && next) if @ignore.include?(trail_name)
108
- if fix_from_tag(post, trail_name)
109
- next # Successfully used a tag-index to process post
110
- elsif commands = restore(@sstore, trail_name.to_sym)
111
- # Has custom processing of post.summary data defined
112
- new_comment = special_summary(post_summary, trail_name, commands)
113
- elsif @summary.include?(trail_name)
114
- # Use default processing of post.summary data
115
- new_comment = special_summary(post_summary, trail_name, [])
116
- elsif @last_tag.include?(trail_name)
117
- # Use the last available post.tags
118
- new_comment = autofix(tags.last, trail_name)
119
- else
120
- # Don't know what to do with it.
121
- new_comment = ERROR_STRING
122
- end
123
-
124
- ((@need_review << post) && next) if new_comment.eql?(ERROR_STRING)
125
-
126
- success = update_post_comment(post, new_comment)
127
- (success ? @updated : @need_review) << post
128
- end
129
- end
130
-
131
- def fix_from_tag(post, blog_name)
132
- @tag_idx.each_with_index do |names, idx|
133
- next unless names.include?(blog_name)
134
- new_comment = autofix(post.tags[idx])
135
- if new_comment.eql?(ERROR_STRING)
136
- # No tag at the expected tag-index
137
- @need_review << post
138
- return false
139
- end
140
- success = update_post_comment(post, new_comment)
141
- (success ? @updated : @need_review) << post
142
- return true
143
- end
144
- false
145
- end
146
-
147
- def autofix(tag, from='')
148
- return ERROR_STRING if tag.nil?
149
- prefix(capitalize(tag))
150
- end
151
-
152
- def update_post_comment(post, comment)
153
- post.replace_comment_with(comment)
154
- post.save(client: @dk.client, simulate: @dk.simulate)
155
- end
156
-
157
- def special_summary(summary, from, commands)
158
- return '' if summary.nil? || from.nil?
159
- lines = summary.split("\n")
160
- res = summary.downcase
161
- b = binding
162
- commands.each{ |x| eval(x, b) }
163
- prefix(capitalize(res))
164
- end
165
-
166
- def clear(posts)
167
- error = []
168
- posts.each do |post|
169
- success = update_post_comment(post, @prefix)
170
- (success ? @updated : error) << post
171
- end
172
- error
173
- end
174
-
175
- end # end of DK::Idable
176
- end # end of DK
177
7
 
178
8
  if __FILE__ == $0
179
- DK::Idable.new(ARGV)
9
+ DK::Autofixer.new(ARGV)
180
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tumblr_autofixer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Meissa Dia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-31 00:00:00.000000000 Z
11
+ date: 2018-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tumblr_draftking
@@ -48,11 +48,17 @@ extra_rdoc_files: []
48
48
  files:
49
49
  - README.md
50
50
  - bin/taf
51
+ - lib/autofixer/autofixer.rb
52
+ - lib/autofixer/commands/generate_tags_yml.rb
51
53
  - lib/autofixer/commands/open_results.rb
54
+ - lib/autofixer/commands/show_config.rb
52
55
  - lib/autofixer/commands/show_help.rb
53
56
  - lib/autofixer/commands/show_version.rb
57
+ - lib/autofixer/config/view_config.html.erb
58
+ - lib/autofixer/config/view_config.rb
54
59
  - lib/autofixer/data_store.rb
55
60
  - lib/autofixer/helpers.rb
61
+ - lib/autofixer/patches/DK_Post.rb
56
62
  - lib/autofixer/results.rb
57
63
  - lib/autofixer/version.rb
58
64
  - lib/tumblr_autofixer.rb