vendorer 0.1.0

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.
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ script: "bundle exec rake"
2
+ rvm:
3
+ - ree
4
+ - 1.9.2
5
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :rubygems
2
+ gemspec
3
+
4
+ group :development do
5
+ gem 'rake'
6
+ gem 'rspec', '~>2'
7
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,26 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ vendorer (0.1.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.1.3)
10
+ rake (0.9.2)
11
+ rspec (2.6.0)
12
+ rspec-core (~> 2.6.0)
13
+ rspec-expectations (~> 2.6.0)
14
+ rspec-mocks (~> 2.6.0)
15
+ rspec-core (2.6.4)
16
+ rspec-expectations (2.6.0)
17
+ diff-lcs (~> 1.1.2)
18
+ rspec-mocks (2.6.0)
19
+
20
+ PLATFORMS
21
+ ruby
22
+
23
+ DEPENDENCIES
24
+ rake
25
+ rspec (~> 2)
26
+ vendorer!
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ task :default do
5
+ sh "rspec spec/"
6
+ end
7
+
8
+ rule /^version:bump:.*/ do |t|
9
+ file = 'lib/vendorer/version.rb'
10
+ sh "git status | grep 'nothing to commit'" # ensure we are not dirty
11
+ index = ['major', 'minor','patch'].index(t.name.split(':').last)
12
+ version_file = File.read(file)
13
+ old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
14
+ version_parts[index] = version_parts[index].to_i + 1
15
+ new_version = version_parts * '.'
16
+ File.open(file,'w'){|f| f.write(version_file.sub(old_version, new_version)) }
17
+
18
+ sh "bundle && git add #{file} Gemfile.lock && git commit -m 'bump version to #{new_version}'"
19
+ end
data/Readme.md ADDED
@@ -0,0 +1,39 @@
1
+ Vendorer keeps your vendor files up to date.
2
+
3
+ - updateable AND documented dependencies
4
+ - copy-paste-free
5
+ - no unwanted/accidental updates
6
+
7
+ Install
8
+ =======
9
+ Install curl and git, then:
10
+
11
+ sudo gem install vendorer
12
+
13
+ Usage
14
+ =====
15
+ Add a Vendorfile to your project root:
16
+
17
+ file 'public/javascripts/jquery.min.js' => 'http://code.jquery.com/jquery-latest.min.js'
18
+ folder 'vendor/plugins/parallel_tests' => 'https://github.com/grosser/parallel_tests.git'
19
+
20
+ Call `vendorer`
21
+
22
+ If you added something new: `vendorer`
23
+
24
+ If you want to update all dependencies: `vendorer update`
25
+
26
+ If you want to update one dependencies: `vendorer update public/javasctips/jquery.min.js`
27
+
28
+
29
+ TODO
30
+ ====
31
+ - git branch/commit support
32
+ - `folder 'vendor' do` which will remove everything that is not vendored via Vendorfile on `vendorer update` or `vendorer update vendor`
33
+
34
+ Author
35
+ ======
36
+ [Michael Grosser](http://grosser.it)<br/>
37
+ michael@grosser.it<br/>
38
+ License: MIT<br/>
39
+ [![Build Status](https://secure.travis-ci.org/grosser/vendorer.png)](http://travis-ci.org/grosser/vendorer)
data/bin/vendorer ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+ require 'optparse'
4
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
+
6
+ options = {}
7
+ parser = OptionParser.new do |opts|
8
+ opts.banner = <<BANNER
9
+ Vendorer keeps your vendor files up to date.
10
+
11
+ Usage:
12
+
13
+ Create a Vendorfile in your project root with:
14
+
15
+ file 'public/javascripts/jquery.min.js' => 'http://code.jquery.com/jquery-latest.min.js'
16
+ folder 'vendor/plugins/parallel_tests' => 'https://github.com/grosser/parallel_tests.git'
17
+
18
+ Run `vendorer` to install.
19
+ Run `vendorer update` to update.
20
+
21
+ Options:
22
+ BANNER
23
+ opts.on("-v", "--version", "Show Version"){
24
+ require 'vendorer/version'
25
+ puts Vendorer::VERSION
26
+ exit
27
+ }
28
+ opts.on("-h", "--help", "Show this.") { puts opts; exit }
29
+ end
30
+ parser.parse!
31
+
32
+ require 'vendorer'
33
+ Vendorer.new(:update => (ARGV[1] || true if ARGV[0] == 'update'))
data/lib/vendorer.rb ADDED
@@ -0,0 +1,49 @@
1
+ class Vendorer
2
+ def initialize(options)
3
+ @options = options
4
+ eval(File.read('Vendorfile'))
5
+ end
6
+
7
+ private
8
+
9
+ def file(options)
10
+ options.each do |file, url|
11
+ update_or_not file do
12
+ run "mkdir -p #{File.dirname(file)}"
13
+ run "curl '#{url}' -o #{file}"
14
+ raise "Downloaded empty file" unless File.exist?(file)
15
+ end
16
+ end
17
+ end
18
+
19
+ def folder(options)
20
+ options.each do |path, url|
21
+ update_or_not path do
22
+ run "mkdir -p #{File.dirname(path)}"
23
+ run "git clone '#{url}' #{path}"
24
+ run "rm -rf #{path}/.git"
25
+ end
26
+ end
27
+ end
28
+
29
+ def update_or_not(path)
30
+ update_requested = (@options[:update] and (@options[:update] == true or @options[:update] == path))
31
+ if update_requested or not File.exist?(path)
32
+ puts "updating #{path}"
33
+ run "rm -rf #{path}"
34
+ yield
35
+ else
36
+ puts "keeping #{path}"
37
+ end
38
+ end
39
+
40
+ def run(cmd)
41
+ output = ''
42
+ IO.popen(cmd + ' 2>&1') do |pipe|
43
+ while line = pipe.gets
44
+ output << line
45
+ end
46
+ end
47
+ raise output unless $?.success?
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ class Vendorer
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,3 @@
1
+ $LOAD_PATH.unshift 'lib'
2
+ require 'vendorer'
3
+ require 'vendorer/version'
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vendorer do
4
+ before do
5
+ `rm -rf spec/tmp`
6
+ `mkdir spec/tmp`
7
+ end
8
+
9
+ after do
10
+ `rm -rf spec/tmp`
11
+ end
12
+
13
+ def write(file, content)
14
+ File.open("spec/tmp/#{file}",'w'){|f| f.write(content) }
15
+ end
16
+
17
+ def read(file)
18
+ File.read("spec/tmp/#{file}")
19
+ end
20
+
21
+ def size(file)
22
+ File.size("spec/tmp/#{file}")
23
+ end
24
+
25
+ def ls(path)
26
+ `ls spec/tmp/#{path} 2>&1`.split("\n")
27
+ end
28
+
29
+ def run(args='', options={})
30
+ out = `cd spec/tmp && bundle exec ../../bin/vendorer #{args} 2>&1`
31
+ raise out if $?.success? == !!options[:raise]
32
+ out
33
+ end
34
+
35
+ describe 'version' do
36
+ it "has a VERSION" do
37
+ Vendorer::VERSION.should =~ /^[\.\da-z]+$/
38
+ end
39
+
40
+ it "shows its version via -v" do
41
+ run('-v').should == "#{Vendorer::VERSION}\n"
42
+ end
43
+
44
+ it "shows its version via --version" do
45
+ run('--version').should == "#{Vendorer::VERSION}\n"
46
+ end
47
+ end
48
+
49
+ describe 'help' do
50
+ it "shows help via -h" do
51
+ run('-h').should include("Usage")
52
+ end
53
+
54
+ it "shows help via --help" do
55
+ run('--help').should include("Usage")
56
+ end
57
+ end
58
+
59
+ describe '.file' do
60
+ context "with working Vendorfile" do
61
+ before do
62
+ write 'Vendorfile', "file 'public/javascripts/jquery.min.js' => 'http://code.jquery.com/jquery-latest.min.js'"
63
+ run
64
+ end
65
+
66
+ it "can download via hash syntax" do
67
+ ls('public/javascripts').should == ["jquery.min.js"]
68
+ read('public/javascripts/jquery.min.js').should include('jQuery')
69
+ end
70
+
71
+ it "does not update an existing file" do
72
+ write('public/javascripts/jquery.min.js', 'Foo')
73
+ run
74
+ read('public/javascripts/jquery.min.js').should == 'Foo'
75
+ end
76
+
77
+ it "can update a file" do
78
+ write('public/javascripts/jquery.min.js', 'Foo')
79
+ run 'update'
80
+ read('public/javascripts/jquery.min.js').should include('jQuery')
81
+ end
82
+
83
+ it "can update a single file" do
84
+ write 'Vendorfile', "
85
+ file 'public/javascripts/jquery.min.js' => 'http://code.jquery.com/jquery-latest.min.js'
86
+ file 'public/javascripts/jquery.js' => 'http://code.jquery.com/jquery-latest.js'
87
+ "
88
+ run
89
+ read('public/javascripts/jquery.js').should include('jQuery')
90
+ read('public/javascripts/jquery.min.js').should include('jQuery')
91
+
92
+ write('public/javascripts/jquery.js', 'Foo')
93
+ write('public/javascripts/jquery.min.js', 'Foo')
94
+ run 'update public/javascripts/jquery.js'
95
+ size('public/javascripts/jquery.min.js').should == 3
96
+ size('public/javascripts/jquery.js').should > 300
97
+ end
98
+ end
99
+
100
+ it "fails with a nice message" do
101
+ write 'Vendorfile', "file 'xxx.js' => 'http://NOTFOUND'"
102
+ result = run '', :raise => true
103
+ result.should include('Downloaded empty file')
104
+ end
105
+ end
106
+
107
+ describe '.folder' do
108
+ it "can download via hash syntax" do
109
+ write 'Vendorfile', "folder 'vendor/plugins/parallel_tests' => 'https://github.com/grosser/parallel_tests.git'"
110
+ run
111
+ ls('vendor/plugins').should == ["parallel_tests"]
112
+ read('vendor/plugins/parallel_tests/Gemfile').should include('parallel')
113
+ end
114
+
115
+ it "reports errors" do
116
+ write 'Vendorfile', "folder 'vendor/plugins/parallel_tests' => 'https://blob'"
117
+ output = run '', :raise => true
118
+ output.should include('Connection refused')
119
+ end
120
+
121
+ context "with a fast,local repository" do
122
+ before do
123
+ write 'Vendorfile', "folder 'its_recursive' => '../../.git'"
124
+ run
125
+ end
126
+
127
+ it "can download" do
128
+ ls('').should == ["its_recursive", "Vendorfile"]
129
+ read('its_recursive/Gemfile').should include('rake')
130
+ end
131
+
132
+ it "does not keep .git folder so everything can be checked in" do
133
+ ls('its_recursive/.git').first.should include('cannot access')
134
+ end
135
+
136
+ it "does not update an existing folder" do
137
+ write('its_recursive/Gemfile', 'Foo')
138
+ run
139
+ read('its_recursive/Gemfile').should == 'Foo'
140
+ end
141
+
142
+ it "can update a folder" do
143
+ write('its_recursive/Gemfile', 'Foo')
144
+ run 'update'
145
+ read('its_recursive/Gemfile').should include('rake')
146
+ end
147
+
148
+ it "can update a single file" do
149
+ write 'Vendorfile', "
150
+ folder 'its_recursive' => '../../.git'
151
+ folder 'its_really_recursive' => '../../.git'
152
+ "
153
+ run
154
+ write('its_recursive/Gemfile', 'Foo')
155
+ write('its_really_recursive/Gemfile', 'Foo')
156
+ run 'update its_recursive'
157
+ size('its_really_recursive/Gemfile').should == 3
158
+ size('its_recursive/Gemfile').should > 30
159
+ end
160
+ end
161
+ end
162
+ end
data/vendorer.gemspec ADDED
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ name = "vendorer"
3
+ require "#{name}/version"
4
+
5
+ Gem::Specification.new name, Vendorer::VERSION do |s|
6
+ s.summary = "Keep your vendor files up to date"
7
+ s.authors = ["Michael Grosser"]
8
+ s.email = "michael@grosser.it"
9
+ s.homepage = "http://github.com/grosser/#{name}"
10
+ s.files = `git ls-files`.split("\n")
11
+ s.license = 'MIT'
12
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vendorer
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Michael Grosser
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-12-12 00:00:00 -08:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description:
23
+ email: michael@grosser.it
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - .travis.yml
32
+ - Gemfile
33
+ - Gemfile.lock
34
+ - Rakefile
35
+ - Readme.md
36
+ - bin/vendorer
37
+ - lib/vendorer.rb
38
+ - lib/vendorer/version.rb
39
+ - spec/spec_helper.rb
40
+ - spec/vendorer_spec.rb
41
+ - vendorer.gemspec
42
+ has_rdoc: true
43
+ homepage: http://github.com/grosser/vendorer
44
+ licenses:
45
+ - MIT
46
+ post_install_message:
47
+ rdoc_options: []
48
+
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 3
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.6.2
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: Keep your vendor files up to date
76
+ test_files: []
77
+