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 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: