augury 1.0.3 → 1.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
  SHA256:
3
- metadata.gz: 0202c829a5e6fdfb712f3cf87ea3a340d2242ed6c86a328ab6fefce9c255963d
4
- data.tar.gz: 2a90f740ab640843302ae6bc5e767c6d2f486d3c9ff060c200f8721ada5c16bd
3
+ metadata.gz: 5bfe458d2f8431e98c03bef3fd02e3110cc0a3be14523a468dca050f3ea1c478
4
+ data.tar.gz: d758020f0f3281a559a48237fe17edf9a9600c7d7072a11c5597ae038fd7b07c
5
5
  SHA512:
6
- metadata.gz: 3c91a52995151ac50e642785bafe6247e79598eacda3ad32c3fd0ae8331b48596c6567342b17a11918761dff5da2ff2dbdd2544ec16643db666121689f95675f
7
- data.tar.gz: 7c77c6c70e749e3c7f703a089554f686e3c7a1383c4f651a38a490b5f3c6244e28b658053a5bde478499e1994c6321817cd28ca6c8545b768a2fe83e2f72279d
6
+ metadata.gz: b756e409e7d664fe41e85394979f126ae43c623e7b98a8e1c214916fa18860664f1431a485fa8d210798eccf2165b944cc646d577ff76c00a77513f2ef146834
7
+ data.tar.gz: 79250c0549f60c415bdf476f16faf41bccc3f8dd05f97f44b1bbd9aab25508e0beff1e51bb3cebbf71a228cc767ed884f4f66b618a25e15c4dcfc4f44d530ac2
@@ -1,5 +1,11 @@
1
1
  # Changes
2
2
 
3
+ ## 1.1.0 (2020-01-24)
4
+
5
+ - Add ability to transform tweet text with find / replace
6
+ - Get full text of tweets, not the default abbreviated version
7
+ - Switch to better word wrapping library
8
+
3
9
  ## 1.0.3 (2020-01-23)
4
10
 
5
11
  - Pin Thor version to avoid issue with `options` override
@@ -1,17 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- augury (1.0.2)
5
- facets (~> 3.0)
4
+ augury (1.1.0)
6
5
  thor (~> 1.0.0)
7
6
  twitter (~> 7.0)
7
+ word_wrap (~> 1.0)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
12
  addressable (2.7.0)
13
13
  public_suffix (>= 2.0.2, < 5.0)
14
- ast (2.4.1)
14
+ ast (2.4.2)
15
15
  awesome_print (1.8.0)
16
16
  backport (1.1.2)
17
17
  benchmark (0.1.1)
@@ -21,12 +21,11 @@ GEM
21
21
  crack (0.4.5)
22
22
  rexml
23
23
  diff-lcs (1.4.4)
24
- docile (1.3.4)
24
+ docile (1.3.5)
25
25
  domain_name (0.5.20190701)
26
26
  unf (>= 0.0.5, < 1.0.0)
27
27
  e2mmap (0.1.0)
28
28
  equalizer (0.0.11)
29
- facets (3.1.0)
30
29
  ffi (1.14.2)
31
30
  ffi-compiler (1.0.1)
32
31
  ffi (>= 1.0.0)
@@ -40,8 +39,8 @@ GEM
40
39
  http-cookie (1.0.3)
41
40
  domain_name (~> 0.5)
42
41
  http-form_data (2.3.0)
43
- http-parser (1.2.2)
44
- ffi-compiler
42
+ http-parser (1.2.3)
43
+ ffi-compiler (>= 1.0, < 2.0)
45
44
  http_parser.rb (0.6.0)
46
45
  jaro_winkler (1.5.4)
47
46
  kramdown (2.3.0)
@@ -58,7 +57,7 @@ GEM
58
57
  mini_portile2 (~> 2.5.0)
59
58
  racc (~> 1.4)
60
59
  parallel (1.20.1)
61
- parser (2.7.2.0)
60
+ parser (3.0.0.0)
62
61
  ast (~> 2.4.1)
63
62
  pry (0.13.1)
64
63
  coderay (~> 1.1)
@@ -102,7 +101,7 @@ GEM
102
101
  rubocop-ast (>= 0.5.0)
103
102
  ruby-progressbar (~> 1.7)
104
103
  unicode-display_width (>= 1.4.0, < 2.0)
105
- rubocop-ast (1.4.0)
104
+ rubocop-ast (1.4.1)
106
105
  parser (>= 2.7.1.5)
107
106
  rubocop-rake (0.5.1)
108
107
  rubocop
@@ -111,13 +110,13 @@ GEM
111
110
  rubocop-ast (>= 0.7.1)
112
111
  ruby-progressbar (1.11.0)
113
112
  simple_oauth (0.3.1)
114
- simplecov (0.21.1)
113
+ simplecov (0.21.2)
115
114
  docile (~> 1.1)
116
115
  simplecov-html (~> 0.11)
117
116
  simplecov_json_formatter (~> 0.1)
