lolcommits 0.9.4 → 0.9.5.pre1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6bde0388bf4f5618ad723b966a29d357551ab84
4
- data.tar.gz: 294abe646e403ec2ff9b120ec9ac9788af38e3aa
3
+ metadata.gz: dd13587e4a453dcd73506653bba23b9fe19c6903
4
+ data.tar.gz: beacc833f4169a2309e0fc0927f5dc3c639fda1d
5
5
  SHA512:
6
- metadata.gz: 572687c4801b036de2bf5e3658eb5087f4f700f5429da5f9ed4e5d8dee7fba659ef4967dd8fd3b3a454f2270173615b365a6b44e4ec77e1ab996a1607c21de04
7
- data.tar.gz: b2daed80aa5decba8d64aa4bbe1ba3fe8fdfb69b8c6b528dbe0c54cc34dea714c70825e24992f8ae4315ae5b3ce0304c969fbb7b94e5061b725b2e4eba230893
6
+ metadata.gz: aa7c9e5065643d109fec9fbcdcf9e75d9f349809bc4e95e43717c3f93b1ec9f203c0a052cf70d72593d3432172170c66fe7345aae2be7c003fc18af6f27518e1
7
+ data.tar.gz: 41035783d256a3d9929016e898107f51040e2ee03a561c145aab1b227dfe91ef490c9558769afeb58130ecf391ed065a623f078a82db4ef3099c77f08eab49f3
@@ -2,5 +2,6 @@ AllCops:
2
2
  Exclude:
3
3
  - vendor/bundle/**/*
4
4
  - .bundle/**/*
5
+ - '**/.irbrc'
5
6
 
6
7
  inherit_from: .rubocop_todo.yml
@@ -18,7 +18,7 @@ Metrics/AbcSize:
18
18
  # Offense count: 2
19
19
  # Configuration parameters: CountComments, ExcludedMethods.
20
20
  Metrics/BlockLength:
21
- Max: 40
21
+ Max: 60
22
22
 
23
23
  # Offense count: 5
24
24
  # Configuration parameters: CountComments.
@@ -56,7 +56,7 @@ Style/Documentation:
56
56
 
57
57
  # Offense count: 2
58
58
  # Cop supports --auto-correct.
59
- Style/EmptyLinesAroundBeginBody:
59
+ Layout/EmptyLinesAroundBeginBody:
60
60
  Exclude:
61
61
  - 'lib/lolcommits/plugin/lol_flowdock.rb'
62
62
  - 'lib/lolcommits/plugin/lol_slack.rb'
@@ -65,7 +65,7 @@ Style/EmptyLinesAroundBeginBody:
65
65
  # Cop supports --auto-correct.
66
66
  # Configuration parameters: EnforcedStyle, SupportedStyles.
67
67
  # SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
68
- Style/IndentHeredoc:
68
+ Layout/IndentHeredoc:
69
69
  Exclude:
70
70
  - 'lib/lolcommits/backends/installation_git.rb'
71
71
 
@@ -8,6 +8,9 @@ project adheres to [Semantic Versioning][Semver].
8
8
  * WIP - extract more plugins to gems ...
9
9
  * Your contribution here!
10
10
 
11
+ ## [0.9.5][] (21 July 2017)
12
+ * Extract Twitter Plugin / refactor Plugin::Base (@matthutchinson [#347][])
13
+
11
14
  ## [0.9.4][] (17 April 2017)
12
15
  * Add captureready plugin hook (@matthutchinson [#342][])
13
16
  * README changes (@mroth [#341][])
@@ -279,7 +282,8 @@ project adheres to [Semantic Versioning][Semver].
279
282
  instead of compositing multiply image Caption objects (this seems to be more
280
283
  reliable to not glitch.)
281
284
 
282
- [Unreleased]: https://github.com/mroth/lolcommits/compare/v0.9.4...HEAD
285
+ [Unreleased]: https://github.com/mroth/lolcommits/compare/v0.9.5...HEAD
286
+ [0.9.5]: https://github.com/mroth/lolcommits/compare/v0.9.4...v0.9.5
283
287
  [0.9.4]: https://github.com/mroth/lolcommits/compare/v0.9.3...v0.9.4
284
288
  [0.9.3]: https://github.com/mroth/lolcommits/compare/v0.9.2...v0.9.3
285
289
  [0.9.2]: https://github.com/mroth/lolcommits/compare/v0.9.1...v0.9.2
@@ -443,3 +447,4 @@ project adheres to [Semantic Versioning][Semver].
443
447
  [#340]: https://github.com/mroth/lolcommits/pull/340
444
448
  [#341]: https://github.com/mroth/lolcommits/pull/341
445
449
  [#342]: https://github.com/mroth/lolcommits/pull/342
450
+ [#347]: https://github.com/mroth/lolcommits/pull/347
data/Gemfile CHANGED
@@ -1,4 +1,2 @@
1
1
  source 'https://rubygems.org'
2
-
3
- # Specify gem dependencies in lolcommits.gemspec
4
2
  gemspec
data/README.md CHANGED
@@ -209,7 +209,7 @@ Installed plugins can be easily enabled, configured or disabled with the
209
209
  lolcommits --config -p loltext
210
210
 
211
211
  Interested in developing your own plugin? Follow [this simple
212
- guide](https://github.com/lolcommits/lolcommits-plugin-sample) at the
212
+ guide](https://github.com/lolcommits/lolcommits-plugin-sample#developing-your-own-plugin) at the
213
213
  Lolcommits Plugin Sample README.
214
214
 
215
215
 
@@ -30,7 +30,6 @@ require 'lolcommits/backends/mercurial_info'
30
30
 
31
31
  require 'lolcommits/plugin/base'
32
32
  require 'lolcommits/plugin/dot_com'
33
- require 'lolcommits/plugin/lol_twitter'
34
33
  require 'lolcommits/plugin/uploldz'
35
34
  require 'lolcommits/plugin/term_output'
36
35
  require 'lolcommits/plugin/lolsrv'
@@ -16,6 +16,10 @@ module Lolcommits
16
16
  open_with_launchy(path)
17
17
  end
18
18
 
19
+ def self.open_url(url)
20
+ open_with_launchy(url)
21
+ end
22
+
19
23
  # Opens with Launchy, which knows how to open pretty much anything
20
24
  # local files, urls, etc.
21
25
  #
@@ -71,7 +71,7 @@ module Lolcommits
71
71
  return if plugin_name.empty?
72
72
 
73
73
  plugin_klass = plugin_manager.find_by_name(plugin_name)
74
- return plugin_klass.new(nil) if plugin_klass
74
+ return plugin_klass.new(config: self) if plugin_klass
75
75
 
76
76
  puts "Unable to find plugin: '#{plugin_name}'"
77
77
  return if plugin_name_option.empty?
@@ -1,41 +1,45 @@
1
1
  module Lolcommits
2
2
  module Plugin
3
3
  class Base
4
- attr_accessor :runner, :options
4
+ attr_accessor :runner, :config, :options
5
5
 
6
- def initialize(runner)
6
+ def initialize(runner: nil, config: nil)
7
7
  self.runner = runner
8
+ self.config = config || runner.config
8
9
  self.options = ['enabled']
9
10
  end
10
11
 
11
- def execute_precapture
12
+ def execute_pre_capture
12
13
  return unless configured_and_enabled?
13
- debug 'I am enabled, about to run precapture'
14
- run_precapture
14
+ debug 'I am enabled, about to run pre capture'
15
+ run_precapture # TODO: remove me (legacy method)
16
+ run_pre_capture
15
17
  end
16
18
 
17
- def execute_postcapture
19
+ def execute_post_capture
18
20
  return unless configured_and_enabled?
19
- debug 'I am enabled, about to run postcapture'
20
- run_postcapture
21
+ debug 'I am enabled, about to run post capture'
22
+ run_postcapture # TODO: remove me (legacy method)
23
+ run_post_capture
21
24
  end
22
25
 
23
- def execute_captureready
26
+ def execute_capture_ready
24
27
  return unless configured_and_enabled?
25
- debug 'I am enabled, about to run captureready'
26
- run_captureready
28
+ debug 'I am enabled, about to run capture ready'
29
+ run_captureready # TODO: remove me (legacy method)
30
+ run_capture_ready
27
31
  end
28
32
 
29
- def run_precapture; end
33
+ def run_pre_capture; end
30
34
 
31
- def run_postcapture; end
35
+ def run_post_capture; end
32
36
 
33
- def run_captureready; end
37
+ def run_capture_ready; end
34
38
 
35
39
  def configuration
36
- config = runner.config.read_configuration if runner
37
- return {} unless config
38
- config[self.class.name] || {}
40
+ saved_config = config.read_configuration
41
+ return {} unless saved_config
42
+ saved_config[self.class.name] || {}
39
43
  end
40
44
 
41
45
  # ask for plugin options
@@ -87,13 +91,18 @@ module Lolcommits
87
91
  !configuration.empty?
88
92
  end
89
93
 
90
- # uniform puts for plugins
91
- # dont puts if the runner wants to be silent (stealth mode)
94
+ # uniform puts and print for plugins
95
+ # dont puts or print if the runner wants to be silent (stealth mode)
92
96
  def puts(*args)
93
97
  return if runner && runner.capture_stealth
94
98
  super(args)
95
99
  end
96
100
 
101
+ def print(args)
102
+ return if runner && runner.capture_stealth
103
+ super(args)
104
+ end
105
+
97
106
  # helper to log errors with a message via debug
98
107
  def log_error(e, message)
99
108
  debug message
@@ -118,12 +127,19 @@ module Lolcommits
118
127
  # Three hook positions exist, your plugin code can execute in one or more
119
128
  # of these.
120
129
  #
121
- # @return [Array] the position(s) (:precapture, :postcapture,
122
- # :captureready)
130
+ # @return [Array] the position(s) (:pre_capture, :post_capture,
131
+ # :capture_ready)
123
132
  #
124
133
  def self.runner_order
125
134
  []
126
135
  end
136
+
137
+ # TODO: remove these legacy methods
138
+ def run_precapture; end
139
+
140
+ def run_postcapture; end
141
+
142
+ def run_captureready; end
127
143
  end
128
144
  end
129
145
  end
@@ -5,12 +5,12 @@ module Lolcommits
5
5
  class DotCom < Base
6
6
  BASE_URL = 'http://lolcommits-dot-com.herokuapp.com'.freeze
7
7
 
8
- def initialize(runner)
8
+ def initialize(runner: nil, config: nil)
9
9
  super
10
10
  options.concat(%w(api_key api_secret repo_id))
11
11
  end
12
12
 
13
- def run_captureready
13
+ def run_capture_ready
14
14
  t = Time.now.to_i.to_s
15
15
  HTTMultiParty.post(
16
16
  "#{BASE_URL}/git_commits.json",
@@ -43,7 +43,7 @@ module Lolcommits
43
43
  end
44
44
 
45
45
  def self.runner_order
46
- :captureready
46
+ :capture_ready
47
47
  end
48
48
  end
49
49
  end
@@ -11,7 +11,7 @@ module Lolcommits
11
11
  end
12
12
 
13
13
  def self.runner_order
14
- :captureready
14
+ :capture_ready
15
15
  end
16
16
 
17
17
  def configured?
@@ -45,7 +45,7 @@ module Lolcommits
45
45
  options
46
46
  end
47
47
 
48
- def run_captureready
48
+ def run_capture_ready
49
49
  retries = RETRY_COUNT
50
50
  begin
51
51
 
@@ -32,7 +32,7 @@ module Lolcommits
32
32
  }
33
33
  end
34
34
 
35
- def run_captureready
35
+ def run_capture_ready
36
36
  http = Net::HTTP.new(api_url.host, api_url.port)
37
37
  # http.set_debug_output $stderr # nice for debugging, never ever release with it
38
38
  http.start do |connection|
@@ -74,7 +74,7 @@ module Lolcommits
74
74
  end
75
75
 
76
76
  def api_url
77
- URI(format('http://%{api_team}.hipchat.com/v2/room/%{api_room}/share/file?auth_token=%{api_token}', symbolized_configuration))
77
+ URI(format('http://%<api_team>.hipchat.com/v2/room/%<api_room>/share/file?auth_token=%<api_token>', symbolized_configuration))
78
78
  end
79
79
 
80
80
  def symbolized_configuration
@@ -117,7 +117,7 @@ module Lolcommits
117
117
  end
118
118
 
119
119
  def self.runner_order
120
- :captureready
120
+ :capture_ready
121
121
  end
122
122
  end
123
123
  end
@@ -3,12 +3,12 @@ require 'rest_client'
3
3
  module Lolcommits
4
4
  module Plugin
5
5
  class LolProtonet < Base
6
- def initialize(runner)
6
+ def initialize(runner: nil, config: nil)
7
7
  super
8
8
  options.concat(%w(api_token api_endpoint))
9
9
  end
10
10
 
11
- def run_captureready
11
+ def run_capture_ready
12
12
  debug "Posting capture to #{configuration['endpoint']}"
13
13
  RestClient.post(
14
14
  api_url,
@@ -61,7 +61,7 @@ module Lolcommits
61
61
  end
62
62
 
63
63
  def self.runner_order
64
- :captureready
64
+ :capture_ready
65
65
  end
66
66
  end
67
67
  end
@@ -11,7 +11,7 @@ module Lolcommits
11
11
  end
12
12
 
13
13
  def self.runner_order
14
- :captureready
14
+ :capture_ready
15
15
  end
16
16
 
17
17
  def configured?
@@ -40,7 +40,7 @@ module Lolcommits
40
40
  options
41
41
  end
42
42
 
43
- def run_captureready
43
+ def run_capture_ready
44
44
  retries = RETRY_COUNT
45
45
  begin
46
46
 
@@ -11,7 +11,7 @@ module Lolcommits
11
11
  TUMBLR_CONSUMER_KEY = '2FtMEDpEPkxjoUdkpHh42h9wqTu9IVS7Ra0QyNZGixdCvhllN2'.freeze
12
12
  TUMBLR_CONSUMER_SECRET = 'qWuvxgFUR2YyWKtbWOkDTMAiBEbj7ZGaNLaNQPba0PI1N4JpBs'.freeze
13
13
 
14
- def run_captureready
14
+ def run_capture_ready
15
15
  puts 'Posting to Tumblr'
16
16
  r = client.photo(configuration['tumblr_name'], data: runner.main_image)
17
17
  if r.key?('id')
@@ -111,7 +111,7 @@ module Lolcommits
111
111
  end
112
112
 
113
113
  def self.runner_order
114
- :captureready
114
+ :capture_ready
115
115
  end
116
116
 
117
117
  protected
@@ -15,7 +15,7 @@ module Lolcommits
15
15
  end
16
16
 
17
17
  def self.runner_order
18
- :captureready
18
+ :capture_ready
19
19
  end
20
20
 
21
21
  def configured?
@@ -53,7 +53,7 @@ module Lolcommits
53
53
  options
54
54
  end
55
55
 
56
- def run_captureready
56
+ def run_capture_ready
57
57
  commit_msg = runner.message
58
58
  post = "#{commit_msg} #lolcommits"
59
59
  puts "Yammer post: #{post}" unless runner.capture_stealth
@@ -5,12 +5,12 @@ require 'json'
5
5
  module Lolcommits
6
6
  module Plugin
7
7
  class Lolsrv < Base
8
- def initialize(runner)
8
+ def initialize(runner: nil, config: nil)
9
9
  super
10
10
  options << 'server'
11
11
  end
12
12
 
13
- def run_captureready
13
+ def run_capture_ready
14
14
  fork { sync }
15
15
  end
16
16
 
@@ -51,7 +51,7 @@ module Lolcommits
51
51
  end
52
52
 
53
53
  def self.runner_order
54
- :captureready
54
+ :capture_ready
55
55
  end
56
56
  end
57
57
  end
@@ -3,7 +3,7 @@ require 'base64'
3
3
  module Lolcommits
4
4
  module Plugin
5
5
  class TermOutput < Base
6
- def run_captureready
6
+ def run_capture_ready
7
7
  if terminal_supported?
8
8
  if !runner.vcs_info || runner.vcs_info.repo.empty?
9
9
  debug 'repo is empty, skipping term output'
@@ -21,7 +21,7 @@ module Lolcommits
21
21
  end
22
22
 
23
23
  def self.runner_order
24
- :captureready
24
+ :capture_ready
25
25
  end
26
26
 
27
27
  def configure_options!
@@ -6,7 +6,7 @@ module Lolcommits
6
6
  class Uploldz < Base
7
7
  attr_accessor :endpoint
8
8
 
9
- def initialize(runner)
9
+ def initialize(runner: nil, config: nil)
10
10
  super
11
11
  options.concat(
12
12
  %w(
@@ -18,7 +18,7 @@ module Lolcommits
18
18
  )
19
19
  end
20
20
 
21
- def run_captureready
21
+ def run_capture_ready
22
22
  if !runner.vcs_info || runner.vcs_info.repo.empty?
23
23
  puts 'Repo is empty, skipping upload'
24
24
  else
@@ -58,7 +58,7 @@ module Lolcommits
58
58
  end
59
59
 
60
60
  def self.runner_order
61
- :captureready
61
+ :capture_ready
62
62
  end
63
63
  end
64
64
  end
@@ -19,7 +19,11 @@ module Lolcommits
19
19
  end
20
20
 
21
21
  def plugins_for(position)
22
- plugin_klasses.select { |p| Array(p.runner_order).include?(position) }
22
+ plugin_klasses.select do |p|
23
+ # TODO: remove (legacy support) position munging after 0.9.5 release
24
+ Array(p.runner_order).include?(position) ||
25
+ Array(p.runner_order).include?(position.to_s.delete('_').to_sym)
26
+ end
23
27
  end
24
28
 
25
29
  # @return [Lolcommits::Plugin] find first plugin matching name
@@ -29,8 +29,8 @@ module Lolcommits
29
29
  # now we're just using a simple procedural list
30
30
  def run
31
31
  # do plugins that need to happen before capture
32
- plugin_manager.plugins_for(:precapture).each do |plugin|
33
- plugin.new(self).execute_precapture
32
+ plugin_manager.plugins_for(:pre_capture).each do |plugin|
33
+ plugin.new(runner: self).execute_pre_capture
34
34
  end
35
35
 
36
36
  # do main capture to snapshot_loc
@@ -41,14 +41,14 @@ module Lolcommits
41
41
  ## resize snapshot first
42
42
  resize_snapshot!
43
43
 
44
- # execute postcapture plugins, use to alter the capture
45
- plugin_manager.plugins_for(:postcapture).each do |plugin|
46
- plugin.new(self).execute_postcapture
44
+ # execute post_capture plugins, use to alter the capture
45
+ plugin_manager.plugins_for(:post_capture).each do |plugin|
46
+ plugin.new(runner: self).execute_post_capture
47
47
  end
48
48
 
49
- # execute captureready plugins, capture is ready for export/sharing
50
- plugin_manager.plugins_for(:captureready).each do |plugin|
51
- plugin.new(self).execute_captureready
49
+ # execute capture_ready plugins, capture is ready for export/sharing
50
+ plugin_manager.plugins_for(:capture_ready).each do |plugin|
51
+ plugin.new(runner: self).execute_capture_ready
52
52
  end
53
53
 
54
54
  # clean away any tmp files
@@ -1,4 +1,4 @@
1
1
  module Lolcommits
2
- VERSION = '0.9.4'.freeze
2
+ VERSION = '0.9.5.pre1'.freeze
3
3
  GEM_NAME = 'lolcommits'.freeze
4
4
  end
@@ -18,6 +18,26 @@ Gem::Specification.new do |s|
18
18
  developers. `git blame` has never been so much fun.
19
19
  EOF
20
20
 
21
+ s.post_install_message = <<-EOF
22
+ -------------------------------------------------------------------------------
23
+
24
+ Lolcommits: quick message from the dev team! v0.9.5 extracts the Twitter plugin
25
+ into a gem. If you want to continue tweeting your lol's install and configure
26
+ the lolcommits-twitter gem - like this;
27
+
28
+ gem install lolcommits-twitter
29
+ lolcommits --config -p twitter
30
+ # confirm PIN, options and there's one new setting to auto-open the tweet URL
31
+
32
+ That's it! You can revoke the old Lolcommits app token from here:
33
+
34
+ https://twitter.com/settings/applications
35
+
36
+ Happy Lol'ing!
37
+
38
+ -------------------------------------------------------------------------------
39
+ EOF
40
+
21
41
  s.files = `git ls-files`.split("\n")
22
42
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
43
  s.executables = 'lolcommits'
@@ -42,7 +62,7 @@ Gem::Specification.new do |s|
42
62
  s.add_runtime_dependency('git', '~> 1.3.0')
43
63
 
44
64
  # built-in lolcommits plugin
45
- s.add_runtime_dependency('lolcommits-loltext')
65
+ s.add_runtime_dependency('lolcommits-loltext') # TODO: add min 0.0.4
46
66
 
47
67
  # plugin gems
48
68
  s.add_runtime_dependency('yam', '~> 2.5.0') # yammer
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lolcommits
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.5.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Rothenberg
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-04-17 00:00:00.000000000 Z
12
+ date: 2017-07-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aruba
@@ -373,7 +373,6 @@ files:
373
373
  - lib/lolcommits/plugin/lol_protonet.rb
374
374
  - lib/lolcommits/plugin/lol_slack.rb
375
375
  - lib/lolcommits/plugin/lol_tumblr.rb
376
- - lib/lolcommits/plugin/lol_twitter.rb
377
376
  - lib/lolcommits/plugin/lol_yammer.rb
378
377
  - lib/lolcommits/plugin/lolsrv.rb
379
378
  - lib/lolcommits/plugin/term_output.rb
@@ -387,7 +386,6 @@ files:
387
386
  - lolcommits.gemspec
388
387
  - test/images/test_image.jpg
389
388
  - test/lolcommits_test.rb
390
- - test/plugins_test.rb
391
389
  - vendor/ext/CommandCam/COPYING
392
390
  - vendor/ext/CommandCam/CommandCam.exe
393
391
  - vendor/ext/CommandCam/LICENSE
@@ -398,7 +396,24 @@ homepage: http://mroth.github.com/lolcommits/
398
396
  licenses:
399
397
  - LGPL-3
400
398
  metadata: {}
401
- post_install_message:
399
+ post_install_message: |2
400
+ -------------------------------------------------------------------------------
401
+
402
+ Lolcommits: quick message from the dev team! v0.9.5 extracts the Twitter plugin
403
+ into a gem. If you want to continue tweeting your lol's install and configure
404
+ the lolcommits-twitter gem - like this;
405
+
406
+ gem install lolcommits-twitter
407
+ lolcommits --config -p twitter
408
+ # confirm PIN, options and there's one new setting to auto-open the tweet URL
409
+
410
+ That's it! You can revoke the old Lolcommits app token from here:
411
+
412
+ https://twitter.com/settings/applications
413
+
414
+ Happy Lol'ing!
415
+
416
+ -------------------------------------------------------------------------------
402
417
  rdoc_options: []
403
418
  require_paths:
404
419
  - lib
@@ -409,9 +424,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
409
424
  version: '2.0'
410
425
  required_rubygems_version: !ruby/object:Gem::Requirement
411
426
  requirements:
412
- - - ">="
427
+ - - ">"
413
428
  - !ruby/object:Gem::Version
414
- version: '0'
429
+ version: 1.3.1
415
430
  requirements:
416
431
  - imagemagick
417
432
  - a webcam
@@ -1,176 +0,0 @@
1
- require 'yaml'
2
- require 'oauth'
3
- require 'simple_oauth'
4
- require 'rest_client'
5
- require 'addressable/uri'
6
-
7
- module Lolcommits
8
- module Plugin
9
- class LolTwitter < Base
10
- TWITTER_API_ENDPOINT = 'https://api.twitter.com'.freeze
11
- TWITTER_CONSUMER_KEY = 'qc096dJJCxIiqDNUqEsqQ'.freeze
12
- TWITTER_CONSUMER_SECRET = 'rvjNdtwSr1H0TvBvjpk6c4bvrNydHmmbvv7gXZQI'.freeze
13
- TWITTER_RESERVED_MEDIA_CHARS = 24
14
- TWITTER_RETRIES = 2
15
- TWITTER_PIN_REGEX = /^\d{4,}$/ # 4 or more digits
16
- DEFAULT_SUFFIX = '#lolcommits'.freeze
17
-
18
- def run_captureready
19
- tweet = build_tweet(runner.message)
20
-
21
- attempts = 0
22
- begin
23
- attempts += 1
24
- puts "Tweeting: #{tweet}"
25
- debug "--> Tweeting! (attempt: #{attempts}, tweet length: #{tweet.length} chars)"
26
- post_tweet(tweet, File.open(runner.main_image, 'r'))
27
- rescue StandardError => e
28
- debug "Tweet FAILED! #{e.class} - #{e.message}"
29
- retry if attempts < TWITTER_RETRIES
30
- puts "ERROR: Tweet FAILED! (after #{attempts} attempts) - #{e.message}"
31
- end
32
- end
33
-
34
- def post_url
35
- # TODO: this endpoint is deprecated, use the new approach instead
36
- # https://dev.twitter.com/rest/reference/post/statuses/update_with_mediath_media
37
- @post_url ||= TWITTER_API_ENDPOINT + '/1.1/statuses/update_with_media.json'
38
- end
39
-
40
- def post_tweet(status, media)
41
- RestClient.post(
42
- post_url,
43
- {
44
- 'media[]' => media,
45
- 'status' => status
46
- }, Authorization: oauth_header
47
- )
48
- end
49
-
50
- def build_tweet(commit_message)
51
- prefix = config_with_default('prefix', '')
52
- suffix = " #{config_with_default('suffix', DEFAULT_SUFFIX)}"
53
- prefix = "#{prefix} " unless prefix.empty?
54
-
55
- available_commit_msg_size = max_tweet_size - (prefix.length + suffix.length)
56
- if commit_message.length > available_commit_msg_size
57
- commit_message = "#{commit_message[0..(available_commit_msg_size - 3)]}..."
58
- end
59
-
60
- "#{prefix}#{commit_message}#{suffix}"
61
- end
62
-
63
- def configure_options!
64
- options = super
65
- # ask user to configure tokens if enabling
66
- if options['enabled']
67
- auth_config = configure_auth!
68
- return unless auth_config
69
- options = options.merge(auth_config).merge(configure_prefix_suffix)
70
- end
71
- options
72
- end
73
-
74
- def configure_auth!
75
- puts '---------------------------'
76
- puts 'Need to grab twitter tokens'
77
- puts '---------------------------'
78
-
79
- request_token = oauth_consumer.get_request_token
80
- rtoken = request_token.token
81
- rsecret = request_token.secret
82
-
83
- print "\n1) Please open this url in your browser to get a PIN for lolcommits:\n\n"
84
- puts request_token.authorize_url
85
- print "\n2) Enter PIN, then press enter: "
86
- twitter_pin = gets.strip.downcase.to_s
87
-
88
- unless twitter_pin =~ TWITTER_PIN_REGEX
89
- puts "\nERROR: '#{twitter_pin}' is not a valid Twitter Auth PIN"
90
- return
91
- end
92
-
93
- begin
94
- debug "Requesting Twitter OAuth Token with PIN: #{twitter_pin}"
95
- OAuth::RequestToken.new(oauth_consumer, rtoken, rsecret)
96
- access_token = request_token.get_access_token(oauth_verifier: twitter_pin)
97
- rescue OAuth::Unauthorized
98
- puts "\nERROR: Twitter PIN Auth FAILED!"
99
- return
100
- end
101
-
102
- return unless access_token.token && access_token.secret
103
- puts ''
104
- puts '------------------------------'
105
- puts 'Thanks! Twitter Auth Succeeded'
106
- puts '------------------------------'
107
- {
108
- 'access_token' => access_token.token,
109
- 'secret' => access_token.secret
110
- }
111
- end
112
-
113
- def configure_prefix_suffix
114
- print "\n3) Prefix all tweets with something? e.g. @user (leave blank for no prefix): "
115
- prefix = gets.strip
116
- print "\n4) End all tweets with something? e.g. #hashtag (leave blank for default suffix #{DEFAULT_SUFFIX}): "
117
- suffix = gets.strip
118
-
119
- config = {}
120
- config['prefix'] = prefix unless prefix.empty?
121
- config['suffix'] = suffix unless suffix.empty?
122
- config
123
- end
124
-
125
- def configured?
126
- !configuration['enabled'].nil? &&
127
- configuration['access_token'] &&
128
- configuration['secret']
129
- end
130
-
131
- def oauth_header
132
- uri = Addressable::URI.parse(post_url)
133
- SimpleOAuth::Header.new(:post, uri, {}, oauth_credentials)
134
- end
135
-
136
- def oauth_credentials
137
- {
138
- consumer_key: TWITTER_CONSUMER_KEY,
139
- consumer_secret: TWITTER_CONSUMER_SECRET,
140
- token: configuration['access_token'],
141
- token_secret: configuration['secret']
142
- }
143
- end
144
-
145
- def oauth_consumer
146
- @oauth_consumer ||= OAuth::Consumer.new(
147
- TWITTER_CONSUMER_KEY,
148
- TWITTER_CONSUMER_SECRET,
149
- site: TWITTER_API_ENDPOINT,
150
- request_endpoint: TWITTER_API_ENDPOINT,
151
- sign_in: true
152
- )
153
- end
154
-
155
- def config_with_default(key, default = nil)
156
- if configuration[key]
157
- configuration[key].strip.empty? ? default : configuration[key]
158
- else
159
- default
160
- end
161
- end
162
-
163
- def max_tweet_size
164
- 139 - TWITTER_RESERVED_MEDIA_CHARS
165
- end
166
-
167
- def self.name
168
- 'twitter'
169
- end
170
-
171
- def self.runner_order
172
- :captureready
173
- end
174
- end
175
- end
176
- end
@@ -1,40 +0,0 @@
1
- require 'coveralls'
2
- Coveralls.wear!
3
-
4
- require 'minitest/autorun'
5
- require 'ffaker'
6
-
7
- # Loads lolcommits directly from the lib folder so don't have to create
8
- # a gem before testing
9
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
10
- $LOAD_PATH.unshift(File.dirname(__FILE__))
11
- require 'lolcommits'
12
-
13
- include Lolcommits
14
-
15
- class PluginsTest < MiniTest::Test
16
- def test_lol_twitter_build_tweet
17
- # issue #136, https://github.com/mroth/lolcommits/issues/136
18
- long_commit_message = FFaker::Lorem.sentence(500)
19
- plugin = Lolcommits::Plugin::LolTwitter.new(nil)
20
- max_tweet_size = 116
21
- suffix = '... #lolcommits'
22
-
23
- Lolcommits::Plugin::LolTwitter.send(:define_method, :max_tweet_size, proc { max_tweet_size })
24
- Lolcommits::Plugin::LolTwitter.send(:define_method, :configuration, proc { {} })
25
- assert_equal "#{long_commit_message[0..(max_tweet_size - suffix.length)]}#{suffix}", plugin.build_tweet(long_commit_message)
26
- end
27
-
28
- def test_lol_twitter_prefix_suffix
29
- plugin = Lolcommits::Plugin::LolTwitter.new(nil)
30
- Lolcommits::Plugin::LolTwitter.send(:define_method, :max_tweet_size, proc { 116 })
31
- assert_match 'commit msg #lolcommits', plugin.build_tweet('commit msg')
32
-
33
- plugin_config = {
34
- 'prefix' => '@prefixing!',
35
- 'suffix' => '#suffixing!'
36
- }
37
- Lolcommits::Plugin::LolTwitter.send(:define_method, :configuration, proc { plugin_config })
38
- assert_equal '@prefixing! commit msg #suffixing!', plugin.build_tweet('commit msg')
39
- end
40
- end