skeletor 0.7.0 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
data/lib/skeletor/cli.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'thor'
|
2
|
+
require 'grayskull'
|
2
3
|
|
3
4
|
module Skeletor
|
4
5
|
|
@@ -44,8 +45,19 @@ module Skeletor
|
|
44
45
|
# Loads a template, creates a new *Validator* and validates the template
|
45
46
|
def validate(template)
|
46
47
|
skeleton = Skeletons::Loader.loadTemplate(template)
|
47
|
-
validator =
|
48
|
-
validator.validate
|
48
|
+
validator = Grayskull::Validator.new(skeleton,Skeletons::Skeleton::SCHEMA_FILE)
|
49
|
+
results = validator.validate
|
50
|
+
|
51
|
+
if !results['result']
|
52
|
+
puts 'Validation Failed with ' + @errors.count.to_s + ' errors';
|
53
|
+
puts ''
|
54
|
+
results["errors"].each{
|
55
|
+
|error|
|
56
|
+
puts error
|
57
|
+
}
|
58
|
+
else
|
59
|
+
puts 'Validated Successfully!'
|
60
|
+
end
|
49
61
|
end
|
50
62
|
|
51
63
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'grayskull'
|
2
|
+
|
1
3
|
module Skeletor
|
2
4
|
|
3
5
|
module Skeletons
|
@@ -7,18 +9,29 @@ module Skeletor
|
|
7
9
|
# default values for any missing sections.
|
8
10
|
class Skeleton
|
9
11
|
|
12
|
+
# Defines the location to the required schema file for the templates
|
13
|
+
SCHEMA_FILE = File.join Skeletons::Loader::TEMPLATE_PATH,'template-schema.yml'
|
14
|
+
|
10
15
|
#Creates a new *Skeleton* instance from `template`
|
11
16
|
def initialize(template)
|
12
17
|
|
13
18
|
begin
|
14
19
|
@template = Loader.loadTemplate(template)
|
15
|
-
validator = Validator.new(@template)
|
16
|
-
|
20
|
+
validator = Grayskull::Validator.new(@template,SCHEMA_FILE)
|
21
|
+
results = validator.validate
|
22
|
+
if results["result"]
|
23
|
+
puts "Validated Successfully!"
|
17
24
|
@directory_structure = @template["directory_structure"] || []
|
18
25
|
@tasks = @template["tasks"] || {}
|
19
26
|
@includes = @template["includes"] || {}
|
20
27
|
@path = @template["path"]
|
21
28
|
else
|
29
|
+
puts 'Validation Failed with ' + @errors.count.to_s + ' errors';
|
30
|
+
puts ''
|
31
|
+
results["errors"].each{
|
32
|
+
|error|
|
33
|
+
puts error
|
34
|
+
}
|
22
35
|
exit
|
23
36
|
end
|
24
37
|
rescue LoadError => e
|
data/lib/skeletor/skeletons.rb
CHANGED
data/lib/skeletor/version.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 8
|
8
|
+
- 4
|
9
|
+
version: 0.8.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Will McKenzie
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-10-02 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -23,13 +23,30 @@ dependencies:
|
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
segments:
|
29
29
|
- 0
|
30
|
-
|
30
|
+
- 14
|
31
|
+
- 6
|
32
|
+
version: 0.14.6
|
31
33
|
type: :runtime
|
32
34
|
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: grayskull
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
- 1
|
46
|
+
- 6
|
47
|
+
version: 0.1.6
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
33
50
|
description: Skeletor is a command line gem for creating project skeletons based on a YAML template. It will create files and folders, including pulling in specified includes, and run tasks to set up your project.
|
34
51
|
email:
|
35
52
|
- will@oinutter.co.uk
|
@@ -48,7 +65,6 @@ files:
|
|
48
65
|
- lib/skeletor/protocols/https.rb
|
49
66
|
- lib/skeletor/skeletons/loader.rb
|
50
67
|
- lib/skeletor/skeletons/skeleton.rb
|
51
|
-
- lib/skeletor/skeletons/validator.rb
|
52
68
|
- lib/skeletor/skeletons.rb
|
53
69
|
- lib/skeletor/tasks.rb
|
54
70
|
- lib/skeletor/version.rb
|
@@ -1,186 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
module Skeletor
|
4
|
-
|
5
|
-
module Skeletons
|
6
|
-
|
7
|
-
# *Validator* handles validation of the loaded project template files against
|
8
|
-
# the required schema
|
9
|
-
|
10
|
-
class Validator
|
11
|
-
|
12
|
-
# Defines the location to the required schema file for the templates
|
13
|
-
SCHEMA_FILE = File.join Skeletons::Loader::TEMPLATE_PATH,'template-schema.yml'
|
14
|
-
|
15
|
-
# Creates a new *Validator* instance
|
16
|
-
def initialize(template,schema=SCHEMA_FILE)
|
17
|
-
@errors = []
|
18
|
-
@template = template
|
19
|
-
@schema = Loader.loadTemplate(schema)
|
20
|
-
@types = @schema['types'] || {}
|
21
|
-
end
|
22
|
-
|
23
|
-
# Validates the template against the schema
|
24
|
-
def validate()
|
25
|
-
failed = []
|
26
|
-
|
27
|
-
@schema['sections'].each{
|
28
|
-
|section|
|
29
|
-
|
30
|
-
#check required sections are there
|
31
|
-
if (section['required'] && !@template.has_key?(section['name']))
|
32
|
-
@errors.push('Error: missing required section - ' + section['name'])
|
33
|
-
failed.push(section['name'])
|
34
|
-
elsif @template.has_key?(section['name'])
|
35
|
-
node = @template[section['name']]
|
36
|
-
validated = match_node(node,section,section['name'])
|
37
|
-
if(!validated)
|
38
|
-
failed.push(section['name'])
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
}
|
43
|
-
|
44
|
-
puts 'Result: ' + (failed.empty? ? 'Validated Successfully!' : 'Validation Failed!')
|
45
|
-
|
46
|
-
if !failed.empty? && !@errors.empty?
|
47
|
-
puts 'Validation Failed with ' + @errors.count.to_s + ' errors';
|
48
|
-
puts ''
|
49
|
-
@errors.each{
|
50
|
-
|error|
|
51
|
-
puts error
|
52
|
-
}
|
53
|
-
return false
|
54
|
-
else
|
55
|
-
return true
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
# Checks template node matches the schema.
|
61
|
-
#
|
62
|
-
# Checks type of node against expected type and
|
63
|
-
# checks any children are of the accepted types.
|
64
|
-
def match_node(node,expected,label)
|
65
|
-
|
66
|
-
#check type
|
67
|
-
if !check_type(node,expected['type'],label,expected['ok_empty'])
|
68
|
-
return false
|
69
|
-
end
|
70
|
-
|
71
|
-
if (node.kind_of?(Hash) || node.kind_of?(Array))
|
72
|
-
|
73
|
-
if node.empty? && !expected['ok_empty']
|
74
|
-
@errors.push('Error: node ' + label + ' cannot be empty')
|
75
|
-
return false
|
76
|
-
elsif !node.empty? && expected.has_key?('accepts')
|
77
|
-
valid_content = false
|
78
|
-
|
79
|
-
if node.kind_of?(Hash)
|
80
|
-
matched = []
|
81
|
-
unmatched = []
|
82
|
-
node.each_pair{
|
83
|
-
|key,value|
|
84
|
-
|
85
|
-
expected['accepts'].each{
|
86
|
-
|accepts|
|
87
|
-
|
88
|
-
result = check_type(value,accepts,key)
|
89
|
-
|
90
|
-
if result
|
91
|
-
matched.push(key)
|
92
|
-
if !unmatched.find_index(key).nil?
|
93
|
-
unmatched.slice(unmatched.find_index(key))
|
94
|
-
end
|
95
|
-
break
|
96
|
-
else
|
97
|
-
unmatched.push(key)
|
98
|
-
end
|
99
|
-
|
100
|
-
}
|
101
|
-
|
102
|
-
}
|
103
|
-
|
104
|
-
if(matched.count==node.count)
|
105
|
-
valid_content = true
|
106
|
-
else
|
107
|
-
unmatched.each{
|
108
|
-
|node|
|
109
|
-
|
110
|
-
@errors.push('Error: node ' + node + ' is not of an accepted type. Should be one of ' + expected['accepts'].join(', '))
|
111
|
-
}
|
112
|
-
end
|
113
|
-
|
114
|
-
elsif node.kind_of?(Array)
|
115
|
-
matched = []
|
116
|
-
unmatched = []
|
117
|
-
node.each_index{
|
118
|
-
|n|
|
119
|
-
|
120
|
-
expected['accepts'].each{
|
121
|
-
|accepts|
|
122
|
-
|
123
|
-
key = label + '[' + n.to_s + ']'
|
124
|
-
result = check_type(node[n],accepts,key)
|
125
|
-
|
126
|
-
if result
|
127
|
-
|
128
|
-
matched.push(key)
|
129
|
-
if !unmatched.find_index(key).nil?
|
130
|
-
unmatched.slice(unmatched.find_index(key))
|
131
|
-
end
|
132
|
-
break
|
133
|
-
else
|
134
|
-
unmatched.push(key)
|
135
|
-
end
|
136
|
-
|
137
|
-
}
|
138
|
-
}
|
139
|
-
|
140
|
-
if(matched.count==node.count)
|
141
|
-
valid_content = true
|
142
|
-
else
|
143
|
-
unmatched.each{
|
144
|
-
|node|
|
145
|
-
|
146
|
-
@errors.push('Error: node ' + node + ' is not of an accepted type. Should be one of ' + expected['accepts'].join(', '))
|
147
|
-
}
|
148
|
-
end
|
149
|
-
|
150
|
-
end
|
151
|
-
|
152
|
-
if !valid_content
|
153
|
-
@errors.push('Error: node ' + label + ' contains an unaccepted type.')
|
154
|
-
return false
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
end
|
159
|
-
|
160
|
-
return true
|
161
|
-
|
162
|
-
end
|
163
|
-
|
164
|
-
# Checks that the node is of the correct type
|
165
|
-
#
|
166
|
-
# If the expected node is a custom node type as defined in the schema
|
167
|
-
# It will run `match_node` to check that the node schema matches the
|
168
|
-
# custom type.
|
169
|
-
def check_type(node,expected_type,label,accept_nil = false)
|
170
|
-
|
171
|
-
valid_type = true;
|
172
|
-
if(@types.has_key?(expected_type))
|
173
|
-
valid_type = match_node(node,@types[expected_type],label)
|
174
|
-
elsif node.class.to_s != expected_type && !(node.kind_of?(NilClass) && (expected_type=='empty' || accept_nil))
|
175
|
-
valid_type = false
|
176
|
-
end
|
177
|
-
|
178
|
-
return valid_type
|
179
|
-
|
180
|
-
end
|
181
|
-
|
182
|
-
end
|
183
|
-
|
184
|
-
end
|
185
|
-
|
186
|
-
end
|