lolcommits 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OTgyMzJkN2VlNzkyODQ1NDdkMWQwM2U3ZjY3NTdmZGNhNDQxNDY1OQ==
4
+ MWEyZjJjMzUxNGE1N2M3ZTI0ZTc5N2ExZmI1OWQwYTRjZGNiZjliZg==
5
5
  data.tar.gz: !binary |-
6
- ZmM0OTJjZmY5MDY2OGNjNzYxNDZjYTM0NzFlZmY4NjkwN2Y4ZGI3MA==
6
+ NDlkNDQyNDk3NmQzOTRmNTRkMjQ4ZmQ1YmNmMDQ2MDRhMmUzNjkzZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YTVhNDFhYTE5NzZlMTM1ZGNmNmM2YzI1NTY0Nzk5NWI1ZjU1NGE3MTRjZmVm
10
- NTdhMmQyYzI2NTQ0NzIwMGU4ODc3YjMxOGQ4MTA0MTYzYzZmOThmMTljMDcx
11
- OTE2ZThlZWQ3ZjExMmVlNmIzNWE1OWQ5MjNiZTdhNjIyZTY3ZDU=
9
+ ZmQ1ZTQ3ZDZlNDE1NDNjMzc0YjU4NTQzMDdhNzJjZGUzMDExMTBmNDVlNmM2
10
+ MTUwNzIzOTgzNjUyMDhmOTQ4Nzk4MGU1NzA4NWM5ZjdmMzc0ZTdmYTA1YjZh
11
+ ODExYTUxNDJjOTZjMDQ0MWZiNmU5OTNjZTA1ZDA5YmEwMTA1NzU=
12
12
  data.tar.gz: !binary |-
13
- MjVhZDM2ZGU3OGE3MzdkNzE0NmMyNzJmZWVkYTRhMjNjNGYyM2JiNDQ3YjUy
14
- NzljMmQ0NDE3MGI2ZmVmMDdkZDE4MWViZTljODczZTU3YjlhMGQ2ODNiNjU3
15
- YzFkNGQxMzJhMzRhMTBhYjMyMDE4NjM3ZTE0ZjVhYmNiMGU5Mjc=
13
+ OTk0NGNlY2Y4MTZiNDhiNTNhODRhOTRhODNmNjRmMDAyNjI4NmNjYTY1N2Ez
14
+ NTdjZTE3ZjJhZDQ1NTAwMThiYTY4MDJiMTQ2N2EyYjA2NWY3ZjVjNWFhZDgw
15
+ OWVlZjQ5ZjdjNDdlOGJkZTE0N2M4ODgyNjk3Nzc0YmM4NzkzOWY=
data/.gitignore CHANGED
@@ -11,3 +11,4 @@ html
11
11
  tmp
12
12
  *.swp
13
13
  *.swo
14
+ vendor/bundle
@@ -5,6 +5,7 @@ rvm:
5
5
  - 1.9.3
6
6
  - 2.0.0
7
7
  - 2.1.0
8
+ - 2.1.2
8
9
 
9
10
  before_install:
10
11
  # use earlier version of Rubygems to avoid fatal bundler error on 1.8.7
@@ -34,4 +35,5 @@ deploy:
34
35
  gem: lolcommits
35
36
  on:
36
37
  tags: true
38
+ all_branches: true
37
39
  repo: mroth/lolcommits
