pullcrusher 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +2 -0
- data/Brewfile +8 -0
- data/CHANGELOG +6 -0
- data/README.md +13 -11
- data/bin/pullcrusher +5 -5
- data/lib/pullcrusher.rb +152 -159
- data/lib/pullcrusher/version.rb +1 -1
- data/pullcrusher.gemspec +7 -6
- metadata +42 -63
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2d64023df232595cbd7e9e649deb6c3f111bc42e
|
4
|
+
data.tar.gz: 764bdb87dd23613ec27e8ce49fe6cf847888fef7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c6bb649c48741f5dec46eb0acaa4fc502350f12df2a3a971f3510c742e66fe05c7bebb414fcf34ccb1d2b7b583f239ccec857ab7478c7db5d41f920290e0ba36
|
7
|
+
data.tar.gz: 3f10a0cc0f2efcb3ace1f9c635f7b2ed8277d49837a1b42897370fdbf5a3dd29661d5c67923ecd4c72525c0f016389b08c093dee44d694c4c447f7aff9fdf7a8
|
data/.travis.yml
CHANGED
data/Brewfile
ADDED
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
0.0.2 (15 March 2014)
|
2
|
+
* redo core loop to take advantage of multi-core systems.
|
3
|
+
- on a quick test with mislav/poignant-guide on my core-i7 system, full run
|
4
|
+
time was reduced from ~103sec -> ~45sec.
|
5
|
+
* better peg version dependencies to stand the test of time.
|
6
|
+
|
1
7
|
0.0.1 (30 June 2012)
|
2
8
|
* initial release as a gem package
|
3
9
|
* fuck it, ship it
|
data/README.md
CHANGED
@@ -5,14 +5,17 @@ images, but most people forget to run them. Pullcrusher makes it easy
|
|
5
5
|
to optimize the images of any GitHub repository, and contribute the
|
6
6
|
optimizations back to the maintainer as a pull request.
|
7
7
|
|
8
|
-
We stand on the shoulders of giants! Thanks to: image_optim, ruby-git,
|
9
|
-
and octokit.
|
8
|
+
We stand on the shoulders of giants! Thanks to: [image_optim](https://github.com/toy/image_optim), [ruby-git](https://github.com/schacon/ruby-git), [methadone](https://github.com/davetron5000/methadone/)
|
9
|
+
and [octokit](https://github.com/pengwynn/octokit).
|
10
|
+
|
11
|
+
[![Build Status](https://secure.travis-ci.org/mroth/pullcrusher.png?branch=master)](http://travis-ci.org/mroth/pullcrusher)
|
12
|
+
[![Dependency Status](https://gemnasium.com/mroth/pullcrusher.png)](https://gemnasium.com/mroth/pullcrusher)
|
10
13
|
|
11
14
|
## Prerequisites
|
12
15
|
|
13
|
-
Get dependencies for image optimization, on MacOSX:
|
16
|
+
Get dependencies for image optimization, on MacOSX, using homebrew:
|
14
17
|
|
15
|
-
brew install advancecomp gifsicle jpegoptim jpeg optipng pngcrush
|
18
|
+
brew install advancecomp gifsicle jhead jpegoptim jpeg optipng pngcrush
|
16
19
|
|
17
20
|
Debian/Ubuntu:
|
18
21
|
|
@@ -28,7 +31,7 @@ On some setups (default MacOSX) that may need a `sudo` first.
|
|
28
31
|
|
29
32
|
## Usage
|
30
33
|
|
31
|
-
Simply do a `
|
34
|
+
Simply do a `pullcrusher [repo_name]` using the github style short-name
|
32
35
|
for a repository, e.g. `mroth/pullcrusher`.
|
33
36
|
|
34
37
|
Pullcrusher will locate all images, compress them, and then ask you if
|
@@ -37,7 +40,7 @@ Simply type "Y" if you like and you are done!
|
|
37
40
|
|
38
41
|
### Sample output
|
39
42
|
|
40
|
-
%
|
43
|
+
% pullcrusher waferbaby/usesthis
|
41
44
|
*** Asking Github to find us the URI for waferbaby/usesthis
|
42
45
|
*** Cloning git@github.com:waferbaby/usesthis.git to local filesystem
|
43
46
|
*** Finding and processing any candidate files
|
@@ -65,16 +68,16 @@ Simply type "Y" if you like and you are done!
|
|
65
68
|
|
66
69
|
### SSH
|
67
70
|
We use standard git ssh to push changes to your github account. You'll
|
68
|
-
want to make sure you have [SSH keys properly setup](https://help.github.com/articles/generating-ssh-keys).
|
71
|
+
want to make sure you have [SSH keys properly setup](https://help.github.com/articles/generating-ssh-keys).
|
69
72
|
|
70
73
|
(Does anyone actually prefer HTTPS with credential caching as github thinks? lmk if
|
71
74
|
this is something we need to add to pullcrusher).
|
72
75
|
|
73
76
|
### GitHub Credentials
|
74
77
|
The first time you run pullcrusher, it will ask for your GitHub username
|
75
|
-
and password to obtain a oAuth token (or possibly just your password, if
|
76
|
-
it can locate your Github username in your git configuration). This is
|
77
|
-
totally cool and awesome, but if you don't want that token on your hard
|
78
|
+
and password to obtain a oAuth token (or possibly just your password, if
|
79
|
+
it can locate your Github username in your git configuration). This is
|
80
|
+
totally cool and awesome, but if you don't want that token on your hard
|
78
81
|
drive for any reason, its located at `~/.config/pullcrusher.yml`.
|
79
82
|
|
80
83
|
We use this so we can use the Github API to handle forking
|
@@ -102,4 +105,3 @@ released.
|
|
102
105
|
manually?) (PUNTING ON THIS TILL NEXT VERSION)
|
103
106
|
* Some very very basic tests, and setup travis-ci to ensure we run on
|
104
107
|
ruby 1.8.7 as well. √
|
105
|
-
|
data/bin/pullcrusher
CHANGED
@@ -32,7 +32,7 @@ class App
|
|
32
32
|
|
33
33
|
input = ask "Do you want to automatically fork and pull request? [y/N] "
|
34
34
|
if input.match(/[yY]/)
|
35
|
-
|
35
|
+
pc.fork_and_pull(fs_repo, repo_name, results)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -41,9 +41,9 @@ class App
|
|
41
41
|
#TODO: THIS IS ALL DEPRECATED, MOVE COMMENTS OUT
|
42
42
|
format_desc = "Repo name should be in github shorthand style, e.g. 'mroth/pullcrusher'"
|
43
43
|
if ARGV.count != 1
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
puts "Usage: pullcrush [github_repo]"
|
45
|
+
puts format_desc
|
46
|
+
exit 0
|
47
47
|
end
|
48
48
|
|
49
49
|
#TODO: test for proper format
|
@@ -66,7 +66,7 @@ class App
|
|
66
66
|
# Or, just call OptionParser methods on opts
|
67
67
|
#
|
68
68
|
# Require an argument
|
69
|
-
# arg :some_arg
|
69
|
+
# arg :some_arg
|
70
70
|
#
|
71
71
|
# # Make an argument optional
|
72
72
|
# arg :optional_arg, :optional
|
data/lib/pullcrusher.rb
CHANGED
@@ -9,179 +9,172 @@ require "methadone"
|
|
9
9
|
|
10
10
|
module Pullcrusher
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
12
|
+
class Pullcrusher
|
13
|
+
include Methadone::CLILogging
|
14
|
+
|
15
|
+
attr_accessor :ok_client, :github_username
|
16
|
+
|
17
|
+
# Class constructor
|
18
|
+
#
|
19
|
+
# authclient - An initialized Octokit client with authorization.
|
20
|
+
# If none is provided, a public client will be used (which cannot perform many actions)
|
21
|
+
#
|
22
|
+
def initialize(authclient=nil)
|
23
|
+
unless authclient.nil?
|
24
|
+
@ok_client = authclient
|
25
|
+
@github_username = authclient.login
|
26
|
+
else
|
27
|
+
@ok_client = Octokit::Client.new
|
28
|
+
end
|
29
|
+
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
class Results
|
32
|
+
include Virtus
|
33
|
+
attribute :bytes_before, Integer
|
34
|
+
attribute :bytes_saved, Integer
|
35
|
+
attribute :filez_candidates, Integer
|
36
|
+
attribute :filez_optimized, Integer
|
37
|
+
end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
39
|
+
# Looks up a github style "username/repo" repository name
|
40
|
+
#
|
41
|
+
# repo_name - the github style repository name
|
42
|
+
#
|
43
|
+
# Returns a octokit repo object
|
44
|
+
def repo_from_shortname(repo_name)
|
45
|
+
@ok_client.repo(repo_name)
|
46
|
+
end
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
48
|
+
# Clones a remote git repository to the local filesystem
|
49
|
+
#
|
50
|
+
# uri - the URI of the remote git repository
|
51
|
+
#
|
52
|
+
# Returns a Git object representing the repository in the local filesystem.
|
53
|
+
def clone_repo(repo_name)
|
54
|
+
FileUtils.mkdir_p('/tmp/pullcrusher')
|
55
|
+
dirname = repo_name.gsub('/','-')
|
56
|
+
target = "/tmp/pullcrusher/#{dirname}"
|
57
|
+
uri = repo_from_shortname(repo_name).clone_url
|
58
|
+
|
59
|
+
#check if tmp directory already exists, if so, clobber it
|
60
|
+
FileUtils.remove_dir(target) if File.directory?(target)
|
61
|
+
|
62
|
+
g = Git.clone(uri,target)
|
63
|
+
end
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
65
|
+
# Given a directory, identify any files that are possible candidates for optimization.
|
66
|
+
# This is naive, and only looks based on filename for now.
|
67
|
+
#
|
68
|
+
# dir - the directory to recursively search for candidate files
|
69
|
+
#
|
70
|
+
# Returns an array of file paths.
|
71
|
+
def get_candidate_files(dir)
|
72
|
+
Dir.chdir(dir)
|
73
|
+
Dir.glob("**/*.{jpg,png,gif}")
|
74
|
+
end
|
75
75
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
76
|
+
# Convenience method to take a repo by string name, and do all the processing.
|
77
|
+
#
|
78
|
+
# repo_name - the github style repository name
|
79
|
+
#
|
80
|
+
# Returns an array containing both a Results hash, and the fs_repo reference that was cloned
|
81
|
+
def process_repo(repo_name)
|
82
|
+
info "*** Asking Github to find us the URI for #{repo_name}"
|
83
|
+
orig_repo = repo_from_shortname(repo_name)
|
84
84
|
|
85
|
-
|
86
|
-
|
85
|
+
info "*** Cloning #{orig_repo.ssh_url} to local filesystem"
|
86
|
+
fs_repo = clone_repo(repo_name)
|
87
87
|
|
88
|
-
|
89
|
-
|
88
|
+
info "*** Finding and processing any candidate files"
|
89
|
+
results = process_files_from_repo( fs_repo )
|
90
90
|
|
91
|
-
|
92
|
-
|
93
|
-
|
91
|
+
info "*** #{results.filez_candidates} files processed, #{results.filez_optimized} successfully optimized for total savings of #{results.bytes_saved} bytes."
|
92
|
+
return results, fs_repo
|
93
|
+
end
|
94
94
|
|
95
95
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
96
|
+
# Convenience method to take a Git repository object, identify and process
|
97
|
+
#
|
98
|
+
# fs_repo - ruby-git object for the repo on filesystem
|
99
|
+
#
|
100
|
+
# Returns a Results object
|
101
|
+
def process_files_from_repo(fs_repo)
|
102
|
+
process_files( get_candidate_files(fs_repo.dir.to_s) )
|
103
|
+
end
|
104
104
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
136
|
-
|
137
|
-
Results.new(:bytes_saved => bytes_saved, :filez_optimized => filez_optimized, :filez_candidates => filez.count)
|
105
|
+
# Given a list of files, process with image_optim to optimized file size.
|
106
|
+
# Files are modified in place in file system.
|
107
|
+
#
|
108
|
+
# filez - the list of filez to process
|
109
|
+
#
|
110
|
+
# Returns a Results object with number of files optimized and bytes saved.
|
111
|
+
def process_files(filez)
|
112
|
+
#TODO: reject any files larger than MAXSIZE
|
113
|
+
# perhaps use Enumerable reject for this!
|
114
|
+
|
115
|
+
#
|
116
|
+
# create an ImageOptim instance
|
117
|
+
#
|
118
|
+
io = ImageOptim.new(:pngout => false) #, :threads => THREADS)
|
119
|
+
|
120
|
+
filez_optimized = 0
|
121
|
+
bytes_saved = 0
|
122
|
+
bytes_total = 0
|
123
|
+
|
124
|
+
io.optimize_images!(filez) do |path,optimized|
|
125
|
+
if optimized
|
126
|
+
filez_optimized += 1
|
127
|
+
size_after = File.size(path)
|
128
|
+
size_before = optimized.original_size
|
129
|
+
size_diff = size_before - size_after
|
130
|
+
bytes_total += size_before
|
131
|
+
bytes_saved += size_diff
|
132
|
+
info "\t#{path}\n\t\t#{size_before} -> #{size_after} (#{size_diff} saved)"
|
133
|
+
else
|
134
|
+
info "\t#{path}"
|
138
135
|
end
|
136
|
+
end
|
139
137
|
|
140
|
-
|
141
|
-
#
|
142
|
-
# fs_repo - git handle to the filesystem repo
|
143
|
-
# repo_name - github style name as a string
|
144
|
-
# results - a Pullcrusher::Results object from the optimization
|
145
|
-
#
|
146
|
-
# Returns nothing?
|
147
|
-
def fork_and_pull(fs_repo, repo_name, results)
|
148
|
-
#TODO: set name and email for git commits?!
|
149
|
-
#nope handle this in bot insteat
|
150
|
-
#fs_repo.config('user.name', 'PullCrusher Bot')
|
151
|
-
#fs_repo.config('user.email','mrothenberg+pullcrusher@gmail.com')
|
152
|
-
#fs_repo.config('credential.git@github.com.username', 'PullcrusherBot')
|
153
|
-
|
154
|
-
|
155
|
-
#DONE: commit changed files
|
156
|
-
info "*** Git branching and commiting all changed files"
|
157
|
-
fs_repo.branch('pullcrushed').checkout
|
158
|
-
fs_repo.add('.')
|
159
|
-
fs_repo.commit('Optimized image files via pullcrusher')
|
160
|
-
|
161
|
-
#DONE: fork original repo (via octokit)
|
162
|
-
info "*** Forking the original repo on github"
|
163
|
-
fork = @ok_client.fork(repo_name)
|
164
|
-
|
165
|
-
#DONE: add forked repo as a new remote to git repo (or just change default?)
|
166
|
-
fs_repo.add_remote('myfork', fork.ssh_url)
|
167
|
-
|
168
|
-
#DONE: push new commits to GH remote
|
169
|
-
info "*** Pushing changes to your forked copy of the repo"
|
170
|
-
fs_repo.push( fs_repo.remote('myfork'), 'pullcrushed' )
|
171
|
-
|
172
|
-
info "*** Creating a pull request..."
|
173
|
-
#def create_pull_request(repo, base, head, title, body, options={})
|
174
|
-
pr = @ok_client.create_pull_request(
|
175
|
-
repo_name,
|
176
|
-
"master", #BASE
|
177
|
-
"#{@github_username}:pullcrushed", #HEAD
|
178
|
-
"Optimized image files via pullcrusher",
|
179
|
-
"Hi there! I've used [pullcrusher](http://github.com/mroth/pullcrusher) to optimize images for this this repository losslessly.\n\n
|
180
|
-
#{results.filez_optimized} files were optimized for a total savings of #{results.bytes_saved} bytes."
|
181
|
-
)
|
182
|
-
info "*** Done! Pull request is at #{pr.html_url}"
|
183
|
-
end
|
138
|
+
Results.new(:bytes_saved => bytes_saved, :filez_optimized => filez_optimized, :filez_candidates => filez.count)
|
184
139
|
end
|
185
140
|
|
141
|
+
# Fork and pull baby!
|
142
|
+
#
|
143
|
+
# fs_repo - git handle to the filesystem repo
|
144
|
+
# repo_name - github style name as a string
|
145
|
+
# results - a Pullcrusher::Results object from the optimization
|
146
|
+
#
|
147
|
+
# Returns nothing?
|
148
|
+
def fork_and_pull(fs_repo, repo_name, results)
|
149
|
+
#DONE: commit changed files
|
150
|
+
info "*** Git branching and commiting all changed files"
|
151
|
+
fs_repo.branch('pullcrushed').checkout
|
152
|
+
fs_repo.add('.')
|
153
|
+
fs_repo.commit('Optimized image files via pullcrusher')
|
154
|
+
|
155
|
+
#DONE: fork original repo (via octokit)
|
156
|
+
info "*** Forking the original repo on github"
|
157
|
+
fork = @ok_client.fork(repo_name)
|
158
|
+
|
159
|
+
#DONE: add forked repo as a new remote to git repo (or just change default?)
|
160
|
+
fs_repo.add_remote('myfork', fork.ssh_url)
|
161
|
+
|
162
|
+
#DONE: push new commits to GH remote
|
163
|
+
info "*** Pushing changes to your forked copy of the repo"
|
164
|
+
fs_repo.push( fs_repo.remote('myfork'), 'pullcrushed' )
|
165
|
+
|
166
|
+
info "*** Creating a pull request..."
|
167
|
+
#def create_pull_request(repo, base, head, title, body, options={})
|
168
|
+
pr = @ok_client.create_pull_request(
|
169
|
+
repo_name,
|
170
|
+
"master", #BASE
|
171
|
+
"#{@github_username}:pullcrushed", #HEAD
|
172
|
+
"Optimized image files via pullcrusher",
|
173
|
+
"Hi there! I've used [pullcrusher](http://github.com/mroth/pullcrusher) to optimize images for this this repository losslessly.\n\n
|
174
|
+
#{results.filez_optimized} files were optimized for a total savings of #{results.bytes_saved} bytes."
|
175
|
+
)
|
176
|
+
info "*** Done! Pull request is at #{pr.html_url}"
|
177
|
+
end
|
186
178
|
end
|
187
179
|
|
180
|
+
end
|
data/lib/pullcrusher/version.rb
CHANGED
data/pullcrusher.gemspec
CHANGED
@@ -11,13 +11,14 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.add_development_dependency('rdoc')
|
12
12
|
gem.add_development_dependency('aruba')
|
13
13
|
gem.add_development_dependency('rake','~> 0.9.2')
|
14
|
-
gem.add_dependency('methadone', '~>1.2.1')
|
15
14
|
|
16
|
-
gem.
|
17
|
-
|
18
|
-
gem.add_runtime_dependency "
|
19
|
-
gem.add_runtime_dependency "
|
20
|
-
gem.add_runtime_dependency "
|
15
|
+
gem.add_dependency('methadone', '~>1.3.2')
|
16
|
+
|
17
|
+
gem.add_runtime_dependency "git", "~>1.2.6"
|
18
|
+
gem.add_runtime_dependency "octokit", "~>1.3" #1.3.0 added authorizations, 2.x adds breaking changes
|
19
|
+
gem.add_runtime_dependency "virtus", "~>0.5.4" #1.0x breaks 1.8.7/1.9.2 compatibility
|
20
|
+
gem.add_runtime_dependency "image_optim", "~>0.12.1"
|
21
|
+
gem.add_runtime_dependency "highline", "~>1.6.21"
|
21
22
|
gem.add_runtime_dependency "json" #needed for ruby 1.8 #TODO: figure out how to scope to platform?
|
22
23
|
|
23
24
|
gem.files = `git ls-files`.split($\)
|
metadata
CHANGED
@@ -1,174 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pullcrusher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matthew Rothenberg
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rdoc
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: aruba
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rake
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- - ~>
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: 0.9.2
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- - ~>
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: 0.9.2
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: methadone
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- - ~>
|
59
|
+
- - "~>"
|
68
60
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.2
|
61
|
+
version: 1.3.2
|
70
62
|
type: :runtime
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- - ~>
|
66
|
+
- - "~>"
|
76
67
|
- !ruby/object:Gem::Version
|
77
|
-
version: 1.2
|
68
|
+
version: 1.3.2
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: git
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - "~>"
|
84
74
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
75
|
+
version: 1.2.6
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - "~>"
|
92
81
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
82
|
+
version: 1.2.6
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: octokit
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - "~>"
|
100
88
|
- !ruby/object:Gem::Version
|
101
|
-
version: 1.3
|
89
|
+
version: '1.3'
|
102
90
|
type: :runtime
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - "~>"
|
108
95
|
- !ruby/object:Gem::Version
|
109
|
-
version: 1.3
|
96
|
+
version: '1.3'
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: virtus
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - "~>"
|
116
102
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
103
|
+
version: 0.5.4
|
118
104
|
type: :runtime
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
|
-
- -
|
108
|
+
- - "~>"
|
124
109
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
110
|
+
version: 0.5.4
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: image_optim
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
|
-
- -
|
115
|
+
- - "~>"
|
132
116
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
117
|
+
version: 0.12.1
|
134
118
|
type: :runtime
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
|
-
- -
|
122
|
+
- - "~>"
|
140
123
|
- !ruby/object:Gem::Version
|
141
|
-
version:
|
124
|
+
version: 0.12.1
|
142
125
|
- !ruby/object:Gem::Dependency
|
143
126
|
name: highline
|
144
127
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
128
|
requirements:
|
147
|
-
- -
|
129
|
+
- - "~>"
|
148
130
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
131
|
+
version: 1.6.21
|
150
132
|
type: :runtime
|
151
133
|
prerelease: false
|
152
134
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
135
|
requirements:
|
155
|
-
- -
|
136
|
+
- - "~>"
|
156
137
|
- !ruby/object:Gem::Version
|
157
|
-
version:
|
138
|
+
version: 1.6.21
|
158
139
|
- !ruby/object:Gem::Dependency
|
159
140
|
name: json
|
160
141
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
142
|
requirements:
|
163
|
-
- -
|
143
|
+
- - ">="
|
164
144
|
- !ruby/object:Gem::Version
|
165
145
|
version: '0'
|
166
146
|
type: :runtime
|
167
147
|
prerelease: false
|
168
148
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
149
|
requirements:
|
171
|
-
- -
|
150
|
+
- - ">="
|
172
151
|
- !ruby/object:Gem::Version
|
173
152
|
version: '0'
|
174
153
|
description: Optimize all images in a GitHub repository, then easily send a pull request
|
@@ -180,8 +159,9 @@ executables:
|
|
180
159
|
extensions: []
|
181
160
|
extra_rdoc_files: []
|
182
161
|
files:
|
183
|
-
- .gitignore
|
184
|
-
- .travis.yml
|
162
|
+
- ".gitignore"
|
163
|
+
- ".travis.yml"
|
164
|
+
- Brewfile
|
185
165
|
- CHANGELOG
|
186
166
|
- Gemfile
|
187
167
|
- LICENSE
|
@@ -200,27 +180,26 @@ files:
|
|
200
180
|
- test/test_github.rb
|
201
181
|
homepage: http://github.com/mroth/pullcrusher
|
202
182
|
licenses: []
|
183
|
+
metadata: {}
|
203
184
|
post_install_message:
|
204
185
|
rdoc_options: []
|
205
186
|
require_paths:
|
206
187
|
- lib
|
207
188
|
required_ruby_version: !ruby/object:Gem::Requirement
|
208
|
-
none: false
|
209
189
|
requirements:
|
210
|
-
- -
|
190
|
+
- - ">="
|
211
191
|
- !ruby/object:Gem::Version
|
212
192
|
version: '0'
|
213
193
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
|
-
none: false
|
215
194
|
requirements:
|
216
|
-
- -
|
195
|
+
- - ">="
|
217
196
|
- !ruby/object:Gem::Version
|
218
197
|
version: '0'
|
219
198
|
requirements: []
|
220
199
|
rubyforge_project:
|
221
|
-
rubygems_version:
|
200
|
+
rubygems_version: 2.2.2
|
222
201
|
signing_key:
|
223
|
-
specification_version:
|
202
|
+
specification_version: 4
|
224
203
|
summary: Optimize all images in a GitHub repository, then easily send a pull request
|
225
204
|
with the changes.
|
226
205
|
test_files:
|