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 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
@@ -3,6 +3,8 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.1
6
8
 
7
9
  # before_install:
8
10
  # - sudo apt-get update
data/Brewfile ADDED
@@ -0,0 +1,8 @@
1
+ # with this you can just `brew bundle` on mac with brew
2
+ install advancecomp
3
+ install gifsicle
4
+ install jhead
5
+ install jpegoptim
6
+ install jpeg
7
+ install optipng
8
+ install pngcrush
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 `pullcrush [repo_name]` using the github style short-name
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
- % pullcrush waferbaby/usesthis
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
- pc.fork_and_pull(fs_repo, repo_name, results)
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
- puts "Usage: pullcrush [github_repo]"
45
- puts format_desc
46
- exit 0
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
- 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
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
- 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
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
- # 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
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
- # 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
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
- # 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
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
- # 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)
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
- info "*** Cloning #{orig_repo.ssh_url} to local filesystem"
86
- fs_repo = clone_repo(repo_name)
85
+ info "*** Cloning #{orig_repo.ssh_url} to local filesystem"
86
+ fs_repo = clone_repo(repo_name)
87
87
 
88
- info "*** Finding and processing any candidate files"
89
- results = process_files_from_repo( fs_repo )
88
+ info "*** Finding and processing any candidate files"
89
+ results = process_files_from_repo( fs_repo )
90
90
 
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
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
- # 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
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
- # 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
- filez.each do |f|
125
- size_before = File.size(f)
126
- info "\t#{f}"
127
- if (io.optimize_image!(f)) #returns true when an optimization has been made
128
- filez_optimized += 1
129
- size_after = File.size(f)
130
- size_diff = size_before - size_after
131
- bytes_total += size_before
132
- bytes_saved += size_diff
133
- info "\t\t#{size_before} -> #{size_after} (#{size_diff} saved)"
134
- end
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
- # Fork and pull baby!
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
@@ -1,3 +1,3 @@
1
1
  module Pullcrusher
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
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.add_runtime_dependency "git"
17
- gem.add_runtime_dependency "octokit", ">= 1.3.0" #1.3.0 added authorizations
18
- gem.add_runtime_dependency "virtus"
19
- gem.add_runtime_dependency "image_optim"
20
- gem.add_runtime_dependency "highline"
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.1
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: 2012-06-30 00:00:00.000000000 Z
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.1
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.1
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: '0'
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: '0'
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.0
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.0
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: '0'
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: 1.8.23
200
+ rubygems_version: 2.2.2
222
201
  signing_key:
223
- specification_version: 3
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: