kumogata 0.4.18 → 0.4.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c52814103c4dfd004239aeb9cd54b86323b8d1a
4
- data.tar.gz: bc647f27a50468920365f9b6ddb18975668ebe37
3
+ metadata.gz: a626076a8776de3b3f80ff1627fa21753236f73c
4
+ data.tar.gz: 2b532df5a2e844ceb3ea69d791fb1d2fcc30fc5b
5
5
  SHA512:
6
- metadata.gz: 12b445111efc2f36caf2ca79f1ec7aa0e6dcb37921188882124fe0674400a7552b0832fdb663505a24eafb3d91cccdd774a34836550f69390438e17b11057a8e
7
- data.tar.gz: c547e1adc47c4e4e719fe3f10997b031ac41576c92ca46322b09badd890d836e0da6b9887083050be32e13fc8f9cbf1d6ef84d795ea51e7d7d79ce6214fb1625
6
+ metadata.gz: cfbc840b9761ff339e536a6e4e43c8a27866c910454ffb8f0783ff2ec446d3a691025dd9db4ae9c16d2f85f1310e6b864a74442cbb7f00bf0356833a9902b163
7
+ data.tar.gz: 71cc9feed08e69b16523136b607f5c7f2184ac7a8f5855dd0d3d9a53e59bcfd7c3dcebe55f47f30f351124624f5385788a4f86a4f317f6fb9796e46ba077db1d
data/README.md CHANGED
@@ -9,6 +9,8 @@ It supports the following format:
9
9
  * Ruby
10
10
  * YAML
11
11
  * JavaScript
12
+ * CoffeeScript (experimental)
13
+ * JSON5 (experimental)
12
14
 
