pullcrusher 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
|
+
[](http://travis-ci.org/mroth/pullcrusher)
|
12
|
+
[](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:
|