ngi 0.2.3 → 0.3.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.
- checksums.yaml +4 -4
- data/Rakefile +7 -1
- data/bin/ngi +1 -31
- data/lib/config/{angular_init.config.json → backup/angular_init.config.json} +0 -0
- data/lib/config/backup/config.components.aliases.yml +3 -0
- data/lib/config/backup/config.components.yml +55 -0
- data/lib/config/backup/config.configurable.yml +1 -0
- data/lib/config/backup/config.languages.yml +5 -0
- data/lib/config/backup/config.yml +3 -0
- data/lib/config/backup/template-skeleton.js +93 -0
- data/lib/config/config.components.aliases.yml +3 -0
- data/lib/config/config.components.yml +55 -0
- data/lib/config/config.configurable.yml +2 -0
- data/lib/config/config.languages.yml +5 -0
- data/lib/config/config.yml +4 -0
- data/lib/ngi.rb +4 -7
- data/lib/ngi/configure.rb +236 -75
- data/lib/ngi/delegate.rb +3 -8
- data/lib/ngi/generator.rb +74 -46
- data/lib/ngi/parser.rb +97 -0
- data/lib/{templates → ngi/templates}/markup/html/default/index.html +0 -0
- data/lib/{templates → ngi/templates}/script/coffee/default/basic.js +0 -0
- data/lib/{templates → ngi/templates}/script/coffee/default/config.js +0 -0
- data/lib/{templates → ngi/templates}/script/coffee/default/constant.js +0 -0
- data/lib/{templates → ngi/templates}/script/coffee/default/module.js +0 -0
- data/lib/{templates → ngi/templates}/script/es5/default/basic.js +0 -0
- data/lib/{templates → ngi/templates}/script/es5/default/config.js +0 -0
- data/lib/{templates → ngi/templates}/script/es5/default/constant.js +0 -0
- data/lib/{templates → ngi/templates}/script/es5/default/module.js +0 -0
- data/lib/ngi/utils/command_parser.rb +90 -75
- data/lib/ngi/utils/current_dir.rb +20 -0
- data/lib/ngi/utils/jser.rb +45 -32
- data/lib/ngi/utils/user_input.rb +22 -0
- data/lib/ngi/utils/utils.rb +4 -21
- data/lib/ngi/version.rb +1 -1
- data/ngi.gemspec +2 -1
- data/test/config/config.components.aliases.yml +3 -0
- data/test/config/config.components.yml +55 -0
- data/test/config/config.configurable.yml +2 -0
- data/test/config/config.languages.yml +5 -0
- data/test/config/config.yml +4 -0
- data/test/finished_files/script/coffee/directive.finished.coffee +20 -0
- data/test/finished_files/script/es5/controller.finished.js +13 -0
- data/test/finished_files/script/es5/directive.finished.js +25 -0
- data/test/finished_files/script/es5/filter.finished.js +18 -0
- data/test/templates/markup/html/default/index.html +11 -0
- data/test/templates/script/coffee/default/basic.js +23 -0
- data/test/templates/script/coffee/default/config.js +12 -0
- data/test/templates/script/coffee/default/constant.js +7 -0
- data/test/templates/script/coffee/default/module.js +7 -0
- data/test/templates/script/es5/default/basic.js +29 -0
- data/test/templates/script/es5/default/config.js +13 -0
- data/test/templates/script/es5/default/constant.js +7 -0
- data/test/templates/script/es5/default/module.js +7 -0
- data/test/test_ngi.rb +274 -56
- data/test/testing_utils.rb +26 -0
- metadata +78 -36
- data/lib/dep/json.rb +0 -62
- data/lib/dep/json/add/bigdecimal.rb +0 -28
- data/lib/dep/json/add/complex.rb +0 -28
- data/lib/dep/json/add/core.rb +0 -11
- data/lib/dep/json/add/date.rb +0 -34
- data/lib/dep/json/add/date_time.rb +0 -50
- data/lib/dep/json/add/exception.rb +0 -31
- data/lib/dep/json/add/ostruct.rb +0 -31
- data/lib/dep/json/add/range.rb +0 -29
- data/lib/dep/json/add/rational.rb +0 -27
- data/lib/dep/json/add/regexp.rb +0 -30
- data/lib/dep/json/add/struct.rb +0 -30
- data/lib/dep/json/add/symbol.rb +0 -25
- data/lib/dep/json/add/time.rb +0 -38
- data/lib/dep/json/common.rb +0 -484
- data/lib/dep/json/ext.rb +0 -21
- data/lib/dep/json/ext/.keep +0 -0
- data/lib/dep/json/generic_object.rb +0 -70
- data/lib/dep/json/pure.rb +0 -21
- data/lib/dep/json/pure/generator.rb +0 -522
- data/lib/dep/json/pure/parser.rb +0 -359
- data/lib/dep/json/version.rb +0 -8
- data/test/sup/test.config.json +0 -100
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbad7c67486f004d161fbd0edbe47ec93bf3ffb3
|
4
|
+
data.tar.gz: ae9b49af3939e3805550532f6d5347d85218bb77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 017f5aa9bb956fb047eec65b14fde636a8e29c0a17a0feef887d22c5dfe5c8bbd49a8928c2244fb057b6d53ff460c183abc6731f204d7ebc6961efb418ebb486
|
7
|
+
data.tar.gz: 1772205977bb7e65530f2e735b4de58f92246ba1e376251d4023e41f2147ea64b77fee18227f11838d93670cfb148caa5a3997b080dc1090357d572a7c0ea44d
|
data/Rakefile
CHANGED
data/bin/ngi
CHANGED
@@ -5,36 +5,6 @@
|
|
5
5
|
# github.com/joshbeam/angular_init
|
6
6
|
# MIT License
|
7
7
|
|
8
|
-
# Ngi is the main module (src/ruby/angular_init.rb)
|
9
8
|
require_relative '../lib/ngi'
|
10
|
-
require_relative '../lib/ngi/utils/utils'
|
11
9
|
|
12
|
-
|
13
|
-
# of ngi
|
14
|
-
class Parser
|
15
|
-
CURRENT_DIR = File.dirname(__FILE__)
|
16
|
-
def self.parse(args)
|
17
|
-
p = Utils::CommandParser.new do |parser|
|
18
|
-
config_file = "#{CURRENT_DIR}/../lib/config/angular_init.config.json"
|
19
|
-
config = Ngi::Delegate::Configure.new(config_file).from_json
|
20
|
-
components = config['global']['components'].collect { |t| t['name'] }
|
21
|
-
types = Ngi::UserInput.new(valid_inputs: components)
|
22
|
-
|
23
|
-
parser.name = 'ngi'
|
24
|
-
parser.version = Ngi::VERSION
|
25
|
-
parser.banner << "\n(<command> can be one of the following)"
|
26
|
-
|
27
|
-
parser.on(types.valid_inputs, 'Create a new component') do |command|
|
28
|
-
Ngi::Delegate::Generator.run(type: command, config: config)
|
29
|
-
end
|
30
|
-
|
31
|
-
parser.on(['-o', '--options'], 'Configure ngi') do
|
32
|
-
Ngi::Delegate::Configure.run(write: true, file_path: config_file)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
p.parse(args)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
Parser.parse(ARGV)
|
10
|
+
Ngi::Parser.parse(ARGV)
|
File without changes
|
@@ -0,0 +1,55 @@
|
|
1
|
+
-
|
2
|
+
name: "directive"
|
3
|
+
type: "script"
|
4
|
+
using: "default"
|
5
|
+
template: "basic.js"
|
6
|
+
-
|
7
|
+
name: "controller"
|
8
|
+
type: "script"
|
9
|
+
using: "default"
|
10
|
+
template: "basic.js"
|
11
|
+
-
|
12
|
+
name: "factory"
|
13
|
+
type: "script"
|
14
|
+
using: "default"
|
15
|
+
template: "basic.js"
|
16
|
+
-
|
17
|
+
name: "service"
|
18
|
+
type: "script"
|
19
|
+
using: "default"
|
20
|
+
template: "basic.js"
|
21
|
+
-
|
22
|
+
name: "config"
|
23
|
+
type: "script"
|
24
|
+
using: "default"
|
25
|
+
template: "config.js"
|
26
|
+
-
|
27
|
+
name: "run"
|
28
|
+
type: "script"
|
29
|
+
using: "default"
|
30
|
+
template: "config.js"
|
31
|
+
-
|
32
|
+
name: "routes"
|
33
|
+
type: "script"
|
34
|
+
using: "default"
|
35
|
+
template: "config.js"
|
36
|
+
-
|
37
|
+
name: "filter"
|
38
|
+
type: "script"
|
39
|
+
using: "default"
|
40
|
+
template: "basic.js"
|
41
|
+
-
|
42
|
+
name: "module"
|
43
|
+
type: "script"
|
44
|
+
using: "default"
|
45
|
+
template: "module.js"
|
46
|
+
-
|
47
|
+
name: "constant"
|
48
|
+
type: "script"
|
49
|
+
using: "default"
|
50
|
+
template: "constant.js"
|
51
|
+
-
|
52
|
+
name: "index"
|
53
|
+
type: "markup"
|
54
|
+
using: "default"
|
55
|
+
template: "index.html"
|
@@ -0,0 +1 @@
|
|
1
|
+
- language
|
@@ -0,0 +1,93 @@
|
|
1
|
+
/*
|
2
|
+
Hello!
|
3
|
+
|
4
|
+
Use this file to create your own template to use with ngi.
|
5
|
+
|
6
|
+
Erase this tutorial when finished with your template.
|
7
|
+
|
8
|
+
Then, do the following in your terminal:
|
9
|
+
|
10
|
+
$ ngi -o
|
11
|
+
$ [?] Option: template
|
12
|
+
$ <file path>
|
13
|
+
$ [?] Language:
|
14
|
+
|
15
|
+
Example (basic.js)
|
16
|
+
==================
|
17
|
+
|
18
|
+
;(function(app) {
|
19
|
+
|
20
|
+
'use strict';
|
21
|
+
|
22
|
+
app.{{type}}('{{name}}',{{name}});
|
23
|
+
|
24
|
+
{{name}}.$inject = {{inject | array_string}};
|
25
|
+
|
26
|
+
function {{name}}({{inject | comma_delimited_variables}}) {
|
27
|
+
{% if directive %}
|
28
|
+
var d = {
|
29
|
+
restrict: 'A',
|
30
|
+
link: link
|
31
|
+
};
|
32
|
+
|
33
|
+
return d;
|
34
|
+
|
35
|
+
function link(scope, element, attrs) {
|
36
|
+
|
37
|
+
}
|
38
|
+
{% endif directive %}
|
39
|
+
{% if filter %}
|
40
|
+
return function(input) {
|
41
|
+
return;
|
42
|
+
}
|
43
|
+
{% endif filter %}
|
44
|
+
}
|
45
|
+
|
46
|
+
})(angular.module('{{module}}'));
|
47
|
+
|
48
|
+
Syntax
|
49
|
+
======
|
50
|
+
|
51
|
+
Use normal JavaScript or CoffeeScript syntax.
|
52
|
+
|
53
|
+
(1) Placeholders
|
54
|
+
|
55
|
+
Use the following *placeholders* in your template:
|
56
|
+
|
57
|
+
{{type}}
|
58
|
+
The type of component (directive, controller, etc. Type ngi -h to see the available components)
|
59
|
+
|
60
|
+
{{name}}
|
61
|
+
[?] <component> name: <user input>
|
62
|
+
The user will inject the name of the component here (e.g. MyAwesomeController)
|
63
|
+
|
64
|
+
{{inject | array_string}}
|
65
|
+
[?] Inject: <user input>
|
66
|
+
This will turn the user's input for the injectable components into an array
|
67
|
+
|
68
|
+
For example:
|
69
|
+
[?] Inject: someService, anotherService
|
70
|
+
=> ['someService', 'anotherService']
|
71
|
+
|
72
|
+
{{inject | comma_delimited_variables}}
|
73
|
+
[?] Inject: <user input>
|
74
|
+
This will turn the user's input for the injectable components into a
|
75
|
+
comma-delimited string of arguments
|
76
|
+
|
77
|
+
For example:
|
78
|
+
[?] Inject: someService, anotherService
|
79
|
+
=> 'someService', 'anotherService'
|
80
|
+
|
81
|
+
(2) Tags
|
82
|
+
|
83
|
+
Tags allow you to use the same template for multiple types of components.
|
84
|
+
For example, the above example template for "basic.js" allows you
|
85
|
+
to use the same template for multiple components, including controllers,
|
86
|
+
directives, and filters.
|
87
|
+
|
88
|
+
Use the following *tags* in your template:
|
89
|
+
|
90
|
+
{% if <component> %}
|
91
|
+
// conditional code here
|
92
|
+
{% endif <component> %}
|
93
|
+
*/
|
@@ -0,0 +1,55 @@
|
|
1
|
+
-
|
2
|
+
name: "directive"
|
3
|
+
type: "script"
|
4
|
+
using: "default"
|
5
|
+
template: "basic.js"
|
6
|
+
-
|
7
|
+
name: "controller"
|
8
|
+
type: "script"
|
9
|
+
using: "default"
|
10
|
+
template: "basic.js"
|
11
|
+
-
|
12
|
+
name: "factory"
|
13
|
+
type: "script"
|
14
|
+
using: "default"
|
15
|
+
template: "basic.js"
|
16
|
+
-
|
17
|
+
name: "service"
|
18
|
+
type: "script"
|
19
|
+
using: "default"
|
20
|
+
template: "basic.js"
|
21
|
+
-
|
22
|
+
name: "config"
|
23
|
+
type: "script"
|
24
|
+
using: "default"
|
25
|
+
template: "config.js"
|
26
|
+
-
|
27
|
+
name: "run"
|
28
|
+
type: "script"
|
29
|
+
using: "default"
|
30
|
+
template: "config.js"
|
31
|
+
-
|
32
|
+
name: "routes"
|
33
|
+
type: "script"
|
34
|
+
using: "default"
|
35
|
+
template: "config.js"
|
36
|
+
-
|
37
|
+
name: "filter"
|
38
|
+
type: "script"
|
39
|
+
using: "default"
|
40
|
+
template: "basic.js"
|
41
|
+
-
|
42
|
+
name: "module"
|
43
|
+
type: "script"
|
44
|
+
using: "default"
|
45
|
+
template: "module.js"
|
46
|
+
-
|
47
|
+
name: "constant"
|
48
|
+
type: "script"
|
49
|
+
using: "default"
|
50
|
+
template: "constant.js"
|
51
|
+
-
|
52
|
+
name: "index"
|
53
|
+
type: "markup"
|
54
|
+
using: "default"
|
55
|
+
template: "index.html"
|
data/lib/ngi.rb
CHANGED
@@ -3,17 +3,14 @@
|
|
3
3
|
# github.com/joshbeam/angular_init
|
4
4
|
# MIT License
|
5
5
|
|
6
|
-
CURRENT_DIR = File.dirname(__FILE__)
|
7
|
-
|
8
|
-
require_relative 'ngi/delegate'
|
9
|
-
require_relative 'ngi/utils/utils'
|
10
|
-
require_relative 'ngi/version'
|
11
|
-
|
12
6
|
# This module wraps the basic classes
|
13
7
|
# of the tool ngi (in other words, this
|
14
8
|
# module simply provides namespace)
|
15
9
|
module Ngi
|
10
|
+
require_relative 'ngi/delegate'
|
11
|
+
require_relative 'ngi/parser'
|
12
|
+
|
16
13
|
# REVIEW: Is this the best way to do it?
|
17
14
|
Delegate = ::Delegate
|
18
|
-
|
15
|
+
Parser = ::Parser
|
19
16
|
end
|
data/lib/ngi/configure.rb
CHANGED
@@ -3,19 +3,30 @@
|
|
3
3
|
# github.com/joshbeam/angular_init
|
4
4
|
# MIT License
|
5
5
|
|
6
|
-
#
|
6
|
+
# TODO: Method to clean out unused custom template files
|
7
7
|
|
8
|
-
require_relative '../dep/json'
|
9
8
|
require_relative 'utils/utils'
|
9
|
+
require 'fileutils'
|
10
|
+
require 'yaml'
|
10
11
|
|
11
12
|
# Run the user through an interactive
|
12
13
|
# session of configuring ngi
|
13
14
|
class Configure
|
14
15
|
attr_accessor :file, :location
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
17
|
+
JSer = Utils::JSer
|
18
|
+
Utils::CurrentDir.dir = File.dirname(__FILE__)
|
19
|
+
|
20
|
+
# STDIN is separated into a class so that
|
21
|
+
# it can be extracted and tested
|
22
|
+
class AcceptInput
|
23
|
+
def self.str(type)
|
24
|
+
case type
|
25
|
+
when :stripped
|
26
|
+
$stdin.gets.strip
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
19
30
|
|
20
31
|
# Here, we implement the virtual class "Utils::AskLoop"
|
21
32
|
# (see src/ruby/utils/utils.rb)
|
@@ -24,35 +35,179 @@ class Configure
|
|
24
35
|
class AskLoop < Utils::AskLoop
|
25
36
|
def self.ask(args)
|
26
37
|
puts "\nChoose from: #{args[:valid]}"
|
27
|
-
answer =
|
38
|
+
answer = AcceptInput.str(:stripped)
|
28
39
|
|
29
40
|
loop do
|
30
41
|
break if args[:check].include?(answer)
|
31
42
|
puts "Choose from: #{args[:valid]}\n(or press ctrl+c to exit)"
|
32
|
-
answer =
|
43
|
+
answer = AcceptInput.str(:stripped)
|
33
44
|
end
|
34
45
|
answer
|
35
46
|
end
|
36
47
|
end
|
37
48
|
|
49
|
+
# An extraction of the template file/directory for
|
50
|
+
# the generator... This way it can be separated, redefined,
|
51
|
+
# and tested.
|
52
|
+
class TemplateDir
|
53
|
+
attr_reader :d
|
54
|
+
|
55
|
+
def initialize(component, language, template)
|
56
|
+
@d = "#{Utils::CurrentDir.dir}/templates/"
|
57
|
+
@d << "#{component['type']}/#{language}"
|
58
|
+
@d << "/user/#{template}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def read
|
62
|
+
f = File.open(@d)
|
63
|
+
content = f.read
|
64
|
+
f.close
|
65
|
+
|
66
|
+
content
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
38
70
|
# Holds all the configure functions for the properties
|
39
71
|
# that are configurable
|
40
72
|
class Configurable
|
41
73
|
def self.language(config)
|
42
|
-
v =
|
74
|
+
v = JSer.new(config.lang_types).to_str
|
43
75
|
type = AskLoop.ask(check: config.lang_types, valid: v)
|
44
|
-
|
45
|
-
curr_lang = config.global['language'][type]
|
76
|
+
curr_lang = config.config['language'][type]
|
46
77
|
lang_opts = config.languages[type].reject { |l| l if curr_lang == l }
|
47
78
|
|
48
|
-
v =
|
79
|
+
v = JSer.new(lang_opts).to_str
|
49
80
|
language = AskLoop.ask(check: lang_opts, valid: v)
|
50
81
|
|
51
|
-
answer = config.
|
82
|
+
answer = config.config['language']
|
52
83
|
answer[type] = language
|
53
84
|
|
54
85
|
answer
|
55
86
|
end
|
87
|
+
|
88
|
+
def self.create_template_file(args)
|
89
|
+
component = args[:component]
|
90
|
+
language = args[:language]
|
91
|
+
template = args[:template]
|
92
|
+
|
93
|
+
template_dir = TemplateDir.new(component, language, template).d
|
94
|
+
|
95
|
+
destination = File.dirname(template_dir)
|
96
|
+
|
97
|
+
# Create the directory "user" unless it already exists
|
98
|
+
FileUtils.mkdir_p(destination) unless File.directory?(destination)
|
99
|
+
|
100
|
+
# The actual custom file
|
101
|
+
custom_file = template
|
102
|
+
|
103
|
+
# Copy the custom file into the new or existing "user" directory
|
104
|
+
if File.exist? custom_file
|
105
|
+
# TODO: Add a 'safety net' by checking if the user
|
106
|
+
# has already added the custom template before
|
107
|
+
# so that they don't overwrite it
|
108
|
+
FileUtils.cp(custom_file, destination)
|
109
|
+
else
|
110
|
+
puts "Cannot find custom template file: '#{custom_file}'
|
111
|
+
Check to make sure the custom template file exists,
|
112
|
+
and that you're in the correct directory of the custom template."
|
113
|
+
|
114
|
+
exit
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.templates(config)
|
119
|
+
v_c = JSer.new(config.components).to_str
|
120
|
+
component = AskLoop.ask(check: config.components, valid: v_c)
|
121
|
+
chosen_component = -> (c) { c['name'] == component }
|
122
|
+
|
123
|
+
print '[?] Use the following template file: '
|
124
|
+
file_name = AcceptInput.str(:stripped)
|
125
|
+
|
126
|
+
print '[?] What language is this template for?'
|
127
|
+
type = config.components_hash.find(&chosen_component)['type']
|
128
|
+
v_l = JSer.new(config.languages[type]).to_str
|
129
|
+
language = AskLoop.ask(check: config.languages[type], valid: v_l)
|
130
|
+
chosen_language = -> (t) { t['language'] == language }
|
131
|
+
|
132
|
+
# Our answer will be an empty array first,
|
133
|
+
# because Tempaltes: might not exist the
|
134
|
+
# config.yml file
|
135
|
+
answer = []
|
136
|
+
|
137
|
+
# Set the answer to Templates: from the config.yml
|
138
|
+
# file if it exists
|
139
|
+
answer = config.config['templates'] if config.config.key? 'templates'
|
140
|
+
|
141
|
+
# Then we want to see if the component already exists in
|
142
|
+
# the config file
|
143
|
+
exists = false
|
144
|
+
existing_component = answer.find(&chosen_component)
|
145
|
+
exists = true if !existing_component == false
|
146
|
+
|
147
|
+
if file_name != 'default'
|
148
|
+
if exists == true
|
149
|
+
# Remove the current existing component (it's already saved above)
|
150
|
+
answer = answer
|
151
|
+
.reject(&chosen_component)
|
152
|
+
|
153
|
+
# Remove the existing template object
|
154
|
+
existing_component['templates'] = existing_component['templates']
|
155
|
+
.reject(&chosen_language)
|
156
|
+
|
157
|
+
# Put in the updated template object
|
158
|
+
existing_component['templates'] << {
|
159
|
+
'language' => language,
|
160
|
+
'template' => file_name
|
161
|
+
}
|
162
|
+
|
163
|
+
# Push the existing component back into the templates array
|
164
|
+
answer << existing_component
|
165
|
+
|
166
|
+
elsif exists == false
|
167
|
+
|
168
|
+
# If it isn't already there,
|
169
|
+
# go ahead and add it to the templates array
|
170
|
+
answer << {
|
171
|
+
'name' => component,
|
172
|
+
'type' => type,
|
173
|
+
'templates' => [
|
174
|
+
{
|
175
|
+
'language' => language,
|
176
|
+
'template' => file_name
|
177
|
+
}
|
178
|
+
]
|
179
|
+
}
|
180
|
+
end
|
181
|
+
|
182
|
+
create_template_file(
|
183
|
+
config: config.config,
|
184
|
+
component: answer.last,
|
185
|
+
language: language,
|
186
|
+
template: file_name
|
187
|
+
)
|
188
|
+
else
|
189
|
+
# If default is chosen as the template,
|
190
|
+
# then delete the template from the templates
|
191
|
+
# array for that component
|
192
|
+
answer
|
193
|
+
.find(&chosen_component)['templates']
|
194
|
+
.delete_if(&chosen_language)
|
195
|
+
|
196
|
+
# If the templates array of the component
|
197
|
+
# is empty, then delete the entire component
|
198
|
+
# from the answer
|
199
|
+
answer
|
200
|
+
.delete_if(&chosen_component) if answer
|
201
|
+
.find(&chosen_component)['templates']
|
202
|
+
.size == 0
|
203
|
+
end
|
204
|
+
|
205
|
+
if answer.size == 0
|
206
|
+
nil
|
207
|
+
else
|
208
|
+
answer
|
209
|
+
end
|
210
|
+
end
|
56
211
|
end
|
57
212
|
|
58
213
|
# Make Questioner accesible as in: Configure::Questioner.run()
|
@@ -62,44 +217,38 @@ class Configure
|
|
62
217
|
# options (like language to use, templates, etc.)
|
63
218
|
class Questioner
|
64
219
|
attr_accessor :file
|
65
|
-
attr_reader :
|
66
|
-
:languages,
|
67
|
-
:
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
# The options for languages to use
|
76
|
-
@languages = @global['languages']
|
77
|
-
|
220
|
+
attr_reader :configurable,
|
221
|
+
:languages,
|
222
|
+
:config,
|
223
|
+
:components,
|
224
|
+
:components_hash,
|
225
|
+
:lang_types
|
226
|
+
|
227
|
+
def initialize(args)
|
228
|
+
@languages = args[:languages]
|
78
229
|
language_types = @languages.select do |type, languages|
|
79
230
|
type if languages.size > 1
|
80
231
|
end
|
81
|
-
# For example, ['script','markup']
|
82
232
|
@lang_types = language_types.collect { |type, _| type }.flatten
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
@configurable =
|
87
|
-
|
88
|
-
# An array of the properties that the user is allowed to configure,
|
89
|
-
# according to src/config/angular_init.config.json
|
90
|
-
@configurable_properties = @configurable.collect { |_k, v| v }
|
233
|
+
@components_hash = args[:components_hash]
|
234
|
+
@components = args[:components]
|
235
|
+
@config = args[:config]
|
236
|
+
@configurable = args[:configurable]
|
91
237
|
|
92
238
|
yield(self) if block_given?
|
93
239
|
end
|
94
240
|
|
95
241
|
def choose_configurable_property
|
96
|
-
|
97
|
-
|
242
|
+
puts "Current settings\n================"
|
243
|
+
@configurable.each_with_index do |p, i|
|
244
|
+
json_string = 'Currently using default settings'
|
245
|
+
json_string = JSer.new(@config[p]).to_str if @config.key? p
|
246
|
+
puts "#{i + 1}) #{p.capitalize}: #{json_string}"
|
98
247
|
end
|
99
248
|
|
100
|
-
valid =
|
249
|
+
valid = JSer.new(@configurable).to_str
|
101
250
|
# return
|
102
|
-
AskLoop.ask(check: @
|
251
|
+
AskLoop.ask(check: @configurable, valid: valid)
|
103
252
|
end
|
104
253
|
|
105
254
|
# This method delegates to the appropriate
|
@@ -109,8 +258,10 @@ class Configure
|
|
109
258
|
# from_json config object from config/angular_init.config.json
|
110
259
|
def configure_property(property)
|
111
260
|
case property
|
112
|
-
when
|
261
|
+
when 'language'
|
113
262
|
return Configurable.language(self)
|
263
|
+
when 'templates'
|
264
|
+
return Configurable.templates(self)
|
114
265
|
end
|
115
266
|
end
|
116
267
|
|
@@ -130,11 +281,14 @@ class Configure
|
|
130
281
|
# Hash from_json object that came from
|
131
282
|
# config/angular_init.config.json
|
132
283
|
# and is inside of this instance of Questioner
|
133
|
-
q.
|
284
|
+
q.config[property] = result
|
285
|
+
|
286
|
+
# delete any properties that are nil
|
287
|
+
q.config.delete_if { |_, v| v.nil? }
|
134
288
|
|
135
289
|
# This just tells the user that we were
|
136
290
|
# successful
|
137
|
-
result_string_hash =
|
291
|
+
result_string_hash = JSer.new(result).to_str rescue 'null'
|
138
292
|
puts "#{property.capitalize} set to: #{result_string_hash}"
|
139
293
|
end
|
140
294
|
|
@@ -142,42 +296,57 @@ class Configure
|
|
142
296
|
# (For example, Configure might write this
|
143
297
|
# new hash as a JSON file to
|
144
298
|
# config/angular_init.config.json)
|
145
|
-
questioner.
|
299
|
+
questioner.config
|
146
300
|
end
|
147
301
|
end
|
148
302
|
|
149
303
|
# The only thing we do here is load the JSON config file basically
|
150
304
|
# as just a string in JSON format.
|
151
305
|
# It will be converted to a Ruby hash in from_json below
|
152
|
-
def initialize(location)
|
153
|
-
|
154
|
-
|
306
|
+
def initialize(location = nil)
|
307
|
+
unless location.nil?
|
308
|
+
@location = location
|
309
|
+
f = File.open(@location, 'r')
|
310
|
+
@file = f.read
|
311
|
+
f.close
|
312
|
+
end
|
155
313
|
|
156
314
|
yield(self) if block_given?
|
157
315
|
end
|
158
316
|
|
159
317
|
# Convert the file to a Ruby hash
|
160
|
-
def from_json
|
161
|
-
|
318
|
+
# def from_json
|
319
|
+
# JSON.parse(@file)
|
320
|
+
# end
|
321
|
+
|
322
|
+
# Convert the file to a Ruby hash
|
323
|
+
# Usage: Configure.new('file/path').to_ruby(from: 'yaml')
|
324
|
+
def to_ruby(args)
|
325
|
+
case args[:from]
|
326
|
+
when 'json'
|
327
|
+
JSON.parse(@file)
|
328
|
+
when 'yaml'
|
329
|
+
YAML.load(@file)
|
330
|
+
end
|
162
331
|
end
|
163
332
|
|
164
|
-
#
|
165
|
-
#
|
166
|
-
|
167
|
-
|
333
|
+
# Convert the file from a Ruby hash
|
334
|
+
# into whatever language is specified
|
335
|
+
# Usage: <Configure instance>.from_ruby(to: 'yaml')
|
336
|
+
def from_ruby(args)
|
337
|
+
case args[:to]
|
338
|
+
when 'json'
|
168
339
|
JSON.pretty_generate(@file)
|
169
|
-
|
170
|
-
@file
|
340
|
+
when 'yaml'
|
341
|
+
@file.to_yaml
|
171
342
|
end
|
172
343
|
end
|
173
344
|
|
174
345
|
# Here we actually write the new JSON config file
|
175
346
|
# to config/angular_init.config.json
|
176
|
-
def write
|
177
|
-
|
178
|
-
|
179
|
-
File.open(@location, 'w') do |f|
|
180
|
-
f.write(new_file)
|
347
|
+
def write(args)
|
348
|
+
File.open(args[:destination], 'w') do |f|
|
349
|
+
f.write(args[:file])
|
181
350
|
f.close
|
182
351
|
end
|
183
352
|
end
|
@@ -190,23 +359,15 @@ class Configure
|
|
190
359
|
# to actually write the file in JSON format
|
191
360
|
# to config/angular_init.config.json
|
192
361
|
def self.run(args)
|
193
|
-
Configure.new
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
# configured it with Questioner
|
203
|
-
c.file = Configure::Questioner.run(json_file)
|
204
|
-
|
205
|
-
# We'll write the hash to
|
206
|
-
# config/angular_init.config.json.
|
207
|
-
# Configure#write converts the Hash
|
208
|
-
# to JSON and then uses File.write
|
209
|
-
c.write if args[:write] == true
|
362
|
+
Configure.new do |c|
|
363
|
+
c.file = Configure::Questioner.run(args)
|
364
|
+
|
365
|
+
if args[:write] == true
|
366
|
+
c.write(
|
367
|
+
destination: args[:destination],
|
368
|
+
file: c.from_ruby(to: args[:to])
|
369
|
+
)
|
370
|
+
end
|
210
371
|
end
|
211
372
|
end
|
212
373
|
end
|