13
15
  [![Gem Version](https://badge.fury.io/rb/kumogata.png?201406152020)](http://badge.fury.io/rb/kumogata)
14
16
  [![Build Status](https://travis-ci.org/winebarrel/kumogata.svg?branch=master)](https://travis-ci.org/winebarrel/kumogata)
@@ -372,7 +374,7 @@ Status: 0
372
374
 
373
375
  ## JavaScript template
374
376
 
375
- You can also use the YAML template instead of JSON and Ruby.
377
+ You can also use the JavaScript template instead of JSON and Ruby.
376
378
 
377
379
  ```javascript
378
380
  function fetch_ami() {
@@ -431,6 +433,55 @@ function fetch_ami() {
431
433
 
432
434
  $ kumogata convert Drupal_Single_Instance.template --output-format=js
433
435
 
436
+ ## CoffeeScript template
437
+
438
+ You can also use the CoffeeScript template instead of JSON and Ruby.
439
+
440
+ ```coffeescript
441
+ fetch_ami = () -> "ami-XXXXXXXX"
442
+
443
+ /* For JS Object is evaluated last, it must use `return` */
444
+ return {
445
+ Resources:
446
+ myEC2Instance:
447
+ Type: "AWS::EC2::Instance",
448
+ Properties:
449
+ ImageId: fetch_ami(),
450
+ InstanceType: "t1.micro"
451
+ Outputs:
452
+ AZ: # comment
453
+ Value:
454
+ "Fn::GetAtt": [
455
+ "myEC2Instance",
456
+ "AvailabilityZone"
457
+ ]
458
+ }
459
+
460
+ ###
461
+ {
462
+ "Resources": {
463
+ "myEC2Instance": {
464
+ "Type": "AWS::EC2::Instance",
465
+ "Properties": {
466
+ "ImageId": "ami-XXXXXXXX",
467
+ "InstanceType": "t1.micro"
468
+ }
469
+ }
470
+ },
471
+ "Outputs": {
472
+ "AZ": {
473
+ "Value": {
474
+ "Fn::GetAtt": [
475
+ "myEC2Instance",
476
+ "AvailabilityZone"
477
+ ]
478
+ }
479
+ }
480
+ }
481
+ }
482
+ ###
483
+ ```
484
+
434
485
  ## YAML template
435
486
 
436
487
  You can also use the YAML template instead of JSON and Ruby.
@@ -477,6 +528,58 @@ Outputs:
477
528
 
478
529
  $ kumogata convert Drupal_Single_Instance.template --output-format=yaml
479
530
 
531
+ ## [JSON5](http://json5.org/) template
532
+
533
+ You can also use the [JSON5](http://json5.org/) template instead of JSON and Ruby.
534
+
535
+ ```javascript
536
+ {
537
+ Resources: { /* comment */
538
+ myEC2Instance: {
539
+ Type: "AWS::EC2::Instance",
540
+ Properties: {
541
+ ImageId: "ami-XXXXXXXX",
542
+ InstanceType: "t1.micro"
543
+ }
544
+ }
545
+ },
546
+ Outputs: {
547
+ AZ: { /* comment */
548
+ Value: {
549
+ "Fn::GetAtt": [
550
+ "myEC2Instance",
551
+ "AvailabilityZone"
552
+ ]
553
+ }
554
+ }
555
+ }
556
+ }
557
+
558
+ /*
559
+ {
560
+ "Resources": {
561
+ "myEC2Instance": {
562
+ "Type": "AWS::EC2::Instance",
563
+ "Properties": {
564
+ "ImageId": "ami-XXXXXXXX",
565
+ "InstanceType": "t1.micro"
566
+ }
567
+ }
568
+ },
569
+ "Outputs": {
570
+ "AZ": {
571
+ "Value": {
572
+ "Fn::GetAtt": [
573
+ "myEC2Instance",
574
+ "AvailabilityZone"
575
+ ]
576
+ }
577
+ }
578
+ }
579
+ }
580
+ */
581
+ ```
582
+
480
583
  ## Outputs Filter
481
584
 
482
585
  ```ruby
data/kumogata.gemspec CHANGED
@@ -20,11 +20,13 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency 'aws-sdk'
22
22
  spec.add_dependency 'coderay'
23
+ spec.add_dependency 'coffee-script'
23
24
  spec.add_dependency 'diffy'
24
25
  spec.add_dependency 'dslh', '>= 0.2.7'
25
26
  spec.add_dependency 'hashie'
26
27
  spec.add_dependency 'highline'
27
28
  spec.add_dependency 'json'
29
+ spec.add_dependency 'json5'
28
30
  spec.add_dependency 'net-ssh'
29
31
  spec.add_dependency 'retryable'
30
32
  spec.add_dependency 'term-ansicolor'
@@ -80,7 +80,7 @@ class Kumogata::ArgumentParser
80
80
  update_usage(opt)
81
81
 
82
82
  begin
83
- supported_formats = [:ruby, :json, :yaml, :js]
83
+ supported_formats = [:ruby, :json, :yaml, :js, :coffee, :json5]
84
84
  opt.on('-k', '--access-key ACCESS_KEY') {|v| options[:access_key_id] = v }
85
85
  opt.on('-s', '--secret-key SECRET_KEY') {|v| options[:secret_access_key] = v }
86
86
  opt.on('-r', '--region REGION') {|v| options[:region] = v }
@@ -41,18 +41,21 @@ class Kumogata::Client
41
41
  when :json then :ruby
42
42
  when :yaml then :json
43
43
  when :js then :json
44
+ when :json5 then :json
44
45
  end
45
46
  end
46
47
 
47
48
  case output_format
48
49
  when :ruby
49
50
  devaluate_template(template).chomp.colorize_as(:ruby)
50
- when :json
51
+ when :json, :json5
51
52
  JSON.pretty_generate(template).colorize_as(:json)
52
53
  when :yaml
53
54
  YAML.dump(template).colorize_as(:yaml)
54
55
  when :js
55
56
  '(' + JSON.pretty_generate(template).colorize_as(:json) + ')'
57
+ when :coffee
58
+ raise 'Output to CoffeeScript is not implemented'
56
59
  end
57
60
  end
58
61
 
@@ -174,6 +177,17 @@ class Kumogata::Client
174
177
  end
175
178
 
176
179
  Kumogata::Utils.stringify(obj.to_hash)
180
+ when :coffee
181
+ completed = CoffeeScript.compile(f.read)
182
+ obj = V8::Context.new.eval(completed)
183
+
184
+ unless obj.instance_of?(V8::Object)
185
+ raise "Invalid CoffeeScript template. Please return Object: #{path_or_url}"
186
+ end
187
+
188
+ Kumogata::Utils.stringify(obj.to_hash)
189
+ when :json5
190
+ JSON5.parse(f.read)
177
191
  else
178
192
  raise "Unknown format: #{format}"
179
193
  end
@@ -196,6 +210,10 @@ class Kumogata::Client
196
210
  :yaml
197
211
  when '.js'
198
212
  :js
213
+ when '.coffee'
214
+ :coffee
215
+ when '.json5'
216
+ :json5
199
217
  else
200
218
  :json
201
219
  end
@@ -1,3 +1,3 @@
1
1
  module Kumogata
2
- VERSION = '0.4.18'
2
+ VERSION = '0.4.19'
3
3
  end
data/lib/kumogata.rb CHANGED
@@ -4,11 +4,13 @@ require 'kumogata/version'
4
4
  require 'aws-sdk'
5
5
  require 'base64'
6
6
  require 'coderay'
7
+ require 'coffee-script'
7
8
  require 'diffy'
8
9
  require 'dslh'
9
10
  require 'hashie'
10
11
  require 'highline/import'
11
12
  require 'json'
13
+ require 'json5'
12
14
  require 'logger'
13
15
  require 'net/ssh'
14
16
  require 'open-uri'
@@ -225,6 +225,145 @@ end
225
225
  EOS
226
226
  end
227
227
 
228
+ it 'convert Ruby template to JSON5 template' do
229
+ template = <<-EOS
230
+ Resources do
231
+ myEC2Instance do
232
+ Type "AWS::EC2::Instance"
233
+ Properties do
234
+ ImageId "ami-XXXXXXXX"
235
+ InstanceType "t1.micro"
236
+ end
237
+ end
238
+ end
239
+
240
+ Outputs do
241
+ AZ do
242
+ Value do
243
+ Fn__GetAtt "myEC2Instance", "AvailabilityZone"
244
+ end
245
+ end
246
+ end
247
+ EOS
248
+
249
+ js_template = run_client(:convert, :template => template, :options => {:output_format => :json5})
250
+
251
+ expect(js_template).to eq <<-EOS.strip
252
+ {
253
+ "Resources": {
254
+ "myEC2Instance": {
255
+ "Type": "AWS::EC2::Instance",
256
+ "Properties": {
257
+ "ImageId": "ami-XXXXXXXX",
258
+ "InstanceType": "t1.micro"
259
+ }
260
+ }
261
+ },
262
+ "Outputs": {
263
+ "AZ": {
264
+ "Value": {
265
+ "Fn::GetAtt": [
266
+ "myEC2Instance",
267
+ "AvailabilityZone"
268
+ ]
269
+ }
270
+ }
271
+ }
272
+ }
273
+ EOS
274
+ end
275
+
276
+ it 'convert JSON5 template to Ruby template' do
277
+ template = <<-EOS
278
+ {
279
+ Resources: { /* comment */
280
+ myEC2Instance: {
281
+ Type: "AWS::EC2::Instance",
282
+ Properties: {
283
+ ImageId: "ami-XXXXXXXX",
284
+ InstanceType: "t1.micro"
285
+ }
286
+ }
287
+ },
288
+ Outputs: {
289
+ AZ: { /* comment */
290
+ Value: {
291
+ "Fn::GetAtt": [
292
+ "myEC2Instance",
293
+ "AvailabilityZone"
294
+ ]
295
+ }
296
+ }
297
+ }
298
+ }
299
+ EOS
300
+
301
+ ruby_template = run_client(:convert, :template => template, :template_ext => '.json5', :options => {:output_format => :ruby})
302
+
303
+ expect(ruby_template).to eq((<<-EOS).chomp)
304
+ Resources do
305
+ myEC2Instance do
306
+ Type "AWS::EC2::Instance"
307
+ Properties do
308
+ ImageId "ami-XXXXXXXX"
309
+ InstanceType "t1.micro"
310
+ end
311
+ end
312
+ end
313
+ Outputs do
314
+ AZ do
315
+ Value do
316
+ Fn__GetAtt "myEC2Instance", "AvailabilityZone"
317
+ end
318
+ end
319
+ end
320
+ EOS
321
+ end
322
+
323
+ it 'convert JavaScript template to Ruby template' do
324
+ template = <<-EOS
325
+ fetch_ami = () -> "ami-XXXXXXXX"
326
+
327
+ # comment
328
+ return {
329
+ Resources:
330
+ myEC2Instance:
331
+ Type: "AWS::EC2::Instance",
332
+ Properties:
333
+ ImageId: fetch_ami(),
334
+ InstanceType: "t1.micro"
335
+ Outputs:
336
+ AZ: # comment
337
+ Value:
338
+ "Fn::GetAtt": [
339
+ "myEC2Instance",
340
+ "AvailabilityZone"
341
+ ]
342
+ }
343
+ EOS
344
+
345
+ ruby_template = run_client(:convert, :template => template, :template_ext => '.coffee', :options => {:output_format => :ruby})
346
+
347
+ expect(ruby_template).to eq((<<-EOS).chomp)
348
+ Resources do
349
+ myEC2Instance do
350
+ Type "AWS::EC2::Instance"
351
+ Properties do
352
+ ImageId "ami-XXXXXXXX"
353
+ InstanceType "t1.micro"
354
+ end
355
+ end
356
+ end
357
+ Outputs do
358
+ AZ do
359
+ Value do
360
+ Fn__GetAtt "myEC2Instance", "AvailabilityZone"
361
+ end
362
+ end
363
+ end
364
+ EOS
365
+ end
366
+
228
367
  it 'convert YAML template to JSON template' do
229
368
  template = <<-EOS
230
369
  ---
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kumogata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.18
4
+ version: 0.4.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coffee-script
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: diffy
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - '>='
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: json5
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: net-ssh
113
141
  requirement: !ruby/object:Gem::Requirement