voog-kit 0.1.8

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.
@@ -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