vendorer 0.1.4 → 0.1.5

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/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vendorer (0.1.4)
4
+ vendorer (0.1.5)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/Readme.md CHANGED
@@ -20,23 +20,30 @@ Add a `Vendorfile` to your project root:
20
20
  # execute a block after updates
21
21
  file 'public/javascripts/jquery.js', 'http://code.jquery.com/jquery.js' do |path|
22
22
  puts "Do something useful with #{path}"
23
+ rewrite(path){|content| content.gsub(/\r\n/,\n).gsub(/\t/,' ') }
23
24
  end
24
25
 
25
26
  # checkout a specific :ref/:tag/:branch
26
27
  folder 'vendor/plugins/parallel_tests', 'https://github.com/grosser/parallel_tests.git', :tag => 'v0.6.10'
27
28
 
29
+ # DRY folders
30
+ folder 'public/javascripts' do
31
+ file 'jquery.js', 'http://code.jquery.com/jquery-latest.js'
32
+ end
33
+
28
34
  Call `vendorer`
29
35
 
30
36
  If you added something new: `vendorer`
31
37
 
32
- If you want to update all dependencies: `vendorer update`
38
+ Update all dependencies: `vendorer update`
39
+
40
+ Update one dependencies: `vendorer update public/javascripts/jquery.min.js`
33
41
 
34
- If you want to update one dependencies: `vendorer update public/javasctips/jquery.min.js`
42
+ Update everything in a folder: `vendorer update public/javascripts`
35
43
 
36
44
 
37
45
  TODO
38
46
  ====
39
- - `folder 'vendor' do` which will remove everything that is not vendored via Vendorfile on `vendorer update` or `vendorer update vendor`
40
47
  - nice error message when no Vendorfile was found
41
48
 
42
49
  Author
@@ -1,3 +1,3 @@
1
1
  class Vendorer
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
data/lib/vendorer.rb CHANGED
@@ -1,12 +1,14 @@
1
+ require 'tempfile'
2
+
1
3
  class Vendorer
2
4
  def initialize(options)
3
5
  @options = options
6
+ @sub_path = []
4
7
  eval(File.read('Vendorfile'))
5
8
  end
6
9
 
7
- private
8
-
9
10
  def file(path, url)
11
+ path = complete_path(path)
10
12
  update_or_not path do
11
13
  run "mkdir -p #{File.dirname(path)}"
12
14
  run "curl '#{url}' -o #{path}"
@@ -15,23 +17,38 @@ class Vendorer
15
17
  end
16
18
  end
17
19
 
18
- def folder(path, url, options={})
19
- update_or_not path do
20
- run "mkdir -p #{File.dirname(path)}"
21
- run "git clone '#{url}' #{path}"
22
- if commit = (options[:ref] || options[:tag] || options[:branch])
23
- run "cd #{path} && git checkout '#{commit}'"
20
+ def folder(path, url=nil, options={})
21
+ if url
22
+ path = complete_path(path)
23
+ update_or_not path do
24
+ run "rm -rf #{path}"
25
+ run "mkdir -p #{File.dirname(path)}"
26
+ run "git clone '#{url}' #{path}"
27
+ if commit = (options[:ref] || options[:tag] || options[:branch])
28
+ run "cd #{path} && git checkout '#{commit}'"
29
+ end
30
+ run "rm -rf #{path}/.git"
31
+ yield path if block_given?
24
32
  end
25
- run "rm -rf #{path}/.git"
26
- yield path if block_given?
33
+ else
34
+ @sub_path << path
35
+ yield
36
+ @sub_path.pop
27
37
  end
28
38
  end
29
39
 
40
+ def rewrite(path)
41
+ content = File.read(path)
42
+ result = yield content
43
+ File.open(path,'w'){|f| f.write(result) }
44
+ end
45
+
46
+ private
47
+
30
48
  def update_or_not(path)
31
- update_requested = (@options[:update] and (@options[:update] == true or @options[:update] == path))
49
+ update_requested = (@options[:update] and (@options[:update] == true or path.start_with?(@options[:update]+'/') or path == @options[:update]))
32
50
  if update_requested or not File.exist?(path)
33
51
  puts "updating #{path}"
34
- run "rm -rf #{path}"
35
52
  yield
36
53
  else
37
54
  puts "keeping #{path}"
@@ -47,4 +64,8 @@ class Vendorer
47
64
  end
48
65
  raise output unless $?.success?
49
66
  end
67
+
68
+ def complete_path(path)
69
+ (@sub_path + [path]).join('/')
70
+ end
50
71
  end