data/CHANGELOG CHANGED
@@ -1,5 +1,16 @@
1
- 0.x.x (in development)
2
- * TODO: figure out problems with GUI clients
1
+ 0.5.6 (in development)
2
+ * update gems!
3
+ * prepare plugins for extraction
4
+
5
+ 0.5.5 (29 September 2014)
6
+ * Animated gif capture support (@theY4Kman #226)
7
+ * Fix plugin config issues with user input (@matthutchinson #225 #223)
8
+ * Fix Linux FPS timing issues (@matthutchinson #215)
9
+ * Fix hook enable/disable issue (@matthutchinson #206)
10
+ * Fix Git GUI issues (@matthutchinson #196 #168 #193 #188 #159 #133 #123 #119 #104 #83)
11
+ * Mention Boxen script in README (@matthutchinson #208)
12
+ * Explain global Git hooks how-to in README (@matthutchinson #212 #112)
13
+ * Minor improvments to Linux Capturer (@matthutchinson)
3
14
 
4
15
  0.5.4 (13 April 2014)
5
16
  * Excluded vendor/bundle from rubocop cops (@matthutchinson)
data/README.md CHANGED
@@ -1,72 +1,114 @@
1
1
  # lolcommits (git + webcam = lol)
2
2
 
3
- lolcommits takes a snapshot with your webcam every time you git commit code, and archives a lolcat style image with it.
4
- Git blame has never been so much fun.
3
+ lolcommits takes a snapshot with your webcam every time you git commit code, and
4
+ archives a lolcat style image with it. Git blame has never been so much fun.
5
5
 
6
- By default, the lolimages are stored by a Github style short SHA in a `~/.lolcommits` directory created for you.
6
+ By default, the lol images are stored by a Github style short SHA in a
7
+ `~/.lolcommits` directory created for you.
7
8
 
8
- [![Gem Version](https://badge.fury.io/rb/lolcommits.png)](http://badge.fury.io/rb/lolcommits)
9
- [![Build Status](https://secure.travis-ci.org/mroth/lolcommits.png?branch=master)](http://travis-ci.org/mroth/lolcommits)
10
- [![Dependency Status](https://gemnasium.com/mroth/lolcommits.png)](https://gemnasium.com/mroth/lolcommits)
11
- [![Coverage Status](https://coveralls.io/repos/mroth/lolcommits/badge.png)](https://coveralls.io/r/mroth/lolcommits)
9
+ [![Gem Version](http://img.shields.io/gem/v/lolcommits.svg?style=flat)](https://rubygems.org/gems/lolcommits)
10
+ [![Build Status](http://img.shields.io/travis/mroth/lolcommits.svg?style=flat)](https://travis-ci.org/mroth/lolcommits)
11
+ [![Dependency Status](http://img.shields.io/gemnasium/mroth/lolcommits.svg?style=flat)](https://gemnasium.com/mroth/lolcommits)
12
+ [![CodeClimate Status](http://img.shields.io/codeclimate/github/mroth/lolcommits.svg?style=flat)](https://codeclimate.com/github/mroth/lolcommits)
13
+ [![Coverage Status](http://img.shields.io/coveralls/mroth/lolcommits.svg?style=flat)](https://coveralls.io/r/mroth/lolcommits)
12
14
 
13
15
  ## Sample images
16
+
14
17
  <img src="http://blog.mroth.info/images/postcontent/yearinsideprojects/lolcommits_users2.jpg" />
15
18
 
16
- Please add your own lolcommit! Add to the [People Using Lolcommits](https://github.com/mroth/lolcommits/wiki/Lolcommits-from-around-the-world%21) page on the Wiki.
19
+ Please add your own lolcommit! Add to the [People Using
20
+ Lolcommits](https://github.com/mroth/lolcommits/wiki/Lolcommits-from-around-the-world%21)
21
+ page on our wiki.
17
22
 
18
23
  ## Installation
24
+
19
25
  ### Mac OS X
20
- You'll need ImageMagick installed. [Homebrew](http://mxcl.github.com/homebrew/) makes this easy. Simply do:
26
+
27
+ You'll need ImageMagick installed. [Homebrew](http://mxcl.github.com/homebrew/)
28
+ makes this easy. Simply do:
21
29
 
22
30
  brew install imagemagick
23
31
 
24
- Then simply do:
32
+ Then install the gem with:
25
33
 
26
34
  [sudo] gem install lolcommits
27
35
 
28
- (If you're using RVM, you can/should probably omit the sudo, but the default MacOSX Ruby install is dumb and requires it.)
36
+ If you're using RVM (or rbenv), you can/should probably omit the sudo, but the
37
+ default MacOSX Ruby install is dumb and requires it.
38
+
39
+ If [Boxen](https://boxen.github.com) is your thing, [try
40
+ this](https://github.com/AssuredLabor/puppet-lolcommits).
29
41
 
30
42
  ### Linux
31
- Install dependencies using your package manager of choice, for example in Ubuntu:
43
+
44
+ Install dependencies using your package manager of choice, for example in
45
+ Ubuntu:
32
46
 
33
47
  sudo apt-get install mplayer imagemagick libmagickwand-dev
34
48
 
35
- Then install the lolcommits gem:
49
+ Then install the gem with:
36
50
 
37
51
  gem install lolcommits
38
52
 
39
- For more details, see [Installing on Linux](https://github.com/mroth/lolcommits/wiki/Installing-on-Linux).
53
+ For more details, see [Installing on
54
+ Linux](https://github.com/mroth/lolcommits/wiki/Installing-on-Linux).
55
+
56
+ ### Windows - here be dragons!
40
57
 
41
- ### Windows
42
- Here be dragons! It all works but you'll need some more detailed instructions to get the dependencies installed. See the wiki page for [Installing on Windows](https://github.com/mroth/lolcommits/wiki/Installing-on-Windows).
58
+ It all works but you'll need some more detailed instructions to get the
59
+ dependencies installed. See the wiki page for [Installing on
60
+ Windows](https://github.com/mroth/lolcommits/wiki/Installing-on-Windows).
43
61
 
44
62
  ## Usage
63
+
45
64
  ### Enabling and basic usage
46
- From within any git repository, simply do a `lolcommits --enable`. From that point on, any git commit will automatically trigger a lolcommit capture! All lolcommits are stored in `~/.lolcommits` by default, placed in a subdirectory by project name, and with a filename matching the commit hash.
47
65
 
48
- Don't worry about it too much, half the fun of lolcommits is forgetting it's installed!
66
+ From within any git repository, simply do a `lolcommits --enable`. From that
67
+ point on, any git commit will automatically trigger a lolcommit capture! All
68
+ lolcommits are stored in `~/.lolcommits` by default, placed in a subdirectory by
69
+ project name, and with a filename matching the commit hash.
70
+
71
+ You can also enable lolcommits across all your local git repos. Follow [these
72
+ steps](https://github.com/mroth/lolcommits/wiki/Enabling-Lolcommits-for-all-your-Git-Repositories)
73
+ to achieve this using `git init` and the `init.templatedir` setting.
74
+
75
+ Don't worry about it too much, half the fun of lolcommits is forgetting it's
76
+ installed!
49
77
 
50
78
  ### Other commands
51
- Ok, if you insist... Since you know about `--enable`, common sense suggests there is also a repository specific `--disable`, hopefully you can guess what that does. Other handy common commands include `--last`, which will open for display your most recent lolcommit image, or `--browse`, which pops open the directory containing all the lolcommit images for your current repository. You can always do `--help` for a full list of available commands.
52
79
 
53
- **NOTE**: Any extra arguments you pass with the --enable command are auto-appended to the git-commit capture command. For example;
80
+ Ok, if you insist... Since you know about `--enable`, common sense suggests
81
+ there is also a repository specific `--disable`, hopefully you can guess what
82
+ that does. Other handy common commands include `--last`, which will open for
83
+ display your most recent lolcommit image, or `--browse`, which pops open the
84
+ directory containing all the lolcommit images for your current repository. You
85
+ can always do `--help` for a full list of available commands.
86
+
87
+ **NOTE**: Any extra arguments you pass with the --enable command are
88
+ auto-appended to the git-commit capture command. For example;
54
89
 
55
90
  lolcommits --enable --delay=5 --animate=4 --fork
56
91
 
57
- Will configure capturing of an animated gif (4 secs) after a 5 sec delay in a forked process. See the section below for more capture configuration variables.
92
+ Will configure capturing of an animated gif (4 secs) after a 5 sec delay in a
93
+ forked process. See the section below for more capture configuration variables.
58
94
 
59
95
  ### Capture configuration variables
60
- lolcommits has some capture options for additional lulz. You can enable these via environment variables like so;
96
+
97
+ lolcommits has some capture options for additional lulz. You can enable these
98
+ via environment variables like so;
61
99
 
62
100
  * `LOLCOMMITS_DEVICE` set a webcam device - **mac and linux only**
63
- * `LOLCOMMITS_ANIMATE` (in seconds) set time for capturing an animated gif - **mac only & requires ffmpeg**
64
- * `LOLCOMMITS_DELAY` (in seconds) set delay persistently (for slow webcams to warmup)
101
+ * `LOLCOMMITS_ANIMATE` (in seconds) set time for capturing an animated gif -
102
+ **requires ffmpeg**
103
+ * `LOLCOMMITS_DELAY` (in seconds) set delay persistently (for slow webcams to
104
+ warmup)
65
105
  * `LOLCOMMITS_FONT` set font file location for lolcommit text
66
- * `LOLCOMMITS_FORK` fork lolcommit runner (capture command forks to a new process, speedily returning you to your terminal)
106
+ * `LOLCOMMITS_FORK` fork lolcommit runner (capture command forks to a new
107
+ process, speedily returning you to your terminal)
67
108
  * `LOLCOMMITS_STEALTH` disable notification messages at commit time
68
109
 
69
- Or they can be set via the following arguments in the capture command (located in your repository's `.git/hooks/post-commit` file).
110
+ Or they can be set via the following arguments in the capture command (located
111
+ in your repository's `.git/hooks/post-commit` file).
70
112
 
71
113
  * `--device=DEVICE` or `-d DEVICE`
72
114
  * `--animate=SECONDS` or `-a SECONDS`
@@ -75,26 +117,54 @@ Or they can be set via the following arguments in the capture command (located i
75
117
  * `--fork`
76
118
  * `--stealth`
77
119
 
78
- Use `lolcommits --devices` to list all attached video devices available for capturing. Read how to [configure commit capturing](https://github.com/mroth/lolcommits/wiki/Configure-Commit-Capturing) for more details.
120
+ Use `lolcommits --devices` to list all attached video devices available for
121
+ capturing. Read how to [configure commit
122
+ capturing](https://github.com/mroth/lolcommits/wiki/Configure-Commit-Capturing)
123
+ for more details.
79
124
 
80
125
  ### Animated Gif Capturing
81
- Animated gifs (Mac/OSX only) can take a while to generate (depending on the number of seconds you capture and the capabilities of your machine). `ffmpeg` is required and can be installed with brew like so;
82
126
 
83
- brew install ffmpeg
127
+ Animated gifs can take a while to generate (depending on the number of seconds
128
+ you capture and the capabilities of your machine).
129
+ [ffmpeg](https://www.ffmpeg.org) is required and can be installed like so;
130
+
131
+ * Linux - [follow this guide](https://www.ffmpeg.org/download.html#build-linux)
132
+ * OSX - `brew install ffmpeg`
84
133
 
85
- To enable, just set the `LOLCOMMITS_ANIMATE` environment variable with the number of seconds to capture.
86
- And like regular image captures you can use the env variables `LOLCOMMITS_DEVICE` and `LOLCOMMITS_DELAY` to change the capture device or delay time (seconds) before capturing.
87
- If you find capturing an animated gif takes too long, try setting the `LOLCOMMITS_FORK=true` env variable.
134
+ To enable, just set the `LOLCOMMITS_ANIMATE` environment variable with the
135
+ number of seconds to capture. Like regular image captures you can use the env
136
+ variables `LOLCOMMITS_DEVICE` and `LOLCOMMITS_DELAY` to change the capture
137
+ device or delay time (seconds) before capturing.
88
138
 
89
- ![Example animated lolcommit gif](http://cdn2.usa.bugleblogs.com/blogs/000/000/003/de0eb9aa695.gif "Example animated lolcommit gif")
139
+ If you find capturing an animated gif takes too long, try setting the
140
+ `LOLCOMMITS_FORK=true` env variable. Animated gif captures are currently NOT
141
+ supported on Windows.
142
+
143
+ ![Example animated lolcommit
144
+ gif](http://cdn2.usa.bugleblogs.com/blogs/000/000/003/de0eb9aa695.gif "Example
145
+ animated lolcommit gif")
90
146
 
91
147
  ### Plugins
92
- There are a growing amount of plugins for lolcommits to enable things like Twitter upload, translating your commit messages to lolspeak, etc. Check them out on the [plugins page](https://github.com/mroth/lolcommits/wiki/Configuring-Plugins).
148
+
149
+ There are a growing amount of plugins for lolcommits to enable things like
150
+ Twitter upload, translating your commit messages to lolspeak, etc. Check them
151
+ out on the [plugins
152
+ page](https://github.com/mroth/lolcommits/wiki/Configuring-Plugins).
93
153
 
94
154
  ## Troubles?
95
- Started a [FAQ](https://github.com/mroth/lolcommits/wiki/FAQ). Or take a read through the the [wiki](https://github.com/mroth/lolcommits/wiki)
155
+
156
+ Try our trouble-shooting [FAQ](https://github.com/mroth/lolcommits/wiki/FAQ), or
157
+ take a read through our [wiki](https://github.com/mroth/lolcommits/wiki) for
158
+ more information. If you think something is broken or missing, raise a [GitHub
159
+ issue](https://github.com/mroth/lolcommits/issues) (and please take a little
160
+ time to check if we haven't [already
161
+ addressed](https://github.com/mroth/lolcommits/issues?q=is%3Aissue+is%3Aclosed)
162
+ it).
96
163
 
97
164
  ## Timelapse?
98
- To watch your face as it decays while you program, you can create a quick mpeg of all your lolcommits snapshots (if you have `imagemagick` and `ffmpeg` installed):
165
+
166
+ To watch your face as it decays while you program, you can create a quick mpeg
167
+ of all your lolcommits snapshots (if you have `imagemagick` and `ffmpeg`
168
+ installed):
99
169
 
100
170
  convert `find . -type f -name "*.jpg" -print0 | xargs -0 ls -tlr | awk '{print $9}'` timelapse.mpeg
@@ -170,10 +170,10 @@ def do_gif
170
170
 
171
171
  case Choice.choices[:gif]
172
172
  when 'today'
173
- lolimages = configuration.images_today
173
+ lolimages = configuration.jpg_images_today
174
174
  filename = "#{Date.today.to_s}.gif"
175
175
  else
176
- lolimages = configuration.images
176
+ lolimages = configuration.jpg_images
177
177
  filename = 'archive.gif'
178
178
  end
179
179
 
@@ -12,8 +12,8 @@ Feature: Basic UI functionality
12
12
  |--animate|which is optional|
13
13
  |-a |which is optional|
14
14
 
15
- Scenario: Help should not show the animate option on a Linux plaftorm
16
- Given I am using a "Linux" platform
15
+ Scenario: Help should not show the animate option on a Windows plaftorm
16
+ Given I am using a "Windows" platform
17
17
  When I get help for "lolcommits"
18
18
  Then the output should not match /\-a\, \-\-animate\=SECONDS/
19
19
 
@@ -45,7 +45,7 @@ Feature: Basic UI functionality
45
45
  And the "loltest" repository "post-commit" hook has content "#!/bin/ruby"
46
46
  When I cd to "loltest"
47
47
  And I run `lolcommits --enable`
48
- Then the output should contain "doesn't start with with a good shebang"
48
+ Then the output should contain "doesn't start with a good shebang"
49
49
  And the file ".git/hooks/post-commit" should not contain "lolcommits --capture"
50
50
  And the exit status should be 1
51
51
 
@@ -6,23 +6,24 @@ require 'mini_magick'
6
6
  require 'fileutils'
7
7
  require 'git'
8
8
  require 'open3'
9
- require 'active_support/inflector'
10
- require 'active_support/concern'
11
- require 'active_support/callbacks'
12
9
  require 'methadone'
13
10
  require 'date'
14
11
 
15
12
  require 'lolcommits/version'
16
13
  require 'lolcommits/configuration'
14
+
17
15
  require 'lolcommits/capturer'
18
- require 'lolcommits/capture_mac'
19
- require 'lolcommits/capture_mac_animated'
20
- require 'lolcommits/capture_linux'
21
- require 'lolcommits/capture_windows'
22
- require 'lolcommits/capture_cygwin'
23
- require 'lolcommits/capture_fake'
16
+ require 'lolcommits/capturer/capture_mac'
17
+ require 'lolcommits/capturer/capture_mac_animated'
18
+ require 'lolcommits/capturer/capture_linux'
19
+ require 'lolcommits/capturer/capture_linux_animated'
20
+ require 'lolcommits/capturer/capture_windows'
21
+ require 'lolcommits/capturer/capture_cygwin'
22
+ require 'lolcommits/capturer/capture_fake'
23
+
24
24
  require 'lolcommits/git_info'
25
25
  require 'lolcommits/installation'
26
+
26
27
  require 'lolcommits/plugin'
27
28
  require 'lolcommits/plugins/loltext'
28
29
  require 'lolcommits/plugins/dot_com'
@@ -1,6 +1,8 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module Lolcommits
3
3
  class CaptureLinux < Capturer
4
+ MPLAYER_FPS = 25
5
+
4
6
  def capture_device_string
5
7
  @capture_device.nil? ? nil : "-tv device=\"#{@capture_device}\""
6
8
  end
@@ -13,27 +15,31 @@ module Lolcommits
13
15
  delay = if capture_delay != 0 then capture_delay else 1 end
14
16
 
15
17
  # There's no way to give a capture delay in mplayer, but a number of frame
16
- # mplayer's "delay" is actually a number of frames at 25fps
18
+ # mplayer's "delay" is actually a number of frames at 25 fps
17
19
  # multiply the set value (in seconds) by 25
18
- frames = delay.to_i * 25
20
+ frames = delay.to_i * MPLAYER_FPS
19
21
 
20
22
  debug 'LinuxCapturer: calling out to mplayer to capture image'
21
23
  # mplayer's output is ugly and useless, let's throw it away
22
- _, r, _ = Open3.popen3("#{executable_path} -vo jpeg:outdir=#{tmpdir} #{capture_device_string} -frames #{frames} tv://")
24
+ _, r, _ = Open3.popen3("mplayer -vo jpeg:outdir=#{tmpdir} #{capture_device_string} -frames #{frames} -fps #{MPLAYER_FPS} tv://")
23
25
  # looks like we still need to read the output for something to happen
24
26
  r.read
25
27
 
26
- # the below SHOULD tell FileUtils actions to post their output if we are in debug mode
27
- include FileUtils::Verbose if logger.level == 0
28
-
29
28
  debug 'LinuxCapturer: calling out to mplayer to capture image'
30
- FileUtils.mv(tmpdir + '/%08d.jpg' % frames, snapshot_location)
31
- debug 'LinuxCapturer: cleaning up'
32
- FileUtils.rm_rf(tmpdir)
33
- end
34
29
 
35
- def executable_path
36
- 'mplayer'
30
+ # get last frame from tmpdir (regardless of fps)
31
+ all_frames = Dir.glob("#{tmpdir}/*.jpg").sort_by do |f|
32
+ File.mtime(f)
33
+ end
34
+
35
+ if all_frames.empty?
36
+ debug 'LinuxCapturer: failed to capture any image'
37
+ else
38
+ FileUtils.mv(all_frames.last, snapshot_location)
39
+ debug 'LinuxCapturer: cleaning up'
40
+ end
41
+
42
+ FileUtils.rm_rf(tmpdir)
37
43
  end
38
44
  end
39
45
  end
@@ -0,0 +1,71 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Lolcommits
3
+ class CaptureLinuxAnimated < Capturer
4
+ def capture
5
+ # make a fresh frames directory
6
+ FileUtils.rm_rf(frames_location)
7
+ FileUtils.mkdir_p(frames_location)
8
+
9
+ # capture the raw video with ffmpeg video4linux2
10
+ system_call "ffmpeg -v quiet -y -f video4linux2 -video_size 320x240 -i #{capture_device_string} -t #{capture_duration} #{video_location} > /dev/null"
11
+ if File.exists?(video_location)
12
+ # convert raw video to png frames with ffmpeg
13
+ system_call "ffmpeg #{capture_delay_string} -v quiet -i #{video_location} -t #{animated_duration} #{frames_location}/%09d.png > /dev/null"
14
+
15
+ # use fps to set delay and number of frames to skip (for lower filesized gifs)
16
+ fps = video_fps(video_location)
17
+ skip = frame_skip(fps)
18
+ delay = frame_delay(fps, skip)
19
+ debug "Capturer: anaimated gif choosing every #{skip} frames with a frame delay of #{delay}"
20
+
21
+ # create the looping animated gif from frames (picks nth frame with seq)
22
+ seq_command = "seq -f #{frames_location}/%09g.png 1 #{skip} #{Dir["#{frames_location}/*"].length}"
23
+ # convert to animated gif with delay and gif optimisation
24
+ system_call "convert -layers OptimizeTransparency -delay #{delay} -loop 0 `#{seq_command}` -coalesce #{snapshot_location} > /dev/null"
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def system_call(call_str, capture_output = false)
31
+ debug "Capturer: making system call for \n #{call_str}"
32
+ capture_output ? `#{call_str}` : system(call_str)
33
+ end
34
+
35
+ def frame_delay(fps, skip)
36
+ # calculate frame delay
37
+ delay = ((100.0 * skip) / fps.to_f).to_i
38
+ delay < 6 ? 6 : delay # hard limit for IE browsers
39
+ end
40
+
41
+ def video_fps(file)
42
+ # inspect fps of the captured video file (default to 29.97)
43
+ fps = system_call("ffmpeg -i #{file} 2>&1 | sed -n \"s/.*, \\(.*\\) fp.*/\\1/p\"", true)
44
+ fps.to_i < 1 ? 29.97 : fps.to_f
45
+ end
46
+
47
+ def frame_skip(fps)
48
+ # of frames to skip depends on movie fps
49
+ case (fps)
50
+ when 0..15
51
+ 2
52
+ when 16..28
53
+ 3
54
+ else
55
+ 4
56
+ end
57
+ end
58
+
59
+ def capture_device_string
60
+ capture_device || '/dev/video0'
61
+ end
62
+
63
+ def capture_delay_string
64
+ " -ss #{capture_delay}" if capture_delay.to_i > 0
65
+ end
66
+
67
+ def capture_duration
68
+ animated_duration.to_i + capture_delay.to_i
69
+ end
70
+ end
71
+ end
@@ -6,6 +6,11 @@ module Lolcommits
6
6
  end
7
7
 
8
8
  def capture
9
+ # TODO: check we have a webcam we can capture from first. See issue #219
10
+ # operating laptop in clamshell (lid closed) from 2nd desktop screen,
11
+ # needs to better handle the capturer (imagesnap, videosnap
12
+ # CommandCam, mplayer) return code or check with an option before
13
+ # attempting capture. Alt solution is puttin in prompt mode option :(
9
14
  call_str = "#{executable_path} -q \"#{snapshot_location}\" -w #{capture_delay} #{capture_device_string}"
10
15
  debug "Capturer: making system call for #{call_str}"
11
16
  system(call_str)
@@ -1,7 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module Lolcommits
3
3
  class Configuration
4
- LOLBASEDIR = ENV['LOLCOMMITS_DIR'] || File.join(ENV['HOME'], '.lolcommits')
4
+ LOLCOMMITS_BASE = ENV['LOLCOMMITS_DIR'] || File.join(ENV['HOME'], '.lolcommits')
5
5
  LOLCOMMITS_ROOT = File.join(File.dirname(__FILE__), '../..')
6
6
  attr_writer :loldir
7
7
 
@@ -25,10 +25,8 @@ module Lolcommits
25
25
 
26
26
  def loldir
27
27
  return @loldir if @loldir
28
-
29
28
  basename ||= File.basename(Git.open('.').dir.to_s).sub(/^\./, 'dot')
30
29
  basename.sub!(/ /, '-')
31
-
32
30
  @loldir = Configuration.loldir_for(basename)
33
31
  end
34
32
 
@@ -41,15 +39,15 @@ module Lolcommits
41
39
  end
42
40
 
43
41
  def most_recent
44
- Dir.glob(File.join self.loldir, '*.jpg').max_by { |f| File.mtime(f) }
42
+ Dir.glob(File.join self.loldir, '*.{jpg,gif}').max_by { |f| File.mtime(f) }
45
43
  end
46
44
 
47
- def images
45
+ def jpg_images
48
46
  Dir.glob(File.join self.loldir, '*.jpg').sort_by { |f| File.mtime(f) }
49
47
  end
50
48
 
51
- def images_today
52
- images.select { |f| Date.parse(File.mtime(f).to_s) === Date.today }
49
+ def jpg_images_today
50
+ jpg_images.select { |f| Date.parse(File.mtime(f).to_s) === Date.today }
53
51
  end
54
52
 
55
53
  def raw_image(image_file_type = 'jpg')
@@ -152,9 +150,19 @@ module Lolcommits
152
150
  end
153
151
 
154
152
  def self.loldir_for(basename)
155
- loldir = File.join(LOLBASEDIR, basename)
156
-
157
- if not File.directory? loldir
153
+ loldir = File.join(LOLCOMMITS_BASE, basename)
154
+
155
+ if File.directory? loldir
156
+ begin
157
+ # ensure 755 permissions for loldir
158
+ File.chmod(0755, loldir)
159
+ rescue Errno::EPERM
160
+ # abort if permissions cannot be met
161
+ puts "FATAL: directory '#{loldir}' should be present and writeable by user '#{ENV['USER']}'"
162
+ puts 'Try changing the directory permissions to 755'
163
+ exit 1
164
+ end
165
+ else
158
166
  FileUtils.mkdir_p loldir
159
167
  end
160
168
  loldir
@@ -201,19 +209,22 @@ module Lolcommits
201
209
  end
202
210
 
203
211
  def self.can_animate?
204
- platform == 'Mac'
212
+ ['Mac', 'Linux'].include? platform
205
213
  end
206
214
 
207
215
  # Cross-platform way of finding an executable in the $PATH.
208
- # idea taken from http://bit.ly/qDaTbY
216
+ # idea taken from http://bit.ly/qDaTbY, if only_path is true, only the path
217
+ # is returned (not the path and command)
209
218
  #
210
219
  # which('ruby') #=> /usr/bin/ruby
211
- def self.command_which(cmd)
220
+ def self.command_which(cmd, only_path = false)
212
221
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
213
222
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
214
223
  exts.each do |ext|
215
224
  exe = "#{path}/#{cmd}#{ext}"
216
- return exe if File.executable? exe
225
+ if File.executable? exe
226
+ return only_path ? path : exe
227
+ end
217
228
  end
218
229
  end
219
230
  nil
@@ -21,19 +21,29 @@ module Lolcommits
21
21
  Dir.mkdir(HOOK_DIR)
22
22
  end
23
23
 
24
- # clear away any existing lolcommits hook
24
+ # should add a shebang (or not) adding will rewrite hook file
25
+ add_shebang = false
25
26
  if hook_file_exists?
27
+ # clear away any existing lolcommits hook
26
28
  remove_existing_hook! if lolcommits_hook_exists?
27
29
 
28
- # check for a good shebang line in the existing hook
29
- unless good_shebang?
30
- warn "the existing hook (at #{HOOK_PATH}) doesn't start with with a good shebang; like #!/bin/sh"
30
+ # if file is empty we should add a shebang (and rewrite hook)
31
+ if File.read(HOOK_PATH).strip.empty?
32
+ add_shebang = true
33
+ elsif !good_shebang?
34
+ # look for good shebang in existing hook, abort if none found
35
+ warn "the existing hook (at #{HOOK_PATH}) doesn't start with a good shebang; like #!/bin/sh"
31
36
  exit 1
32
37
  end
38
+ else
39
+ add_shebang = true
33
40
  end
34
41
 
35
- File.open(HOOK_PATH, hook_file_exists? ? 'a' : 'w') do |f|
36
- f.write(hook_script(!hook_file_exists?))
42
+ File.open(HOOK_PATH, add_shebang ? 'w' : 'a') do |f|
43
+ if add_shebang
44
+ f.write("#!/bin/sh\n")
45
+ end
46
+ f.write(hook_script)
37
47
  end
38
48
 
39
49
  FileUtils.chmod 0755, HOOK_PATH
@@ -65,17 +75,17 @@ module Lolcommits
65
75
  protected
66
76
 
67
77
  def self.hook_script(add_shebang = true)
68
- shebang = add_shebang ? "#!/bin/sh\n\n" : ''
69
- ruby_path = Lolcommits::Configuration.command_which('ruby')
70
- hook_export = "export PATH=\"#{ruby_path}:$PATH\"\n" if ruby_path
78
+ ruby_path = Lolcommits::Configuration.command_which('ruby', true)
79
+ imagick_path = Lolcommits::Configuration.command_which('identify', true)
80
+ hook_export = "export PATH=\"#{ruby_path}:#{imagick_path}:$PATH\"\n"
71
81
  capture_cmd = 'lolcommits --capture'
72
82
  capture_args = " #{ARGV[1..-1].join(' ')}" if ARGV.length > 1
73
83
 
74
84
  <<-EOS
75
- #{shebang}### lolcommits hook (begin) ###
76
- #{hook_export}#{capture_cmd}#{capture_args}
77
- ### lolcommits hook (end) ###
78
- EOS
85
+ ### lolcommits hook (begin) ###
86
+ #{hook_export}#{capture_cmd}#{capture_args}
87
+ ### lolcommits hook (end) ###
88
+ EOS
79
89
  end
80
90
 
81
91
  # does a git hook exist at all?
@@ -11,16 +11,29 @@ module Lolcommits
11
11
  self.options = ['enabled']
12
12
  end
13
13
 
14
- def execute
14
+ def execute_precapture
15
15
  if enabled?
16
- debug 'I am enabled, about to run'
17
- run
16
+ debug 'I am enabled, about to run precapture'
17
+ run_precapture
18
18
  else
19
- debug 'Disabled, doing nothing for execution'
19
+ debug 'Disabled, doing nothing for precapture execution'
20
20
  end
21
21
  end
22
22
 
23
- def run
23
+ def execute_postcapture
24
+ if enabled?
25
+ debug 'I am enabled, about to run postcapture'
26
+ run_postcapture
27
+ else
28
+ debug 'Disabled, doing nothing for postcapture execution'
29
+ end
30
+ end
31
+
32
+ def run_precapture
33
+ debug 'base plugin, does nothing to anything'
34
+ end
35
+
36
+ def run_postcapture
24
37
  debug 'base plugin, does nothing to anything'
25
38
  end
26
39
 
@@ -35,13 +48,24 @@ module Lolcommits
35
48
  puts "Configuring plugin: #{self.class.name}\n"
36
49
  options.reduce(Hash.new) do |acc, option|
37
50
  print "#{option}: "
38
- val = STDIN.gets.strip.downcase
39
- if %w(true yes).include?(val)
40
- val = true
41
- elsif %(false no).include?(val)
42
- val = false
51
+ val = parse_user_input(STDIN.gets.strip)
52
+ # check enabled option isn't a String
53
+ if (option == 'enabled') && val.is_a?(String)
54
+ puts "Aborting - please enable with 'true' or 'false'"
55
+ exit 1
56
+ else
57
+ acc.merge(option => val)
43
58
  end
44
- acc.merge(option => val)
59
+ end
60
+ end
61
+
62
+ def parse_user_input(str)
63
+ if 'true'.casecmp(str) == 0
64
+ true
65
+ elsif 'false'.casecmp(str) == 0
66
+ false
67
+ else
68
+ str
45
69
  end
46
70
  end
47
71
 
@@ -71,6 +95,12 @@ module Lolcommits
71
95
  super(args)
72
96
  end
73
97
 
98
+ # helper to log errors with a message via debug
99
+ def log_error(e, message)
100
+ debug message
101
+ debug e.backtrace.join("\n")
102
+ end
103
+
74
104
  # uniform debug logging for plugins
75
105
  def debug(msg)
76
106
  super("Plugin: #{self.class.to_s}: " + msg)
@@ -80,5 +110,11 @@ module Lolcommits
80
110
  def self.name
81
111
  'plugin'
82
112
  end
113
+
114
+ # a plugin requests to be run by the runner in one of the possible positions.
115
+ # valid options are [:precapture, :postcapture]
116
+ def self.runner_order
117
+ nil
118
+ end
83
119
  end
84
120
  end
@@ -3,16 +3,18 @@ require 'httmultiparty'
3
3
 
4
4
  module Lolcommits
5
5
  class DotCom < Plugin
6
+ BASE_URL = 'http://lolcommits-dot-com.herokuapp.com'
7
+
6
8
  def initialize(runner)
7
9
  super
8
10
  self.options.concat(['api_key', 'api_secret', 'repo_id'])
9
11
  end
10
12
 
11
- def run
13
+ def run_postcapture
12
14
  return unless valid_configuration?
13
15
 
14
16
  t = Time.now.to_i.to_s
15
- resp = HTTMultiParty.post('http://www.lolcommits.com/git_commits.json',
17
+ resp = HTTMultiParty.post("#{BASE_URL}/git_commits.json",
16
18
  :body => {
17
19
  :git_commit => {
18
20
  :sha => self.runner.sha,
@@ -26,6 +28,8 @@ module Lolcommits
26
28
  :token => Digest::SHA1.hexdigest(configuration['api_secret'] + t)
27
29
  }
28
30
  )
31
+ rescue => e
32
+ log_error(e, "ERROR: HTTMultiParty POST FAILED #{e.class} - #{e.message}")
29
33
  end
30
34
 
31
35
  def configured?
@@ -38,5 +42,9 @@ module Lolcommits
38
42
  def self.name
39
43
  'dot_com'
40
44
  end
45
+
46
+ def self.runner_order
47
+ :postcapture
48
+ end
41
49
  end
42
50
  end
@@ -14,7 +14,7 @@ module Lolcommits
14
14
  TWITTER_RETRIES = 2
15
15
  TWITTER_PIN_REGEX = /^\d{4,}$/ # 4 or more digits
16
16
 
17
- def run
17
+ def run_postcapture
18
18
  return unless valid_configuration?
19
19
 
20
20
  attempts = 0
@@ -47,7 +47,7 @@ module Lolcommits
47
47
  def configure_options!
48
48
  options = super
49
49
  # ask user to configure tokens if enabling
50
- if options['enabled'] == true
50
+ if enabled?
51
51
  auth_config = configure_auth!
52
52
  if auth_config
53
53
  options.merge!(auth_config)
@@ -121,5 +121,9 @@ module Lolcommits
121
121
  def self.name
122
122
  'twitter'
123
123
  end
124
+
125
+ def self.runner_order
126
+ :postcapture
127
+ end
124
128
  end
125
129
  end
@@ -14,6 +14,10 @@ module Lolcommits
14
14
  'yammer'
15
15
  end
16
16
 
17
+ def self.runner_order
18
+ :postcapture
19
+ end
20
+
17
21
  def configured?
18
22
  !configuration['access_token'].nil?
19
23
  end
@@ -40,7 +44,7 @@ module Lolcommits
40
44
 
41
45
  def configure_options!
42
46
  options = super
43
- if options['enabled'] == true
47
+ if enabled?
44
48
  auth_config = configure_access_token
45
49
  if auth_config
46
50
  options.merge!(auth_config)
@@ -51,7 +55,7 @@ module Lolcommits
51
55
  options
52
56
  end
53
57
 
54
- def run
58
+ def run_postcapture
55
59
  return unless valid_configuration?
56
60
 
57
61
  commit_msg = self.runner.message
@@ -10,7 +10,7 @@ module Lolcommits
10
10
  self.options << 'server'
11
11
  end
12
12
 
13
- def run
13
+ def run_postcapture
14
14
  return unless valid_configuration?
15
15
  fork { sync }
16
16
  end
@@ -32,38 +32,31 @@ module Lolcommits
32
32
  end
33
33
 
34
34
  def existing_lols
35
- begin
36
- lols = JSON.parse(
37
- RestClient.get(configuration['server'] + '/lols'))
38
- lols.map { |lol| lol['sha'] }
39
- rescue => e
40
- log_error(e, "ERROR: existing lols could not be retrieved #{e.class} - #{e.message}")
41
- return nil
42
- end
35
+ lols = JSON.parse(
36
+ RestClient.get(configuration['server'] + '/lols'))
37
+ lols.map { |lol| lol['sha'] }
38
+ rescue => e
39
+ log_error(e, "ERROR: existing lols could not be retrieved #{e.class} - #{e.message}")
40
+ return nil
43
41
  end
44
42
 
45
43
  def upload(file, sha)
46
- begin
47
- RestClient.post(
48
- configuration['server'] + '/uplol',
49
- :lol => File.new(file),
50
- :url => self.runner.url + sha,
51
- :repo => self.runner.repo,
52
- :date => File.ctime(file),
53
- :sha => sha)
54
- rescue => e
55
- log_error(e, "ERROR: Upload of lol #{sha} FAILED #{e.class} - #{e.message}")
56
- return
57
- end
58
- end
59
-
60
- def log_error(e, message)
61
- debug message
62
- debug e.backtrace
44
+ RestClient.post(configuration['server'] + '/uplol',
45
+ :lol => File.new(file),
46
+ :url => self.runner.url + sha,
47
+ :repo => self.runner.repo,
48
+ :date => File.ctime(file),
49
+ :sha => sha)
50
+ rescue => e
51
+ log_error(e, "ERROR: Upload of lol #{sha} FAILED #{e.class} - #{e.message}")
63
52
  end
64
53
 
65
54
  def self.name
66
55
  'lolsrv'
67
56
  end
57
+
58
+ def self.runner_order
59
+ :postcapture
60
+ end
68
61
  end
69
62
  end
@@ -11,7 +11,7 @@ module Lolcommits
11
11
  !configured? || super
12
12
  end
13
13
 
14
- def run
14
+ def run_postcapture
15
15
  font_location = @font_location || File.join(Configuration::LOLCOMMITS_ROOT,
16
16
  'vendor',
17
17
  'fonts',
@@ -54,6 +54,7 @@ module Lolcommits
54
54
  def clean_msg(text)
55
55
  wrapped_text = word_wrap text
56
56
  escape_quotes wrapped_text
57
+ escape_ats wrapped_text
57
58
  end
58
59
 
59
60
  # conversion for quotation marks to avoid shell interpretation
@@ -62,6 +63,10 @@ module Lolcommits
62
63
  text.gsub(/"/, "''")
63
64
  end
64
65
 
66
+ def escape_ats(text)
67
+ text.gsub(/@/, '\@')
68
+ end
69
+
65
70
  # convenience method for word wrapping
66
71
  # based on https://github.com/cmdrkeene/memegen/blob/master/lib/meme_generator.rb
67
72
  def word_wrap(text, col = 27)
@@ -99,7 +99,7 @@ module Lolcommits
99
99
  class Tranzlate < Plugin
100
100
  extend Lolspeak
101
101
 
102
- def run
102
+ def run_precapture
103
103
  debug "Commit message before: #{self.runner.message}"
104
104
  self.runner.message = self.class.tranzlate(self.runner.message)
105
105
  debug "Commit message after: #{self.runner.message}"
@@ -108,5 +108,9 @@ module Lolcommits
108
108
  def self.name
109
109
  'tranzlate'
110
110
  end
111
+
112
+ def self.runner_order
113
+ :precapture
114
+ end
111
115
  end
112
116
  end
@@ -10,7 +10,7 @@ module Lolcommits
10
10
  self.options.concat(['endpoint', 'optional_key'])
11
11
  end
12
12
 
13
- def run
13
+ def run_postcapture
14
14
  return unless valid_configuration?
15
15
 
16
16
  repo = self.runner.repo.to_s
@@ -23,6 +23,8 @@ module Lolcommits
23
23
  :repo => repo,
24
24
  :key => configuration['optional_key'])
25
25
  end
26
+ rescue => e
27
+ log_error(e, "ERROR: RestClient POST FAILED #{e.class} - #{e.message}")
26
28
  end
27
29
 
28
30
  def configured?
@@ -32,5 +34,9 @@ module Lolcommits
32
34
  def self.name
33
35
  'uploldz'
34
36
  end
37
+
38
+ def self.runner_order
39
+ :postcapture
40
+ end
35
41
  end
36
42
  end
@@ -8,19 +8,6 @@ module Lolcommits
8
8
  :font, :capture_animate, :url
9
9
 
10
10
  include Methadone::CLILogging
11
- include ActiveSupport::Callbacks
12
- define_callbacks :run
13
- set_callback :run, :before, :execute_lolcommits_tranzlate
14
-
15
- # Executed Last
16
- set_callback :run, :after, :cleanup!
17
- set_callback :run, :after, :execute_lolcommits_uploldz
18
- set_callback :run, :after, :execute_lolcommits_lolsrv
19
- set_callback :run, :after, :execute_lolcommits_lol_twitter
20
- set_callback :run, :after, :execute_lolcommits_dot_com
21
- set_callback :run, :after, :execute_lolcommits_lol_yammer
22
- set_callback :run, :after, :execute_lolcommits_loltext
23
- # Executed First
24
11
 
25
12
  def initialize(attributes = {})
26
13
  attributes.each do |attr, val|
@@ -37,25 +24,61 @@ module Lolcommits
37
24
  end
38
25
  end
39
26
 
27
+ # wrap run to handle things that should happen before and after
28
+ # this used to be handled with ActiveSupport::Callbacks, but
29
+ # now we're just using a simple procedural list
40
30
  def run
41
- die_if_rebasing!
31
+ # do things that need to happen before capture and plugins
42
32
 
43
- run_callbacks :run do
44
- puts '*** Preserving this moment in history.' unless capture_stealth
45
- self.snapshot_loc = self.config.raw_image(image_file_type)
46
- self.main_image = self.config.main_image(self.sha, image_file_type)
47
- capturer = capturer_class.new(
48
- :capture_device => self.capture_device,
49
- :capture_delay => self.capture_delay,
50
- :snapshot_location => self.snapshot_loc,
51
- :font => self.font,
52
- :video_location => self.config.video_loc,
53
- :frames_location => self.config.frames_loc,
54
- :animated_duration => self.capture_animate
55
- )
56
- capturer.capture
57
- resize_snapshot!
33
+ # do native plugins that need to happen before capture
34
+ plugins_for(:precapture).each do |plugin|
35
+ debug "precapture: about to execute #{plugin}"
36
+ plugin.new(self).execute_precapture
58
37
  end
38
+
39
+ # do gem plugins that need to happen before capture?
40
+
41
+ # **** do the main capture ****
42
+ run_capture_and_resize
43
+
44
+ # do native plugins that need to happen immediately after capture
45
+ # this is effectively the "image processing" phase
46
+ # for now, reserve just for us and handle manually...?
47
+ Lolcommits::Loltext.new(self).execute_postcapture
48
+
49
+ # do native plugins that need to happen after capture
50
+ plugins_for(:postcapture).each do |plugin|
51
+ plugin.new(self).execute_postcapture
52
+ end
53
+
54
+ # do gem plugins that need to happen after capture?
55
+
56
+ # do things that should happen last
57
+ cleanup!
58
+ end
59
+
60
+ def plugins_for(position)
61
+ Lolcommits::PLUGINS.select { |p| p.runner_order == position }
62
+ end
63
+
64
+ # the main capture and resize operation, critical
65
+ def run_capture_and_resize
66
+ die_if_rebasing!
67
+
68
+ puts '*** Preserving this moment in history.' unless capture_stealth
69
+ self.snapshot_loc = self.config.raw_image(image_file_type)
70
+ self.main_image = self.config.main_image(self.sha, image_file_type)
71
+ capturer = capturer_class.new(
72
+ :capture_device => self.capture_device,
73
+ :capture_delay => self.capture_delay,
74
+ :snapshot_location => self.snapshot_loc,
75
+ :font => self.font,
76
+ :video_location => self.config.video_loc,
77
+ :frames_location => self.config.frames_loc,
78
+ :animated_duration => self.capture_animate
79
+ )
80
+ capturer.capture
81
+ resize_snapshot!
59
82
  end
60
83
 
61
84
  def animate?
@@ -65,7 +88,9 @@ module Lolcommits
65
88
  private
66
89
 
67
90
  def capturer_class
68
- "Lolcommits::Capture#{Configuration.platform}#{animate? ? 'Animated' : nil}".constantize
91
+ capturer_module = 'Lolcommits'
92
+ capturer_class = "Capture#{Configuration.platform}#{animate? ? 'Animated' : nil}"
93
+ Object.const_get(capturer_module).const_get(capturer_class)
69
94
  end
70
95
 
71
96
  def image_file_type
@@ -110,13 +135,4 @@ module Lolcommits
110
135
  FileUtils.rm_f(self.config.video_loc)
111
136
  FileUtils.rm_rf(self.config.frames_loc)
112
137
  end
113
-
114
- # register a method called "execute_lolcommits_#{plugin_name}"
115
- # for each subclass of plugin. these methods should be used as
116
- # callbacks to the run method.
117
- Lolcommits::PLUGINS.each do |plugin|
118
- define_method "execute_#{plugin.to_s.underscore.gsub('/', '_')}" do
119
- plugin.new(self).execute
120
- end
121
- end
122
138
  end
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module Lolcommits
3
- VERSION = '0.5.4'
3
+ VERSION = '0.5.5'
4
4
  end
@@ -25,7 +25,6 @@ Gem::Specification.new do |s|
25
25
  s.add_runtime_dependency('launchy', '~> 2.2.0')
26
26
  s.add_runtime_dependency('methadone', '~> 1.2.4')
27
27
  s.add_runtime_dependency('open4', '~> 1.3.0')
28
- s.add_runtime_dependency('activesupport', '~> 3.2.12')
29
28
 
30
29
  # development dependencies
31
30
  s.add_development_dependency('rdoc')
@@ -63,10 +63,10 @@ UselessAssignment:
63
63
  Documentation:
64
64
  Enabled: false
65
65
 
66
- # Offence count: 1
66
+ # Offence count: 3
67
67
  # Configuration parameters: CountComments.
68
68
  ClassLength:
69
- Max: 169
69
+ Max: 179
70
70
 
71
71
  # Offence count: 73
72
72
  LineLength:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lolcommits
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Rothenberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-13 00:00:00.000000000 Z
11
+ date: 2014-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mini_magick
@@ -94,20 +94,6 @@ dependencies:
94
94
  - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: 1.3.0
97
- - !ruby/object:Gem::Dependency
98
- name: activesupport
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ~>
102
- - !ruby/object:Gem::Version
103
- version: 3.2.12
104
- type: :runtime
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ~>
109
- - !ruby/object:Gem::Version
110
- version: 3.2.12
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: rdoc
113
99
  requirement: !ruby/object:Gem::Requirement
@@ -365,7 +351,6 @@ files:
365
351
  - CONTRIBUTING
366
352
  - Gemfile
367
353
  - LICENSE
368
- - NOTES
369
354
  - README.md
370
355
  - Rakefile
371
356
  - bin/lolcommits
@@ -378,13 +363,14 @@ files:
378
363
  - features/support/path_helpers.rb
379
364
  - lib/core_ext/class.rb
380
365
  - lib/lolcommits.rb
381
- - lib/lolcommits/capture_cygwin.rb
382
- - lib/lolcommits/capture_fake.rb
383
- - lib/lolcommits/capture_linux.rb
384
- - lib/lolcommits/capture_mac.rb
385
- - lib/lolcommits/capture_mac_animated.rb
386
- - lib/lolcommits/capture_windows.rb
387
366
  - lib/lolcommits/capturer.rb
367
+ - lib/lolcommits/capturer/capture_cygwin.rb
368
+ - lib/lolcommits/capturer/capture_fake.rb
369
+ - lib/lolcommits/capturer/capture_linux.rb
370
+ - lib/lolcommits/capturer/capture_linux_animated.rb
371
+ - lib/lolcommits/capturer/capture_mac.rb
372
+ - lib/lolcommits/capturer/capture_mac_animated.rb
373
+ - lib/lolcommits/capturer/capture_windows.rb
388
374
  - lib/lolcommits/configuration.rb
389
375
  - lib/lolcommits/git_info.rb
390
376
  - lib/lolcommits/installation.rb
@@ -429,7 +415,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
429
415
  version: '0'
430
416
  requirements: []
431
417
  rubyforge_project: lolcommits
432
- rubygems_version: 2.2.2
418
+ rubygems_version: 2.4.1
433
419
  signing_key:
434
420
  specification_version: 4
435
421
  summary: Capture webcam image on git commit for lulz.
data/NOTES DELETED
@@ -1,17 +0,0 @@
1
-
2
- AFTER:
3
- * update version (.pre)
4
- * update README
5
- * open3 and unit assertions in cuke tests, can remove with aruba ?
6
- * better plugin list output, showing enabled status etc
7
- * GET RID OF LOLCOMMITS_DIR in TEST ENV and FAKE $HOME instead
8
- * clean up bin/lolcommits or refactor or whatever it's a mess
9
-
10
- MUCH LATER:
11
- * auto version detection? (to encourage people to update)
12
- * push stats to statsd or something so i know how many people are using it!
13
- * pimp twitter
14
- - in readme
15
- - in post_install_message from gemspec
16
- * a real website
17
-