lolcommits 0.9.2 → 0.9.3.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +6 -0
  3. data/CHANGELOG.md +243 -105
  4. data/CONTRIBUTING.md +2 -2
  5. data/README.md +10 -3
  6. data/bin/lolcommits +9 -16
  7. data/features/step_definitions/lolcommits_steps.rb +0 -1
  8. data/features/support/env.rb +0 -1
  9. data/features/support/path_helpers.rb +0 -1
  10. data/lib/core_ext/mini_magick/utilities.rb +0 -1
  11. data/lib/lolcommits.rb +16 -16
  12. data/lib/lolcommits/backends/git_info.rb +0 -1
  13. data/lib/lolcommits/backends/installation_git.rb +0 -1
  14. data/lib/lolcommits/backends/installation_mercurial.rb +0 -1
  15. data/lib/lolcommits/backends/mercurial_info.rb +0 -1
  16. data/lib/lolcommits/capturer.rb +0 -1
  17. data/lib/lolcommits/capturer/capture_cygwin.rb +0 -1
  18. data/lib/lolcommits/capturer/capture_fake.rb +0 -1
  19. data/lib/lolcommits/capturer/capture_linux.rb +0 -1
  20. data/lib/lolcommits/capturer/capture_linux_animated.rb +0 -1
  21. data/lib/lolcommits/capturer/capture_mac.rb +0 -1
  22. data/lib/lolcommits/capturer/capture_mac_animated.rb +0 -1
  23. data/lib/lolcommits/capturer/capture_windows.rb +0 -1
  24. data/lib/lolcommits/cli/fatals.rb +0 -8
  25. data/lib/lolcommits/cli/launcher.rb +0 -1
  26. data/lib/lolcommits/cli/process_runner.rb +0 -2
  27. data/lib/lolcommits/cli/timelapse_gif.rb +0 -1
  28. data/lib/lolcommits/configuration.rb +10 -7
  29. data/lib/lolcommits/gem_plugin.rb +46 -0
  30. data/lib/lolcommits/installation.rb +0 -1
  31. data/lib/lolcommits/platform.rb +0 -1
  32. data/lib/lolcommits/plugin/base.rb +110 -0
  33. data/lib/lolcommits/plugin/dot_com.rb +50 -0
  34. data/lib/lolcommits/plugin/lol_flowdock.rb +69 -0
  35. data/lib/lolcommits/plugin/lol_hipchat.rb +124 -0
  36. data/lib/lolcommits/plugin/lol_protonet.rb +68 -0
  37. data/lib/lolcommits/plugin/lol_slack.rb +68 -0
  38. data/lib/lolcommits/plugin/lol_tumblr.rb +129 -0
  39. data/lib/lolcommits/plugin/lol_twitter.rb +176 -0
  40. data/lib/lolcommits/plugin/lol_yammer.rb +84 -0
  41. data/lib/lolcommits/plugin/lolsrv.rb +58 -0
  42. data/lib/lolcommits/plugin/loltext.rb +190 -0
  43. data/lib/lolcommits/plugin/term_output.rb +55 -0
  44. data/lib/lolcommits/{plugins → plugin}/tranzlate.rb +14 -15
  45. data/lib/lolcommits/plugin/uploldz.rb +65 -0
  46. data/lib/lolcommits/plugin_manager.rb +48 -0
  47. data/lib/lolcommits/runner.rb +4 -5
  48. data/lib/lolcommits/test_helpers/fake_io.rb +20 -0
  49. data/lib/lolcommits/test_helpers/git_repo.rb +44 -0
  50. data/lib/lolcommits/vcs_info.rb +0 -1
  51. data/lib/lolcommits/version.rb +2 -2
  52. data/lolcommits.gemspec +2 -2
  53. data/test/lolcommits_test.rb +1 -2
  54. data/test/plugins_test.rb +7 -8
  55. metadata +22 -19
  56. data/lib/core_ext/class.rb +0 -8
  57. data/lib/lolcommits/plugin.rb +0 -123
  58. data/lib/lolcommits/plugins/dot_com.rb +0 -51
  59. data/lib/lolcommits/plugins/lol_flowdock.rb +0 -70
  60. data/lib/lolcommits/plugins/lol_hipchat.rb +0 -125
  61. data/lib/lolcommits/plugins/lol_protonet.rb +0 -69
  62. data/lib/lolcommits/plugins/lol_slack.rb +0 -69
  63. data/lib/lolcommits/plugins/lol_tumblr.rb +0 -129
  64. data/lib/lolcommits/plugins/lol_twitter.rb +0 -176
  65. data/lib/lolcommits/plugins/lol_yammer.rb +0 -85
  66. data/lib/lolcommits/plugins/lolsrv.rb +0 -58
  67. data/lib/lolcommits/plugins/loltext.rb +0 -184
  68. data/lib/lolcommits/plugins/term_output.rb +0 -54
  69. data/lib/lolcommits/plugins/uploldz.rb +0 -66
