lolcommits 0.9.2 → 0.9.3.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.
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
@@ -1,8 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- class Class
3
- def subclasses
4
- result = []
5
- ObjectSpace.each_object(Class) { |klass| result << klass if klass < self }
6
- result
7
- end
8
- end
@@ -1,123 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- module Lolcommits
3
- class Plugin
4
- attr_accessor :runner, :options
5
-
6
- def initialize(runner)
7
- debug 'Initializing'
8
- self.runner = runner
9
- self.options = ['enabled']
10
- end
11
-
12
- def execute_precapture
13
- if enabled?
14
- debug 'I am enabled, about to run precapture'
15
- run_precapture
16
- else
17
- debug 'Disabled, doing nothing for precapture execution'
18
- end
19
- end
20
-
21
- def execute_postcapture
22
- if enabled?
23
- debug 'I am enabled, about to run postcapture'
24
- run_postcapture
25
- else
26
- debug 'Disabled, doing nothing for postcapture execution'
27
- end
28
- end
29
-
30
- def run_precapture
31
- debug 'base plugin, does nothing to anything'
32
- end
33
-
34
- def run_postcapture
35
- debug 'base plugin, does nothing to anything'
36
- end
37
-
38
- def configuration
39
- config = runner.config.read_configuration if runner
40
- return {} unless config
41
- config[self.class.name] || {}
42
- end
43
-
44
- # ask for plugin options
45
- def configure_options!
46
- puts "Configuring plugin: #{self.class.name}\n"
47
- options.reduce({}) do |acc, option|
48
- print "#{option}: "
49
- val = parse_user_input(STDIN.gets.strip)
50
- # check enabled option isn't a String
51
- if (option == 'enabled') && ![true, false].include?(val)
52
- puts "Aborting - please respond with 'true' or 'false'"
53
- exit 1
54
- else
55
- acc.merge(option => val)
56
- end
57
- end
58
- end
59
-
60
- def parse_user_input(str)
61
- # cater for bools, strings, ints and blanks
62
- if 'true'.casecmp(str).zero?
63
- true
64
- elsif 'false'.casecmp(str).zero?
65
- false
66
- elsif str =~ /^[0-9]+$/
67
- str.to_i
68
- elsif str.strip.empty?
69
- nil
70
- else
71
- str
72
- end
73
- end
74
-
75
- def enabled?
76
- configuration['enabled'] == true
77
- end
78
-
79
- # check config is valid
80
- def valid_configuration?
81
- if configured?
82
- true
83
- else
84
- puts "Missing #{self.class.name} config - configure with: lolcommits --config -p #{self.class.name}"
85
- false
86
- end
87
- end
88
-
89
- # empty plugin configuration
90
- def configured?
91
- !configuration.empty?
92
- end
93
-
94
- # uniform puts for plugins
95
- # dont puts if the runner wants to be silent (stealth mode)
96
- def puts(*args)
97
- return if runner && runner.capture_stealth
98
- super(args)
99
- end
100
-
101
- # helper to log errors with a message via debug
102
- def log_error(e, message)
103
- debug message
104
- debug e.backtrace.join("\n")
105
- end
106
-
107
- # uniform debug logging for plugins
108
- def debug(msg)
109
- super("Plugin: #{self.class}: " + msg)
110
- end
111
-
112
- # identifying plugin name (for config, listing)
113
- def self.name
114
- 'plugin'
115
- end
116
-
117
- # a plugin requests to be run by the runner in one of the possible positions.
118
- # valid options are [:precapture, :postcapture]
119
- def self.runner_order
120
- nil
121
- end
122
- end
123
- end
@@ -1,51 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- require 'httmultiparty'
3
-
4
- module Lolcommits
5
- class DotCom < Plugin
6
- BASE_URL = 'http://lolcommits-dot-com.herokuapp.com'.freeze
7
-
8
- def initialize(runner)
9
- super
10
- options.concat(%w(api_key api_secret repo_id))
11
- end
12
-
13
- def run_postcapture
14
- return unless valid_configuration?
15
-
16
- t = Time.now.to_i.to_s
17
- HTTMultiParty.post(
18
- "#{BASE_URL}/git_commits.json",
19
- body: {
20
- git_commit: {
21
- sha: runner.sha,
22
- repo_external_id: configuration['repo_id'],
23
- image: File.open(runner.main_image),
24
- raw: File.open(runner.snapshot_loc)
25
- },
26
-
27
- key: configuration['api_key'],
28
- t: t,
29
- token: Digest::SHA1.hexdigest(configuration['api_secret'] + t)
30
- }
31
- )
32
- rescue => e
33
- log_error(e, "ERROR: HTTMultiParty POST FAILED #{e.class} - #{e.message}")
34
- end
35
-
36
- def configured?
37
- !configuration['enabled'].nil? &&
38
- configuration['api_key'] &&
39
- configuration['api_secret'] &&
40
- configuration['repo_id']
41
- end
42
-
43
- def self.name
44
- 'dot_com'
45
- end
46
-
47
- def self.runner_order
48
- :postcapture
49
- end
50
- end
51
- end
@@ -1,70 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- require 'rest_client'
3
-
4
- module Lolcommits
5
- class LolFlowdock < Plugin
6
- ENDPOINT_URL = 'api.flowdock.com/flows/'.freeze
7
- RETRY_COUNT = 2
8
-
9
- def self.name
10
- 'flowdock'
11
- end
12
-
13
- def self.runner_order
14
- :postcapture
15
- end
16
-
17
- def configured?
18
- !configuration['access_token'].nil?
19
- end
20
-
21
- def configure
22
- print "Open the URL below and issue a token for your user (Personal API token):\n"
23
- print "https://flowdock.com/account/tokens\n"
24
- print "Enter the generated token below, then press enter: \n"
25
- code = STDIN.gets.to_s.strip
26
- print "Enter the machine name of the flow you want to post to from this repo.\n"
27
- print "Go to https://www.flowdock.com/account and click Flows, then click the flow, then get the machine name from the URL:\n"
28
- flow = STDIN.gets.to_s.strip.downcase
29
- print "Enter the name of the organization for this Flowdock account.\n"
30
- organization = STDIN.gets.to_s.strip.downcase
31
-
32
- {
33
- 'access_token' => code,
34
- 'flow' => flow,
35
- 'organization' => organization
36
- }
37
- end
38
-
39
- def configure_options!
40
- options = super
41
- if options['enabled']
42
- config = configure
43
- options.merge!(config)
44
- end
45
- options
46
- end
47
-
48
- def run_postcapture
49
- return unless valid_configuration?
50
-
51
- retries = RETRY_COUNT
52
- begin
53
-
54
- endpoint = 'https://' + configuration['access_token'] + '@' + ENDPOINT_URL + configuration['organization'] + '/' + configuration['flow'] + '/messages'
55
- response = RestClient.post(
56
- endpoint,
57
- event: 'file',
58
- content: File.new(runner.main_image)
59
- )
60
- debug response
61
- rescue => e
62
- retries -= 1
63
- retry if retries > 0
64
- puts "Posting to flowdock failed - #{e.message}"
65
- puts 'Try running config again:'
66
- puts "\tlolcommits --config --plugin flowdock"
67
- end
68
- end
69
- end
70
- end
@@ -1,125 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- module Lolcommits
3
- class LolHipchat < Plugin
4
- def configure_options!
5
- options = super
6
- options.merge! configure_auth_options if options['enabled']
7
- options
8
- end
9
-
10
- def configure_auth_options
11
- puts '-' * 50
12
- puts ' Lolcommits HipChat Plugin Configuration'
13
- puts '-' * 50
14
-
15
- puts '1.) I need your Team Name '
16
- puts 'teamname as in teamname.hipchat.com, without .hipchat.com'
17
- print 'Your Teamname: '
18
- teamname = STDIN.gets.to_s.strip
19
- puts "2.) We need a Authentication Token, get yours at https://#{teamname}.hipchat.com/account/api"
20
- puts 'make sure to select scope "Send Message"'
21
- print 'Your auth_token: '
22
- token = STDIN.gets.to_s.strip
23
- puts '3.) Which Room should be we post to?'
24
- puts 'can be a id or name'
25
- print 'Your Room: '
26
- room = STDIN.gets.to_s.strip
27
-
28
- {
29
- 'api_token' => token,
30
- 'api_team' => teamname,
31
- 'api_room' => room
32
- }
33
- end
34
-
35
- def run_postcapture
36
- return unless valid_configuration?
37
-
38
- http = Net::HTTP.new(api_url.host, api_url.port)
39
- # http.set_debug_output $stderr # nice for debugging, never ever release with it
40
- http.start do |connection|
41
- header = { 'Content-Type' => 'multipart/related; boundary=0123456789ABLEWASIEREISAWELBA9876543210' }
42
- data = [message_part, picture_part].map do |part|
43
- "--0123456789ABLEWASIEREISAWELBA9876543210\r\n#{part}"
44
- end.join('') << '--0123456789ABLEWASIEREISAWELBA9876543210--'
45
- connection.post("#{api_url.path}?#{api_url.query}", data, header)
46
- end
47
- end
48
-
49
- def message_part
50
- [
51
- 'Content-Type: application/json; charset=UTF-8',
52
- 'Content-Disposition: attachment; name="metadata"',
53
- '',
54
- message_json,
55
- ''
56
- ].join "\r\n"
57
- end
58
-
59
- def message_json
60
- { message: message }.to_json.force_encoding('utf-8')
61
- end
62
-
63
- def picture_part
64
- mime_type = MIME::Types.type_for(picture.path)[0] || MIME::Types['application/octet-stream'][0]
65
- [
66
- format('Content-Type: %s', mime_type.simplified),
67
- format('Content-Disposition: attachment; name="file"; filename="%s"', picture.path),
68
- '',
69
- "#{picture.read} ",
70
- ''
71
- ].join "\r\n"
72
- end
73
-
74
- def picture
75
- @picture ||= File.new(runner.main_image)
76
- end
77
-
78
- def api_url
79
- URI(format('http://%{api_team}.hipchat.com/v2/room/%{api_room}/share/file?auth_token=%{api_token}', symbolized_configuration))
80
- end
81
-
82
- def symbolized_configuration
83
- @symbolized_configuration ||= configuration.each_with_object({}) { |(k, v), obj| obj[k.to_sym] = v }
84
- end
85
-
86
- def message
87
- "commited some #{random_adjective} #{random_object} to #{runner.vcs_info.repo}@#{runner.sha} (#{runner.vcs_info.branch}) "
88
- end
89
-
90
- def random_object
91
- objects = %w(screws bolts exceptions errors cookies)
92
-
93
- objects.sample
94
- end
95
-
96
- def random_adjective
97
- adjectives = %w(adaptable adventurous affable affectionate agreeable ambitious amiable amicable amusing brave \
98
- bright broad-minded calm careful charming communicative compassionate conscientious considerate \
99
- convivial courageous courteous creative decisive determined diligent diplomatic discreet dynamic \
100
- easygoing emotional energetic enthusiastic exuberant fair-minded faithful fearless forceful \
101
- frank friendly funny generous gentle good gregarious hard-working helpful honest humorous \
102
- imaginative impartial independent intellectual intelligent intuitive inventive kind loving loyal \
103
- modest neat nice optimistic passionate patient persistent pioneering philosophical placid plucky \
104
- polite powerful practical pro-active quick-witted quiet rational reliable reserved resourceful \
105
- romantic self-confident self-disciplined sensible sensitive shy sincere sociable straightforward \
106
- sympathetic thoughtful tidy tough unassuming understanding versatile warmhearted willing witty)
107
- adjectives.sample
108
- end
109
-
110
- def configured?
111
- super &&
112
- configuration['api_token'] &&
113
- configuration['api_team'] &&
114
- configuration['api_room']
115
- end
116
-
117
- def self.name
118
- 'hipchat'
119
- end
120
-
121
- def self.runner_order
122
- :postcapture
123
- end
124
- end
125
- end
@@ -1,69 +0,0 @@
1
- # -*- encoding : utf-8 -*-
2
- require 'rest_client'
3
-
4
- module Lolcommits
5
- class LolProtonet < Plugin
6
- def initialize(runner)
7
- super
8
- options.concat(%w(api_token api_endpoint))
9
- end
10
-
11
- def run_postcapture
12
- return unless valid_configuration?
13
-
14
- debug "Posting capture to #{configuration['endpoint']}"
15
- RestClient.post(
16
- api_url,
17
- {
18
- files: [File.new(runner.main_image)],
19
- message: message
20
- },
21
- 'X-Protonet-Token' => configuration['api_token']
22
- )
23
- end
24
-
25
- def api_url
26
- configuration['api_endpoint']
27
- end
28
-
29
- def message
30
- "commited some #{random_adjective} #{random_object} to #{runner.vcs_info.repo}@#{runner.sha} (#{runner.vcs_info.branch}) "
31
- end
32
-
33
- def random_object
34
- objects = %w(screws bolts exceptions errors cookies)
35
-
36
- objects.sample
37
- end
38
-
39
- def random_adjective
40
- adjectives = [
41
- 'awesome', 'great', 'interesting', 'cool', 'EPIC', 'gut', 'good', 'pansy',
42
- 'powerful', 'boring', 'quirky', 'untested', 'german', 'iranian', 'neutral', 'crazy', 'well tested',
43
- 'jimmy style', 'nasty', 'bibliographical (we received complaints about the original wording)',
44
- 'bombdiggidy', 'narly', 'spiffy', 'smashing', 'xing style',
45
- 'leo apotheker style', 'black', 'white', 'yellow', 'shaggy', 'tasty', 'mind bending', 'JAY-Z',
46
- 'Kanye (the best ever)', '* Toby Keith was here *', 'splendid', 'stupendulous',
47
- '(freedom fries!)', '[vote RON PAUL]', '- these are not my glasses -', 'typical pansy',
48
- '- ze goggles zey do nothing! -', 'almost working', 'legen- wait for it -', '-dairy!',
49
- ' - Tavonius would be proud of this - ', 'Meg FAILMAN!', '- very brofessional of you -',
50
- 'heartbleeding', 'juciy', 'supercalifragilisticexpialidocious', 'failing', 'loving'
51
- ]
52
- adjectives.sample
53
- end
54
-
55
- def configured?
56
- !configuration['enabled'].nil? &&
57
- configuration['api_token'] &&
58
- configuration['api_endpoint']
59
- end
60
-
61
- def self.name
62
- 'lolprotonet'
63
- end
64
-
65
- def self.runner_order
66
- :postcapture
67
- end
68
- end
69
- end