118
117
  simplecov-html (0.12.3)
119
118
  simplecov_json_formatter (0.1.2)
120
- solargraph (0.40.1)
119
+ solargraph (0.40.2)
121
120
  backport (~> 1.1)
122
121
  benchmark
123
122
  bundler (>= 1.17.2)
@@ -125,7 +124,7 @@ GEM
125
124
  jaro_winkler (~> 1.5)
126
125
  kramdown (~> 2.3)
127
126
  kramdown-parser-gfm (~> 1.1)
128
- parser (~> 2.3)
127
+ parser (~> 3.0)
129
128
  reverse_markdown (>= 1.0.5, < 3)
130
129
  rubocop (>= 0.52)
131
130
  thor (~> 1.0)
@@ -150,10 +149,11 @@ GEM
150
149
  unf_ext (0.0.7.7)
151
150
  unicode-display_width (1.7.0)
152
151
  vcr (6.0.0)
153
- webmock (3.11.0)
152
+ webmock (3.11.1)
154
153
  addressable (>= 2.3.6)
155
154
  crack (>= 0.3.2)
156
155
  hashdiff (>= 0.4.0, < 2.0.0)
156
+ word_wrap (1.0.0)
157
157
  yard (0.9.26)
158
158
 
159
159
  PLATFORMS
data/README.md CHANGED
@@ -107,7 +107,11 @@ Option | Description | Default
107
107
  `retweets` | Include retweets. | `false`
108
108
  `replies` | Include replies. | `false`
109
109
  `links` | Include tweets with links in them. | `false`
110
+ `remove_links` | Remove all links from tweets before any other `transforms`. If set, this infers `links` is `true`. | `false`
110
111
  `attribution` | Add an author attribution to each fortune. | `false`