data/CONTRIBUTING.md CHANGED
@@ -22,7 +22,7 @@ ensure Ruby style guidelines. If you want to run tests before conforming to this
22
22
  to verify functionality, just run `rake test` and `rake features` manually.
23
23
 
24
24
  With a passing test suite, commit your changes, push and submit a new [Pull
25
- Request](https://github.com/mroth/lolcomits/compare/):
25
+ Request](https://github.com/mroth/lolcommits/compare/):
26
26
 
27
27
  git commit -am 'Added some feature'
28
28
  git push origin my-new-feature
@@ -34,7 +34,7 @@ request gets accepted:
34
34
 
35
35
  * Explain what your are doing (and why) in your Pull Request description.
36
36
  * If you are fixing an
37
- [issue](https://github.com/mroth/lolcomits/issues), link to
37
+ [issue](https://github.com/mroth/lolcommits/issues), link to
38
38
  it in your description and [mention
39
39
  it](https://help.github.com/articles/closing-issues-via-commit-messages/) in
40
40
  the commit message.
data/README.md CHANGED
@@ -40,7 +40,7 @@ makes this easy.
40
40
 
41
41
  brew install imagemagick
42
42
 
43
- Then install the gem with:
43
+ Then install with:
44
44
 
45
45
  [sudo] gem install lolcommits
46
46
 
@@ -51,7 +51,7 @@ If [Boxen](https://boxen.github.com) is your thing, [try
51
51
  this](https://github.com/AssuredLabor/puppet-lolcommits).
52
52
 
53
53
  Lolcommits v0.8.1 was the last release to support Ruby < 2.0. If you'd like to
54
- use this gem on older rubies try:
54
+ use this program on older rubies try:
55
55
 
56
56
  [sudo] gem install lolcommits --version 0.8.1 # for Ruby 1.9
57
57
  [sudo] gem install lolcommits --version 0.7.0 # for Ruby 1.8
@@ -68,7 +68,7 @@ For Ubuntu 14.04 or newer, you need to manually install ffmpeg since it no
68
68
  longer ships with the default Ubuntu sources. [Downloads for
69
69
  ffmpeg](http://ffmpeg.org/download.html)
70
70
 
71
- Then install the gem with:
71
+ Then install with:
72
72
 
73
73
  gem install lolcommits
74
74
 
@@ -209,3 +209,10 @@ issue](https://github.com/mroth/lolcommits/issues) (and please take a little
209
209
  time to check if we haven't [already
210
210
  addressed](https://github.com/mroth/lolcommits/issues?q=is%3Aissue+is%3Aclosed)
211
211
  it).
212
+
213
+
214
+ ## License
215
+
216
+ The program is available as open source under the terms of
217
+ [LGPL-3](https://opensource.org/licenses/LGPL-3.0).
218
+
data/bin/lolcommits CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- # -*- encoding: utf-8 -*-
3
2
 
4
3
  begin
5
4
  require 'lolcommits'
@@ -37,6 +36,9 @@ class App
37
36
  debug 'Outputting at DEBUG verbosity'
38
37
  end
39
38
 
39
+ # TODO: move to a better place
40
+ load_plugins
41
+
40
42
  if options[:'show-config']
41
43
  puts configuration
42
44
  elsif options[:plugins]
@@ -123,6 +125,12 @@ class App
123
125
  options[:debug] || ENV['LOLCOMMITS_DEBUG'] || false
124
126
  end
125
127
 
128
+ def self.load_plugins
129
+ pm = Lolcommits::PluginManager.new
130
+ pm.locate_plugins
131
+ pm.load_plugins
132
+ end
133
+
126
134
  def self.device_list_help
127
135
  'Specify a device with --device "{device name}" or set the LOLCOMMITS_DEVICE env variable'
128
136
  end
@@ -196,16 +204,6 @@ class App
196
204
  capture_animate > 0
197
205
  end
198
206
 
199
- # TODO: remove this after implementing gem based plugins
200
- # https://github.com/mroth/lolcommits/issues/99
201
- # Until then for local plugin dev, use $LOLCOMMITS_DIR/.plugins directory
202
- def self.load_local_plugins!
203
- plugins_dir = Configuration.loldir_for('.plugins')
204
- Dir.glob("#{plugins_dir}/*.rb").each do |plugin|
205
- load plugin
206
- end
207
- end
208
-
209
207
  #
210
208
  # change working dir to either a repo or the fs root
211
209
  #
@@ -223,10 +221,5 @@ class App
223
221
  end
224
222
  end
225
223
 
226
- #
227
- # load plugins
228
- #
229
- load_local_plugins!
230
-
231
224
  go!
232
225
  end
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  require 'fileutils'
3
2
  require 'aruba/api'
4
3
 
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  require 'aruba/cucumber'
3
2
  require 'methadone/cucumber'
4
3
  require 'open3'
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  require 'fileutils'
3
2
  require 'aruba/api'
4
3
  require 'lolcommits/platform'
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  # To maintain MiniMagick compatibility on Windows for v3.8.1 we need this patch
3
2
  # If/when we upgrade MiniMagick to 4.2+ this patch can be removed
4
3
  # We are locked at v3.8.1 since MiniMagick 4+ dropped support for Ruby 1.8.7
data/lib/lolcommits.rb CHANGED
@@ -1,7 +1,5 @@
1
- # -*- encoding : utf-8 -*-
2
1
  $LOAD_PATH.unshift File.expand_path('.')
3
2
 
4
- require 'core_ext/class'
5
3
  require 'mini_magick'
6
4
  require 'core_ext/mini_magick/utilities'
7
5
  require 'fileutils'
@@ -17,8 +15,9 @@ require 'lolcommits/configuration'
17
15
  require 'lolcommits/capturer'
18
16
  require 'lolcommits/vcs_info'
19
17
  require 'lolcommits/installation'
20
- require 'lolcommits/plugin'
21
18
  require 'lolcommits/platform'
19
+ require 'lolcommits/gem_plugin'
20
+ require 'lolcommits/plugin_manager'
22
21
 
23
22
  # after lolcommits/platform, so that we can do platform-conditional override
24
23
  require 'core_ext/mercurial-ruby/command'
@@ -29,19 +28,20 @@ require 'lolcommits/backends/installation_mercurial'
29
28
  require 'lolcommits/backends/git_info'
30
29
  require 'lolcommits/backends/mercurial_info'
31
30
 
32
- require 'lolcommits/plugins/loltext'
33
- require 'lolcommits/plugins/dot_com'
34
- require 'lolcommits/plugins/tranzlate'
35
- require 'lolcommits/plugins/lol_twitter'
36
- require 'lolcommits/plugins/uploldz'
37
- require 'lolcommits/plugins/term_output'
38
- require 'lolcommits/plugins/lolsrv'
39
- require 'lolcommits/plugins/lol_yammer'
40
- require 'lolcommits/plugins/lol_protonet'
41
- require 'lolcommits/plugins/lol_tumblr'
42
- require 'lolcommits/plugins/lol_slack'
43
- require 'lolcommits/plugins/lol_flowdock'
44
- require 'lolcommits/plugins/lol_hipchat'
31
+ require 'lolcommits/plugin/base'
32
+ require 'lolcommits/plugin/loltext'
33
+ require 'lolcommits/plugin/dot_com'
34
+ require 'lolcommits/plugin/tranzlate'
35
+ require 'lolcommits/plugin/lol_twitter'
36
+ require 'lolcommits/plugin/uploldz'
37
+ require 'lolcommits/plugin/term_output'
38
+ require 'lolcommits/plugin/lolsrv'
39
+ require 'lolcommits/plugin/lol_yammer'
40
+ require 'lolcommits/plugin/lol_protonet'
41
+ require 'lolcommits/plugin/lol_tumblr'
42
+ require 'lolcommits/plugin/lol_slack'
43
+ require 'lolcommits/plugin/lol_flowdock'
44
+ require 'lolcommits/plugin/lol_hipchat'
45
45
 
46
46
  # require runner after all the plugins have been required
47
47
  require 'lolcommits/runner'
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class GitInfo < VCSInfo
4
3
  attr_accessor :sha, :message, :repo_internal_path, :repo, :url,
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  #
4
3
  # Methods to handle enabling and disabling of lolcommits
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  #
4
3
  # Methods to handle enabling and disabling of lolcommits
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class MercurialInfo < VCSInfo
4
3
  attr_accessor :sha, :message, :repo_internal_path, :repo, :url,
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class Capturer
4
3
  attr_accessor :capture_device, :capture_delay, :snapshot_location,
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class CaptureCygwin < Capturer
4
3
  def capture
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class CaptureFake < Capturer
4
3
  def capture
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class CaptureLinux < Capturer
4
3
  MPLAYER_FPS = 25
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class CaptureLinuxAnimated < Capturer
4
3
  def capture
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class CaptureMac < Capturer
4
3
  def capture_device_string
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class CaptureMacAnimated < Capturer
4
3
  def capture
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  class CaptureWindows < Capturer
4
3
  def capture
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  require 'lolcommits/platform'
3
2
  require 'methadone'
4
3
 
@@ -28,13 +27,6 @@ module Lolcommits
28
27
  end
29
28
  end
30
29
 
31
- # make sure we can find the default font
32
- unless File.readable? Lolcommits::Loltext::DEFAULT_FONT_PATH
33
- fatal "Couldn't properly read Impact font from gem package, "\
34
- 'please file a bug?!'
35
- exit 1
36
- end
37
-
38
30
  # make sure imagemagick is around and good to go
39
31
  unless Platform.valid_imagemagick_installed?
40
32
  fatal 'FATAL: ImageMagick does not appear to be properly installed!'\
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  require 'launchy'
3
2
 
4
3
  module Lolcommits
@@ -1,5 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
1
  module Lolcommits
4
2
  module CLI
5
3
  # Helper class for forking lolcommits process to the background (or not).
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  require 'lolcommits/cli/fatals'
3
2
 
4
3
  require 'mini_magick'
@@ -1,5 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
-
3
1
  module Lolcommits
4
2
  class Configuration
5
3
  LOLCOMMITS_BASE = ENV['LOLCOMMITS_DIR'] || File.join(ENV['HOME'], '.lolcommits')
@@ -14,6 +12,8 @@ module Lolcommits
14
12
 
15
13
  def read_configuration
16
14
  return unless File.exist?(configuration_file)
15
+ # TODO: change to safe_load when Ruby 2.0.0 support drops
16
+ # YAML.safe_load(File.open(configuration_file), [Symbol])
17
17
  YAML.load(File.open(configuration_file))
18
18
  end
19
19
 
@@ -68,31 +68,34 @@ module Lolcommits
68
68
  end
69
69
 
70
70
  def plugins_list
71
- "Available plugins: \n * #{Lolcommits::Runner.plugins.map(&:name).join("\n * ")}"
71
+ "Available plugins: \n * #{Lolcommits::Runner.plugins.map(&:name).sort.join("\n * ")}"
72
72
  end
73
73
 
74
74
  def ask_for_plugin_name
75
75
  puts plugins_list
76
76
  print 'Name of plugin to configure: '
77
- STDIN.gets.strip
77
+ gets.strip
78
78
  end
79
79
 
80
- def find_plugin(plugin_name)
80
+ def find_plugin(plugin_name_option)
81
+ plugin_name = plugin_name_option.empty? ? ask_for_plugin_name : plugin_name_option
82
+
81
83
  Lolcommits::Runner.plugins.each do |plugin|
82
84
  return plugin.new(nil) if plugin.name == plugin_name
83
85
  end
84
86
 
85
87
  puts "Unable to find plugin: '#{plugin_name}'"
88
+ return if plugin_name_option.empty?
86
89
  puts plugins_list
87
90
  end
88
91
 
89
92
  def do_configure!(plugin_name)
90
93
  $stdout.sync = true
91
- plugin_name = ask_for_plugin_name if plugin_name.to_s.strip.empty?
92
94
 
93
- plugin = find_plugin(plugin_name)
95
+ plugin = find_plugin(plugin_name.to_s.strip)
94
96
  return unless plugin
95
97
  config = read_configuration || {}
98
+ plugin_name = plugin.class.name
96
99
  plugin_config = plugin.configure_options!
97
100
  # having a plugin_config, means configuring went OK
98
101
  if plugin_config
@@ -0,0 +1,46 @@
1
+ module Lolcommits
2
+ class GemPlugin
3
+ attr_accessor :name, :gem_name, :spec, :required
4
+
5
+ def initialize(name, gem_name, spec)
6
+ @name = name
7
+ @gem_name = gem_name
8
+ @spec = spec
9
+ @required = false
10
+ end
11
+
12
+ # activate the plugin (require the gem - enables/loads the plugin
13
+ # immediately at point of call if not already required)
14
+ def activate!
15
+ begin
16
+ require gem_path unless required?
17
+ rescue LoadError => e
18
+ warn "Found plugin #{gem_name}, but could not require '#{gem_name}'"
19
+ warn e
20
+ rescue => e
21
+ warn "require '#{gem_name}' # Failed, saying: #{e}"
22
+ end
23
+
24
+ self.required = true
25
+ end
26
+
27
+ alias required? required
28
+
29
+ def supported?
30
+ # false if the plugin gem does not support this version of Lolcommits
31
+ lolcommits_version = Gem::Version.new(::Lolcommits::VERSION)
32
+ spec.dependencies.each do |dependency|
33
+ if dependency.name == Lolcommits::GEM_NAME
34
+ return dependency.requirement.satisfied_by?(lolcommits_version)
35
+ end
36
+ end
37
+ true
38
+ end
39
+
40
+ private
41
+
42
+ def gem_path
43
+ gem_name.gsub(/-|_/, '/')
44
+ end
45
+ end
46
+ end
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  module Lolcommits
3
2
  #
4
3
  # Methods to handle enabling and disabling of lolcommits
@@ -1,4 +1,3 @@
1
- # -*- encoding : utf-8 -*-
2
1
  require 'mini_magick'
3
2
  require 'rbconfig'
4
3
 
@@ -0,0 +1,110 @@
1
+ module Lolcommits
2
+ module Plugin
3
+ class Base
4
+ attr_accessor :runner, :options
5
+
6
+ def initialize(runner)
7
+ self.runner = runner
8
+ self.options = ['enabled']
9
+ end
10
+
11
+ def execute_precapture
12
+ return unless valid_configuration?
13
+ return unless enabled?
14
+ debug 'I am enabled, about to run precapture'
15
+ run_precapture
16
+ end
17
+
18
+ def execute_postcapture
19
+ return unless valid_configuration?
20
+ return unless enabled?
21
+ debug 'I am enabled, about to run postcapture'
22
+ run_postcapture
23
+ end
24
+
25
+ def run_precapture; end
26
+
27
+ def run_postcapture; end
28
+
29
+ def configuration
30
+ config = runner.config.read_configuration if runner
31
+ return {} unless config
32
+ config[self.class.name] || {}
33
+ end
34
+
35
+ # ask for plugin options
36
+ def configure_options!
37
+ puts "Configuring plugin: #{self.class.name}\n"
38
+ options.reduce({}) do |acc, option|
39
+ print "#{option}: "
40
+ val = parse_user_input(gets.strip)
41
+ # check enabled option isn't a String
42
+ if (option == 'enabled') && ![true, false].include?(val)
43
+ puts "Aborting - please respond with 'true' or 'false'"
44
+ exit 1
45
+ else
46
+ acc.merge(option => val)
47
+ end
48
+ end
49
+ end
50
+
51
+ def parse_user_input(str)
52
+ # cater for bools, strings, ints and blanks
53
+ if 'true'.casecmp(str).zero?
54
+ true
55
+ elsif 'false'.casecmp(str).zero?
56
+ false
57
+ elsif str =~ /^[0-9]+$/
58
+ str.to_i
59
+ elsif str.strip.empty?
60
+ nil
61
+ else
62
+ str
63
+ end
64
+ end
65
+
66
+ def enabled?
67
+ configuration['enabled'] == true
68
+ end
69
+
70
+ # check config is valid
71
+ def valid_configuration?
72
+ configured?
73
+ end
74
+
75
+ # empty plugin configuration
76
+ def configured?
77
+ !configuration.empty?
78
+ end
79
+
80
+ # uniform puts for plugins
81
+ # dont puts if the runner wants to be silent (stealth mode)
82
+ def puts(*args)
83
+ return if runner && runner.capture_stealth
84
+ super(args)
85
+ end
86
+
87
+ # helper to log errors with a message via debug
88
+ def log_error(e, message)
89
+ debug message
90
+ debug e.backtrace.join("\n")
91
+ end
92
+
93
+ # uniform debug logging for plugins
94
+ def debug(msg)
95
+ super("#{self.class}: " + msg)
96
+ end
97
+
98
+ # identifying plugin name (for config, listing)
99
+ def self.name
100
+ 'plugin'
101
+ end
102
+
103
+ # a plugin requests to be run by the runner in one of these positions
104
+ # valid options are [:precapture, :postcapture]
105
+ def self.runner_order
106
+ nil
107
+ end
108
+ end
109
+ end
110
+ end