@@ -22,11 +22,17 @@ describe Vendorer do
22
22
  File.size("spec/tmp/#{file}")
23
23
  end
24
24
 
25
+ def run(cmd)
26
+ result = `cd spec/tmp && #{cmd} 2>&1`
27
+ raise result unless $?.success?
28
+ result
29
+ end
30
+
25
31
  def ls(path)
26
32
  `ls spec/tmp/#{path} 2>&1`.split("\n")
27
33
  end
28
34
 
29
- def run(args='', options={})
35
+ def vendorer(args='', options={})
30
36
  out = `cd spec/tmp && bundle exec ../../bin/vendorer #{args} 2>&1`
31
37
  raise out if $?.success? == !!options[:raise]
32
38
  out
@@ -38,70 +44,95 @@ describe Vendorer do
38
44
  end
39
45
 
40
46
  it "shows its version via -v" do
41
- run('-v').should == "#{Vendorer::VERSION}\n"
47
+ vendorer('-v').should == "#{Vendorer::VERSION}\n"
42
48
  end
43
49
 
44
50
  it "shows its version via --version" do
45
- run('--version').should == "#{Vendorer::VERSION}\n"
51
+ vendorer('--version').should == "#{Vendorer::VERSION}\n"
46
52
  end
47
53
  end
48
54
 
49
55
  describe 'help' do
50
56
  it "shows help via -h" do
51
- run('-h').should include("Usage")
57
+ vendorer('-h').should include("Usage")
52
58
  end
53
59
 
54
60
  it "shows help via --help" do
55
- run('--help').should include("Usage")
61
+ vendorer('--help').should include("Usage")
56
62
  end
57
63
  end
58
64
 
59
65
  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
66
+ def simple_vendorfile
67
+ write 'Vendorfile', "file 'public/javascripts/jquery.min.js', 'http://code.jquery.com/jquery-latest.min.js'"
68
+ end
65
69
 
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
+ it "can download a new file" do
71
+ simple_vendorfile
72
+ vendorer
73
+ ls('public/javascripts').should == ["jquery.min.js"]
74
+ read('public/javascripts/jquery.min.js').should include('jQuery')
75
+ end
70
76
 
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
77
+ it "does not update an existing file" do
78
+ simple_vendorfile
79
+ vendorer
80
+ write('public/javascripts/jquery.min.js', 'Foo')
81
+ vendorer
82
+ read('public/javascripts/jquery.min.js').should == 'Foo'
83
+ end
84
+
85
+ it "fails with a nice message if the Vendorfile is broken" do
86
+ write 'Vendorfile', "file 'xxx.js', 'http://NOTFOUND'"
87
+ result = vendorer '', :raise => true
88
+ # different errors on travis / local
89
+ raise result unless result.include?("resolve host 'NOTFOUND'") or result.include?('Downloaded empty file')
90
+ end
76
91
 
77
- it "can update a file" do
92
+ describe "with update" do
93
+ it "updates all files when update is called" do
94
+ simple_vendorfile
95
+ vendorer
78
96
  write('public/javascripts/jquery.min.js', 'Foo')
79
- run 'update'
97
+ vendorer 'update'
80
98
  read('public/javascripts/jquery.min.js').should include('jQuery')
81
99
  end
82
100
 
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'
101
+ context "with multiple files" do
102
+ before do
103
+ write 'Vendorfile', "
86
104
  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
105
+ file 'public/javascripts/jquery.js.min', 'http://code.jquery.com/jquery-latest.min.js'
106
+ "
107
+ vendorer
108
+ read('public/javascripts/jquery.js').should include('jQuery')
109
+ read('public/javascripts/jquery.js.min').should include('jQuery')
110
+
111
+ write('public/javascripts/jquery.js', 'Foo')
112
+ write('public/javascripts/jquery.js.min', 'Foo')
113
+ end
114
+
115
+ it "updates a single file when update is called with the file" do
116
+ vendorer 'update public/javascripts/jquery.js.min'
117
+ size('public/javascripts/jquery.js.min').should > 300
118
+ size('public/javascripts/jquery.js').should == 3
119
+ end
120
+
121
+ it "does not update a file that starts with the same path" do
122
+ vendorer 'update public/javascripts/jquery.js'
123
+ size('public/javascripts/jquery.js').should > 300
124
+ size('public/javascripts/jquery.js.min').should == 3
125
+ end
97
126
  end
98
- end
99
127
 
100
- it "fails with a nice message if the Vendorfile is broken" do
101
- write 'Vendorfile', "file 'xxx.js', 'http://NOTFOUND'"
102
- result = run '', :raise => true
103
- # different errors on travis / local
104
- raise result unless result.include?("resolve host 'NOTFOUND'") or result.include?('Downloaded empty file')
128
+ it "does not change file modes" do
129
+ simple_vendorfile
130
+ vendorer
131
+ run 'chmod 711 public/javascripts/jquery.min.js'
132
+ lambda{
133
+ vendorer 'update'
134
+ }.should_not change{ run('ls -l public/javascripts').split("\n") }
135
+ end
105
136
  end
106
137
 
107
138
  context "with a passed block" do
@@ -111,67 +142,70 @@ describe Vendorer do
111
142
  end
112
143
 
113
144
  it "runs the block after update" do
114
- run.should include(@output)
145
+ vendorer.should include(@output)
115
146
  end
116
147
 
117
148
  it "does not run the block when not updating" do
118
- run
119
- run.should_not include(@output)
149
+ vendorer
150
+ vendorer.should_not include(@output)
120
151
  end
121
152
  end
122
153
  end
123
154
 
124
155
  describe '.folder' do
125
- it "can download via hash syntax" do
156
+ before do
157
+ write 'Vendorfile', "folder 'its_recursive', '../../.git'"
158
+ end
159
+
160
+ it "can download from remote" do
126
161
  write 'Vendorfile', "folder 'vendor/plugins/parallel_tests', 'https://github.com/grosser/parallel_tests.git'"
127
- run
162
+ vendorer
128
163
  ls('vendor/plugins').should == ["parallel_tests"]
129
164
  read('vendor/plugins/parallel_tests/Gemfile').should include('parallel')
130
165
  end
131
166
 
132
167
  it "reports errors when the Vendorfile is broken" do
133
168
  write 'Vendorfile', "folder 'vendor/plugins/parallel_tests', 'https://blob'"
134
- output = run '', :raise => true
169
+ output = vendorer '', :raise => true
135
170
  # different errors on travis / local
136
171
  raise unless output.include?('Connection refused') or output.include?('resolve host')
137
172
  end
138
173
 
139
- context "with a fast,local repository" do
140
- before do
141
- write 'Vendorfile', "folder 'its_recursive', '../../.git'"
142
- run
143
- end
144
-
145
- it "can download" do
146
- ls('').should == ["its_recursive", "Vendorfile"]
147
- read('its_recursive/Gemfile').should include('rake')
148
- end
174
+ it "can download from local" do
175
+ vendorer
176
+ ls('').should == ["its_recursive", "Vendorfile"]
177
+ read('its_recursive/Gemfile').should include('rake')
178
+ end
149
179
 
150
- it "does not keep .git folder so everything can be checked in" do
151
- ls('its_recursive/.git').first.should include('cannot access')
152
- end
180
+ it "does not keep .git folder so everything can be checked in" do
181
+ vendorer
182
+ ls('its_recursive/.git').first.should include('cannot access')
183
+ end
153
184
 
154
- it "does not update an existing folder" do
155
- write('its_recursive/Gemfile', 'Foo')
156
- run
157
- read('its_recursive/Gemfile').should == 'Foo'
158
- end
185
+ it "does not update an existing folder" do
186
+ vendorer
187
+ write('its_recursive/Gemfile', 'Foo')
188
+ vendorer
189
+ read('its_recursive/Gemfile').should == 'Foo'
190
+ end
159
191
 
160
- it "can update a folder" do
192
+ describe 'update' do
193
+ it "updates a folder" do
194
+ vendorer
161
195
  write('its_recursive/Gemfile', 'Foo')
162
- run 'update'
196
+ vendorer 'update'
163
197
  read('its_recursive/Gemfile').should include('rake')
164
198
  end
165
199
 
166
- it "can update a single file" do
200
+ it "can update a specific folder" do
167
201
  write 'Vendorfile', "
168
202
  folder 'its_recursive', '../../.git'
169
203
  folder 'its_really_recursive', '../../.git'
170
204
  "
171
- run
205
+ vendorer
172
206
  write('its_recursive/Gemfile', 'Foo')
173
207
  write('its_really_recursive/Gemfile', 'Foo')
174
- run 'update its_recursive'
208
+ vendorer 'update its_recursive'
175
209
  size('its_really_recursive/Gemfile').should == 3
176
210
  size('its_recursive/Gemfile').should > 30
177
211
  end
@@ -180,37 +214,100 @@ describe Vendorer do
180
214
  describe "git options" do
181
215
  it "can checkout by :ref" do
182
216
  write 'Vendorfile', "folder 'its_recursive', '../../.git', :ref => 'b1e6460'"
183
- run
217
+ vendorer
184
218
  read('its_recursive/Readme.md').should include('CODE EXAMPLE')
185
219
  end
186
220
 
187
221
  it "can checkout by :branch" do
188
222
  write 'Vendorfile', "folder 'its_recursive', '../../.git', :branch => 'b1e6460'"
189
- run
223
+ vendorer
190
224
  read('its_recursive/Readme.md').should include('CODE EXAMPLE')
191
225
  end
192
226
 
193
227
  it "can checkout by :tag" do
194
228
  write 'Vendorfile', "folder 'its_recursive', '../../.git', :tag => 'b1e6460'"
195
- run
229
+ vendorer
196
230
  read('its_recursive/Readme.md').should include('CODE EXAMPLE')
197
231
  end
198
232
  end
199
233
 
200
- context "with a passed block" do
234
+ context "with an execute after update block" do
201
235
  before do
202
236
  write 'Vendorfile', "folder('its_recursive', '../../.git'){|path| puts 'THE PATH IS ' + path }"
203
237
  @output = 'THE PATH IS its_recursive'
204
238
  end
205
239
 
206
240
  it "runs the block after update" do
207
- run.should include(@output)
241
+ vendorer.should include(@output)
208
242
  end
209
243
 
210
244
  it "does not run the block when not updating" do
211
- run
212
- run.should_not include(@output)
245
+ vendorer
246
+ vendorer.should_not include(@output)
247
+ end
248
+ end
249
+
250
+ context "with folder scoping" do
251
+ before do
252
+ write 'Vendorfile', "
253
+ folder 'public/javascripts' do
254
+ file 'jquery.js', 'http://code.jquery.com/jquery-latest.min.js'
255
+ end
256
+ "
257
+ end
258
+
259
+ it "can download a nested file" do
260
+ vendorer
261
+ read('public/javascripts/jquery.js').should include('jQuery')
262
+ end
263
+
264
+ it "can update a nested file" do
265
+ vendorer
266
+ write('public/javascripts/jquery.js','Foo')
267
+ vendorer 'update'
268
+ read('public/javascripts/jquery.js').should include('jQuery')
269
+ end
270
+
271
+ it "can update a whole folder" do
272
+ write 'Vendorfile', "
273
+ folder 'public/javascripts' do
274
+ file 'jquery.js', 'http://code.jquery.com/jquery-latest.min.js'
275
+ end
276
+ file 'xxx.js', 'http://code.jquery.com/jquery-latest.min.js'
277
+ "
278
+ vendorer
279
+ write('public/javascripts/jquery.js','Foo')
280
+ write('xxx.js','Foo')
281
+ vendorer 'update public/javascripts'
282
+ read('xxx.js').should == "Foo"
283
+ read('public/javascripts/jquery.js').should include('jQuery')
284
+ end
285
+
286
+ it "can be nested multiple times" do
287
+ write 'Vendorfile', "
288
+ folder 'public' do
289
+ folder 'javascripts' do
290
+ file 'jquery.js', 'http://code.jquery.com/jquery-latest.min.js'
291
+ end
292
+ end
293
+ "
294
+ vendorer
295
+ read('public/javascripts/jquery.js').should include('jQuery')
296
+ end
297
+ end
298
+ end
299
+
300
+ describe 'rewrite' do
301
+ it "can rewrite a file to change stuff" do
302
+ write "Vendorfile", "
303
+ file 'public/javascripts/jquery.min.js', 'http://code.jquery.com/jquery-latest.min.js' do |path|
304
+ rewrite(path){|content| content.gsub('j','h') }
213
305
  end
306
+ "
307
+ vendorer
308
+ content = read('public/javascripts/jquery.min.js')[0..100]
309
+ content.should_not include('jQuery')
310
+ content.should include('hQuery')
214
311
  end
215
312
  end
216
313
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vendorer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-14 00:00:00.000000000 Z
12
+ date: 2011-12-20 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email: michael@grosser.it
@@ -44,7 +44,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
44
44
  version: '0'
45
45
  segments:
46
46
  - 0
47
- hash: -442641517
47
+ hash: 138779027
48
48
  required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
@@ -53,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
53
53
  version: '0'
54
54
  segments:
55
55
  - 0
56
- hash: -442641517
56
+ hash: 138779027
57
57
  requirements: []
58
58
  rubyforge_project:
59
59
  rubygems_version: 1.8.10