112
+ `apply_transforms` | Apply the global and feed specific transforms. | `false`
113
+ `transforms` | Transformations to apply to specific user feeds. See [Transforms](#transforms) below. |
114
+ `global-transforms` | Transformations to apply to all feeds. Applied after `transforms` See [Transforms](#transforms) below. |
111
115
 
112
116
  ### Twitter Setup
113
117
 
@@ -126,6 +130,65 @@ twitter:
126
130
  access_token_secret: YOUR_ACCESS_TOKEN_SECRET
127
131
  ```
128
132
 
133
+ ### Transforms
134
+
135
+ Global substitutions can be made using regular expressions.
136
+ Each transform is a pattern and replacement.
137
+ For instance, if you wanted to replace all `Hello`'s with `Hello world`, you could add the following:
138
+
139
+ ```yaml
140
+ global-transforms:
141
+ -
142
+ - !ruby/regexp /(hello)/i
143
+ - "\\1 world"
144
+ ```
145
+
146
+ Global transforms are applied after all other `transforms`.
147
+ Word wrapping is applied after the transforms have been applied.
148
+
149
+ #### Feed specific
150
+
151
+ Transforms can also be defined per user feed.
152
+ If you wanted to do the same as the global above, but only for `seinfeldtoday`, then add the following:
153
+
154
+ ```yaml
155
+ transforms:
156
+ seinfeldtoday:
157
+ -
158
+ - !ruby/regexp /(hello)/i
159
+ - "\\1 world"
160
+ ```
161
+
162
+ Or a more interesting example using the example earlier for `seinfeldtoday`:
163
+
164
+ ```text
165
+ Elaine has no idea what her BF does for a living and it's now too
166
+ late to ask. E:"Teacher, I think. Or a doctor? Wait Is
167
+ 'computers' a job?"
168
+ ```
169
+
170
+ Then add the following to make this a bit more readable:
171
+
172
+ ```yaml
173
+ transforms:
174
+ seinfeldtoday:
175
+ -
176
+ - !ruby/regexp /(E:\s*)/
177
+ - "\n\nElaine: "
178
+ -
179
+ - !ruby/regexp /BF/
180
+ - "boyfriend"
181
+ ```
182
+
183
+ Then we end up with this:
184
+
185
+ ```text
186
+ Elaine has no idea what her boyfriend does for a living and it's now
187
+ too late to ask.
188
+
189
+ Elaine: "Teacher, I think. Or a doctor? Wait Is 'computers' a job?"
190
+ ```
191
+
129
192
  ## Usage
130
193
 
131
194
  Create a fortune for the latest *seinfeldtoday* tweets.
@@ -23,5 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency 'thor', '~>1.0.0'
24
24
  spec.add_dependency 'twitter', '~>7.0'
25
25
  ## For the word_wrap function
26
- spec.add_dependency 'facets', '~>3.0'
26
+ spec.add_dependency 'word_wrap', '~>1.0'
27
27
  end
@@ -16,7 +16,7 @@ module Augury
16
16
  option :append,
17
17
  type: :boolean,
18
18
  aliases: '-a',
19
- desc: 'If set, the target path will be appended to instead of overwritten'
19
+ desc: 'If set, the target path will be appended to instead of overwritten. DEFAULT: false'
20
20
 
21
21
  option :count,
22
22
  type: :numeric,
@@ -38,11 +38,21 @@ module Augury
38
38
  aliases: '-l',
39
39
  desc: 'Include tweets with links in them. DEFAULT: false'
40
40
 
41
+ option :remove_links,
42
+ type: :boolean,
43
+ aliases: '--remove-links',
44
+ desc: 'Remove links from tweets. DEFAULT: false'
45
+
41
46
  option :attribution,
42
47
  type: :boolean,
43
48
  aliases: '-A',
44
49
  desc: 'Add an author attribution to each fortune. DEFAULT: false'
45
50
 
51
+ option :apply_transforms,
52
+ type: :boolean,
53
+ aliases: '-t',
54
+ desc: 'Apply transforms from config file. DEFAULT: false'
55
+
46
56
  def generate(username, *path)
47
57
  path = File.expand_path(path[0] || username)
48
58
  augury = Augury::Fortune.new(username, path, options)
@@ -63,12 +73,7 @@ module Augury
63
73
  defaults = Thor::CoreExt::HashWithIndifferentAccess.new(
64
74
  {
65
75
  width: 72,
66
- append: false,
67
76
  count: 200,
68
- retweets: false,
69
- replies: false,
70
- links: false,
71
- attribution: false,
72
77
  },
73
78
  )
74
79
 
@@ -78,6 +83,9 @@ module Augury
78
83
  defaults = defaults.merge(config_options)
79
84
  end
80
85
 
86
+ # Enforce implied options
87
+ defaults[:links] = true if original_options[:remove_links] || defaults[:remove_links]
88
+
81
89
  Thor::CoreExt::HashWithIndifferentAccess.new(defaults.merge(original_options))
82
90
  end
83
91
  end
@@ -6,4 +6,10 @@ module Augury
6
6
  'No twitter credential configuration found in the augury config'
7
7
  end
8
8
  end
9
+
10
+ class TransformError < StandardError
11
+ def message
12
+ 'Augury transforms are invalid, check your configuration'
13
+ end
14
+ end
9
15
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cgi'
4
- require 'facets/string/word_wrap'
4
+ require 'word_wrap'
5
5
  require 'twitter'
6
6
 
7
7
  module Augury
@@ -30,6 +30,7 @@ module Augury
30
30
  @tweets = collect_with_max_id do |max_id|
31
31
  options = {
32
32
  count: 200,
33
+ tweet_mode: 'extended',
33
34
  include_rts: @config[:retweets],
34
35
  exclude_replies: !@config[:replies],
35
36
  }
@@ -46,7 +47,14 @@ module Augury
46
47
  filtered = @tweets.flat_map(&:full_text).reject do |tweet|
47
48
  tweet.match(/https?:/) unless @config[:links]
48
49
  end
49
- formatted = filtered.flat_map { |tweet| CGI.unescapeHTML(tweet).word_wrap(@config[:width]) }
50
+ to_transform = transforms
51
+ formatted = filtered.flat_map do |tweet|
52
+ text = CGI.unescapeHTML(tweet)
53
+ to_transform.each do |transform|
54
+ text.gsub!(transform[0], transform[1])
55
+ end
56
+ WordWrap.ww text, @config.fetch(:width, 72)
57
+ end
50
58
  author = @config[:attribution] ? "\n-- #{@twitter.user(@username).name}\n" : ''
51
59
  formatted.join("#{author}%\n")
52
60
  end
@@ -75,5 +83,28 @@ module Augury
75
83
  cfg.access_token_secret = @config[:twitter]['access_token_secret']
76
84
  end
77
85
  end
86
+
87
+ private
88
+
89
+ def transforms
90
+ all_transforms = []
91
+ all_transforms << [/https?:\/\/[^\s]+/, ''] if @config[:remove_links]
92
+ return all_transforms unless @config[:apply_transforms]
93
+
94
+ all_transforms.push(*@config.dig('transforms', @username) || [])
95
+ all_transforms.push(*@config.fetch('global-transforms', []))
96
+
97
+ raise Augury::TransformError unless validate_transforms(all_transforms)
98
+
99
+ all_transforms
100
+ end
101
+
102
+ def validate_transforms(all_transforms)
103
+ all_transforms.all? do |transform|
104
+ transform.count == 2 &&
105
+ [String, Regexp].include?(transform[0].class) &&
106
+ transform[1].is_a?(String)
107
+ end
108
+ end
78
109
  end
79
110
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Augury
4
- VERSION = '1.0.3'
4
+ VERSION = '1.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: augury
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clayton Parker
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-23 00:00:00.000000000 Z
11
+ date: 2021-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '7.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: facets
42
+ name: word_wrap
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '1.0'
48
48
  type: :runtime
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: '3.0'
54
+ version: '1.0'
55
55
  description: This gem turns a twitter feed into a fortune file that you can use with
56
56
  the fortune program
57
57
  email: