voog-kit 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,524 @@
1
+ require 'spec_helper'
2
+ require 'fileutils'
3
+ require 'json'
4
+ require 'ostruct'
5
+
6
+ describe Voog::Dtk::FileManager do
7
+ before :all do
8
+ Dir.mkdir 'TEST'
9
+ Dir.chdir 'TEST'
10
+ @filemanager = Voog::Dtk::FileManager.new(nil, false, true)
11
+ @dir = Dir.new('.')
12
+ end
13
+
14
+ describe '#create_asset' do
15
+ before :each do
16
+ @filemanager.create_folders
17
+ end
18
+
19
+ after :each do
20
+ FileUtils.rm_r Dir['**']
21
+ @filemanager.create_folders
22
+ end
23
+
24
+ context 'with no asset provided' do
25
+ it 'does not create any new files' do
26
+ @old_count = Dir['**/*'].length
27
+ @filemanager.create_asset
28
+ @new_count = Dir['**/*'].length
29
+ expect(@new_count).to eq(@old_count)
30
+ end
31
+ end
32
+
33
+ context 'with an invalid asset provided' do
34
+ it 'does not create any new files' do
35
+ @old_files = Dir['**/*']
36
+ @filemanager.create_asset OpenStruct.new(filename: '', asset_type: 'stylesheet')
37
+ @new_files = Dir['**/*']
38
+ expect((@new_files - @old_files).count).to eq(0)
39
+ end
40
+ end
41
+
42
+ context 'with a valid asset provided' do
43
+ before :each do
44
+ @old_files = Dir['**/*']
45
+ @filemanager.create_asset get_layout_asset
46
+ @new_files = Dir['**/*']
47
+ end
48
+ it 'creates a new file in the file system' do
49
+ expect(@new_files.count).to eq(@old_files.count + 1)
50
+ end
51
+
52
+ it 'creates a file with the same contents as the provided asset' do
53
+ expect(File.read(Dir.getwd + '/stylesheets/test.css')).to eq('test data')
54
+ end
55
+
56
+ it 'creates a file with the same name as the provided asset' do
57
+ expect(@new_files - @old_files).to eq(['stylesheets/test.css'])
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#create_layout' do
63
+ before :each do
64
+ @filemanager.create_folders
65
+ end
66
+
67
+ after :each do
68
+ FileUtils.rm_r Dir['**']
69
+ @filemanager.create_folders
70
+ end
71
+
72
+ context 'with no layout provided' do
73
+ it 'does not create any new files' do
74
+ @old_files = Dir['**/*']
75
+ @filemanager.create_asset
76
+ @new_files = Dir['**/*']
77
+ expect((@new_files - @old_files).count).to eq(0)
78
+ end
79
+ end
80
+
81
+ context 'with an invalid layout provided' do
82
+ it 'does not create any new files' do
83
+ @old_files = Dir['**/*']
84
+ @filemanager.create_asset OpenStruct.new('component' => nil, 'body' => false)
85
+ @new_files = Dir['**/*']
86
+ expect((@new_files - @old_files).count).to eq(0)
87
+ end
88
+ end
89
+
90
+ context 'with a valid layout provided' do
91
+ before :each do
92
+ @old_files = Dir['**/*']
93
+ @filemanager.create_layout get_layout
94
+ @new_files = Dir['**/*']
95
+ end
96
+
97
+ it 'creates a new file in the file system' do
98
+ expect(@new_files.count).to eq(@old_files.count + 1)
99
+ end
100
+
101
+ it 'creates a file with the same contents as the provided asset' do
102
+ expect(File.read(Dir.getwd + '/components/test.tpl')).to eq('test body')
103
+ end
104
+
105
+ it 'creates a file with the same name as the provided asset' do
106
+ expect(@new_files - @old_files).to eq(['components/test.tpl'])
107
+ end
108
+ end
109
+ end
110
+
111
+ describe '#create_folders' do
112
+
113
+ it 'creates all folders in the given list' do
114
+ @filemanager.create_folders
115
+ folders = %w(stylesheets images assets javascripts components layouts)
116
+ # check if the folders array is a subset of current directory's contents
117
+ expect((@dir.entries & folders).length).to eq(folders.length)
118
+ end
119
+ end
120
+
121
+ describe '#valid?' do
122
+ context 'with malformed data' do
123
+ it 'returns false' do
124
+ expect(@filemanager.valid?('{[... )')).to be false
125
+ end
126
+ end
127
+
128
+ context 'with empty' do
129
+ it 'returns false' do
130
+ expect(@filemanager.valid?('{}')).to be false
131
+ end
132
+ end
133
+
134
+ context 'with invalid data' do
135
+ it 'returns false' do
136
+ data = get_layouts
137
+ data.first.delete_field('title')
138
+ expect(@filemanager.valid?(data)).to be false
139
+ end
140
+ end
141
+
142
+ context 'with valid data' do
143
+ it 'returns true' do
144
+ expect(@filemanager.valid?(get_layouts)).to be true
145
+ end
146
+ end
147
+ end
148
+
149
+ describe '#generate_manifest' do
150
+ context 'with empty data' do
151
+ it 'doesn\'t generate a "manifest.json" file' do
152
+ @filemanager.generate_manifest(Hash.new, Hash.new)
153
+ expect(@dir.entries.include?('manifest.json')).to be false
154
+ end
155
+ end
156
+
157
+ context 'with valid data' do
158
+ let(:layouts) { get_layouts }
159
+ let(:layout_assets) { get_layout_assets }
160
+
161
+ it 'generates a "manifest.json" file' do
162
+ @filemanager.generate_manifest(layouts, layout_assets)
163
+ expect(@dir.entries.include?('manifest.json')).to be true
164
+ end
165
+
166
+ it 'writes valid data into "manifest.json"' do
167
+ @filemanager.generate_manifest(layouts, layout_assets)
168
+ @manifest = @filemanager.read_manifest
169
+ expect(@manifest['layouts'].first['title']).to eq(get_layouts.first.title)
170
+ expect(@manifest['assets'].first['content_type']).to eq(get_layout_assets.first.content_type)
171
+ end
172
+ end
173
+
174
+ context 'with invalid data' do
175
+ let(:layouts) { '"foo: { ]' }
176
+ let(:layout_assets) { 'bar": [.. )' }
177
+
178
+ it 'returns false' do
179
+ expect(@filemanager.generate_manifest(layouts, layout_assets)).to be false
180
+ end
181
+ end
182
+
183
+ end
184
+
185
+ describe '#add_to_manifest' do
186
+ before do
187
+ @filemanager.generate_manifest(get_layouts, get_layout_assets)
188
+ @old_manifest = @filemanager.read_manifest
189
+ end
190
+ context 'with empty data' do
191
+ it 'doesn\'t change the manifest file' do
192
+ @filemanager.add_to_manifest
193
+ @manifest = @filemanager.read_manifest
194
+ expect(@manifest['layouts'].length).to eq(@old_manifest['layouts'].length)
195
+ end
196
+ end
197
+
198
+ context 'with existing data' do
199
+ it 'doesn\'t add a duplicate file' do
200
+ testfiles = ['components/test_layout.tpl', 'layouts/testfile.tpl']
201
+ @filemanager.add_to_manifest testfiles
202
+ @manifest = @filemanager.read_manifest
203
+ expect(
204
+ @manifest['layouts'].select { |l| l['file'] == 'components/test_layout.tpl'}.length
205
+ ).to eq(1)
206
+ end
207
+ end
208
+
209
+ context 'with a single valid filename' do
210
+ it 'creates a new layout in the manifest' do
211
+ @filemanager.add_to_manifest 'components/testfile.tpl'
212
+ @manifest = @filemanager.read_manifest
213
+ expect(@manifest['layouts'].length).to eq(2)
214
+ end
215
+
216
+ it 'adds the correct data for the new layout' do
217
+ testfile = 'components/testfile.tpl'
218
+ @filemanager.add_to_manifest testfile
219
+ @manifest = @filemanager.read_manifest
220
+ new_layout = @manifest['layouts'].find{|l| l['file'] == testfile}
221
+ layout = {
222
+ 'content_type' => 'component',
223
+ 'component' => true,
224
+ 'file' => 'components/testfile.tpl',
225
+ 'layout_name' => 'testfile',
226
+ 'title' => 'testfile'
227
+ }
228
+ expect(new_layout).to eq(layout)
229
+ end
230
+ end
231
+
232
+ context 'with multiple valid filenames' do
233
+ it 'adds new layouts to the manifest file' do
234
+ testfiles = ['components/testfile2.tpl', 'components/testfile3.tpl']
235
+ @filemanager.add_to_manifest testfiles
236
+ @manifest = @filemanager.read_manifest
237
+ expect(@manifest['layouts'].length).to eq(1 + testfiles.length)
238
+ end
239
+
240
+ it 'adds the correct data for the new layouts' do
241
+ testfiles = ['components/testfile2.tpl', 'layouts/testfile3.tpl']
242
+ @filemanager.add_to_manifest testfiles
243
+ @manifest = @filemanager.read_manifest
244
+ new_layout = @manifest['layouts'].last
245
+ expect(new_layout).to eq(
246
+ 'content_type' => 'page',
247
+ 'component' => false,
248
+ 'file' => 'layouts/testfile3.tpl',
249
+ 'layout_name' => 'testfile3',
250
+ 'title' => 'Testfile3'
251
+ )
252
+ end
253
+ end
254
+
255
+ context 'with both valid and invalid filenames' do
256
+ it 'adds only valid files to the manifest' do
257
+ @old_manifest = @filemanager.read_manifest
258
+ testfiles = ['components/testfile2.tpl', 'javascripts/testfile.js', 'invalid/file']
259
+ @filemanager.add_to_manifest testfiles
260
+ @manifest = @filemanager.read_manifest
261
+ expect(@manifest['layouts'].length).to eq(@old_manifest['layouts'].length + 1)
262
+ expect(@manifest['assets'].length).to eq(@old_manifest['assets'].length + 1)
263
+ end
264
+
265
+ it 'does not add invalid files to the manifest' do
266
+
267
+ end
268
+ end
269
+ end
270
+
271
+ describe '#in_manifest?' do
272
+ before :all do
273
+ @manifest = JSON.parse(File.read(FIXTURE_PATH + '/manifest.json'))
274
+ end
275
+ context 'with a valid filename' do
276
+ it 'returns true if the file is in the manifest' do
277
+ filename = 'components/test_component.tpl'
278
+ expect(@filemanager.in_manifest?(filename, @manifest)).to eq(true)
279
+ end
280
+ it 'returns false if the file is not in the manifest' do
281
+ filename = 'components/wrong_file.tpl'
282
+ expect(@filemanager.in_manifest?(filename, @manifest)).to be_false
283
+ end
284
+ end
285
+ end
286
+
287
+ describe '#remove_from_manifest', focus: true do
288
+ before :all do
289
+ @filemanager.generate_manifest(get_layouts, get_layout_assets)
290
+ @filemanager.add_to_manifest ['components/testfile2.tpl', 'assets/test.svg']
291
+ @old_manifest = @filemanager.read_manifest
292
+ end
293
+
294
+ context 'with empty data' do
295
+ it 'doesn\'t remove anything from the manifest' do
296
+ @filemanager.remove_from_manifest
297
+ @manifest = @filemanager.read_manifest
298
+ expect(@manifest['layouts'].length).to eq(@old_manifest['layouts'].length)
299
+ end
300
+ end
301
+
302
+ context 'with invalid data' do
303
+ it 'doesn\'t remove anything from the manifest' do
304
+ @filemanager.remove_from_manifest 'files/testfile2.tpl'
305
+ @manifest = @filemanager.read_manifest
306
+ expect(@manifest['layouts'].length).to eq(@old_manifest['layouts'].length)
307
+ end
308
+ end
309
+
310
+ context 'with valid data' do
311
+ it 'removes the provided layouts from the manifest' do
312
+ @filemanager.remove_from_manifest ['components/testfile2.tpl', 'assets/test.svg']
313
+ @manifest = @filemanager.read_manifest
314
+ expect(@manifest['layouts'].length).to eq(@old_manifest['layouts'].length - 1)
315
+ expect(@manifest['assets'].length).to eq(@old_manifest['assets'].length - 1)
316
+ end
317
+ end
318
+ end
319
+
320
+ describe '#check' do
321
+ context 'with an empty folder' do
322
+ it 'returns false' do
323
+ expect(@filemanager.check).to be_false
324
+ end
325
+ end
326
+
327
+ context 'with empty manifest.json but no files' do
328
+ it 'returns false' do
329
+ File.open('manifest.json', 'w+') do |file|
330
+ file << {
331
+ 'layouts' => [],
332
+ 'assets' => []
333
+ }.to_json
334
+ end
335
+ expect(@filemanager.check).to be_false
336
+ end
337
+ end
338
+
339
+ context 'with filled manifest.json but no files' do
340
+ it 'returns false' do
341
+ File.open('manifest.json', 'w+') do |file|
342
+ file << {
343
+ 'layouts' => [{
344
+ "component" => false,
345
+ "content_type" => "page",
346
+ "file" => "layouts/front_page.tpl",
347
+ "layout_name" => "page_front",
348
+ "title" => "Front page"
349
+ }],
350
+ 'assets' => []
351
+ }.to_json
352
+ end
353
+ expect(@filemanager.check).to be_false
354
+ end
355
+ end
356
+ end
357
+
358
+ describe '#generate_local_manifest' do
359
+ before :each do
360
+ Dir.mkdir 'TEST'
361
+ Dir.chdir 'TEST'
362
+ end
363
+
364
+ after :each do
365
+ Dir.chdir '..'
366
+ FileUtils.rm_r 'TEST'
367
+ end
368
+
369
+ context 'with no local files or folders' do
370
+ before :each do
371
+ @dir = Dir.new('.')
372
+ @prev_entries = @dir.entries
373
+ end
374
+
375
+ after :each do
376
+ FileUtils.rm 'manifest.json' if File.exists? 'manifest.jsons'
377
+ end
378
+
379
+ it 'returns false' do
380
+ expect(@filemanager.generate_local_manifest).to be_false
381
+ end
382
+
383
+ it 'doesn\'t generate a manifest.json file' do
384
+ @filemanager.generate_local_manifest
385
+ expect(@dir.entries.length).to eq(@prev_entries.length)
386
+ end
387
+ end
388
+
389
+ context 'with empty folders' do
390
+ before :each do
391
+ FileUtils.mkdir 'layouts'
392
+ FileUtils.mkdir 'components'
393
+ end
394
+
395
+ after :each do
396
+ FileUtils.rm_r 'layouts'
397
+ FileUtils.rm_r 'components'
398
+ FileUtils.rm_r 'manifest.json' if File.exists? 'manifest.json'
399
+ end
400
+
401
+ it 'generates a manifest file' do
402
+ @filemanager.generate_local_manifest
403
+ expect(File.exists? 'manifest.json').to be_true
404
+ @manifest = @filemanager.read_manifest
405
+ end
406
+
407
+ it 'adds no layouts or components to the manifest' do
408
+ @filemanager.generate_local_manifest
409
+ @manifest = @filemanager.read_manifest
410
+ expect(@manifest['layouts'].length).to eq(0)
411
+ end
412
+
413
+ it 'returns true' do
414
+ expect(@filemanager.generate_local_manifest).to be_true
415
+ end
416
+ end
417
+
418
+ context 'with layout files' do
419
+ before :each do
420
+ FileUtils.mkdir ('layouts')
421
+ FileUtils.mkdir ('components')
422
+ File.open('layouts/front_page.tpl', 'w+')
423
+ end
424
+
425
+ after :each do
426
+ FileUtils.rm('layouts/front_page.tpl')
427
+ FileUtils.rm_r 'layouts'
428
+ FileUtils.rm_r 'components'
429
+ end
430
+
431
+ it 'adds the files to the manifest' do
432
+ @filemanager.generate_local_manifest
433
+ @manifest = @filemanager.read_manifest
434
+ expect(@manifest['layouts'].length).to eq(1)
435
+ end
436
+
437
+ it 'adds the files in a correct format to the manifest' do
438
+ @filemanager.generate_local_manifest
439
+ @manifest = @filemanager.read_manifest
440
+ layout = @manifest['layouts'].first
441
+ expect(layout['component']).to be_false
442
+ expect(layout['content_type']).to eq('page')
443
+ expect(layout['file']).to eq('layouts/front_page.tpl')
444
+ expect(layout['layout_name']).to eq('page_default')
445
+ expect(layout['title']).to eq('Front page')
446
+ end
447
+
448
+ it 'returns true' do
449
+ expect(@filemanager.generate_local_manifest).to be_true
450
+ end
451
+ end
452
+ end
453
+
454
+ describe '#fetch_boilerplate' do
455
+ context 'with no files in the working directory' do
456
+ before :each do
457
+ @prev_files = Dir['*']
458
+ end
459
+
460
+ after :each do
461
+ Dir['*'].each do |f|
462
+ FileUtils.rm_r f
463
+ end
464
+ end
465
+
466
+ it 'downloads and copies the boilerplate files' do
467
+ @filemanager.fetch_boilerplate
468
+ @files = Dir['*']
469
+ expected_files = [
470
+ 'assets', 'images',
471
+ 'components', 'javascripts',
472
+ 'layouts', 'stylesheets',
473
+ 'manifest.json'
474
+ ]
475
+ expect(expected_files & @files).to eq(expected_files)
476
+ end
477
+
478
+ it 'removes the \'tmp\' directory' do
479
+ @filemanager.fetch_boilerplate
480
+ @files = Dir['*']
481
+ expect(@files.include? 'tmp').to be_false
482
+ end
483
+
484
+ it 'returns true' do
485
+ expect(@filemanager.fetch_boilerplate).to be_true
486
+ end
487
+ end
488
+
489
+ context 'with files in the working directory' do
490
+ before :all do
491
+ @prev_files = Dir['*']
492
+ File.open('test.txt', 'w+')
493
+ File.open('manifest.json', 'w+') do |file| file << "[]" end
494
+ @old_manifest = File.open('manifest.json')
495
+ Dir.mkdir('test')
496
+ @return_value = @filemanager.fetch_boilerplate
497
+ @manifest = File.open('manifest.json')
498
+ end
499
+
500
+ after :all do
501
+ Dir['*'].each do |f|
502
+ FileUtils.rm_r f
503
+ end
504
+ end
505
+
506
+ it 'overwrites existing files' do
507
+ expect(@old_manifest.size).not_to eq(@manifest.size)
508
+ end
509
+
510
+ it 'doesn\'t modify other files' do
511
+ expect(@old_manifest.stat.mtime).not_to eq(@manifest.stat.mtime)
512
+ end
513
+
514
+ it 'returns true' do
515
+ expect(@return_value).to be_true
516
+ end
517
+ end
518
+ end
519
+
520
+ after :all do
521
+ Dir.chdir '..'
522
+ FileUtils.rm_r 'TEST'
523
+ end
524
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../lib/voog/dtk.rb'
2
+ require_relative '../lib/voog/dtk/filemanager.rb'
3
+ require_relative '../lib/voog/dtk/notifier.rb'
4
+
5
+ RSpec.configure do |c|
6
+ # filter_run is short-form alias for filter_run_including
7
+ c.filter_run focus: true
8
+ end
9
+
10
+ FIXTURE_PATH = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures'))
11
+
12
+ def get_layouts
13
+ JSON.parse(File.read(FIXTURE_PATH + '/layouts.json')).map do |layout|
14
+ OpenStruct.new(layout.to_h)
15
+ end
16
+ end
17
+
18
+ def get_layout_assets
19
+ JSON.parse(File.read(FIXTURE_PATH + '/layout_assets.json')).map do |asset|
20
+ OpenStruct.new(asset.to_h)
21
+ end
22
+ end
23
+
24
+ def get_layout_asset
25
+ OpenStruct.new(
26
+ JSON.parse(
27
+ File.read(FIXTURE_PATH + '/layout_asset.json')
28
+ ).to_h
29
+ )
30
+ end
31
+
32
+ def get_layout
33
+ OpenStruct.new(
34
+ JSON.parse(
35
+ File.read(FIXTURE_PATH + '/layout.json')
36
+ ).to_h
37
+ )
38
+ end
data/voog-kit.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'voog/dtk/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'voog-kit'
8
+ spec.version = Voog::Dtk::VERSION
9
+ spec.authors = ['Mikk Pristavka', 'Priit Haamer']
10
+ spec.email = ['mikk@fraktal.ee', 'priit@voog.com']
11
+ spec.description = %q{Tools that help Voog design development}
12
+ spec.summary = %q{Voog Developer Toolkit}
13
+ spec.homepage = 'http://voog.com/developers/voog-kit'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+ spec.bindir = 'bin'
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.3'
23
+ spec.add_development_dependency 'rake'
24
+ spec.add_development_dependency 'rspec'
25
+
26
+ spec.add_runtime_dependency 'gli', '2.10.0'
27
+ spec.add_runtime_dependency 'pry', '~> 0.9.12'
28
+ spec.add_runtime_dependency 'guard', '~> 2.3.0'
29
+ spec.add_runtime_dependency 'git'
30
+ spec.add_runtime_dependency 'parseconfig'
31
+ spec.add_runtime_dependency 'voog_api', '~> 0.0.7'
32
+ spec.add_runtime_dependency 'colorize'
33
+ spec.add_runtime_dependency 'mime-types', '~> 1.25.1'
34
+ end