dtk-dsl 1.0.0 → 1.0.1
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/lib/dsl/aux.rb +31 -0
- data/lib/dsl/directory_parser.rb +3 -7
- data/lib/dsl/dsl_version.rb +1 -0
- data/lib/dsl/file_generator/content_input/mixin.rb +2 -5
- data/lib/dsl/file_generator/content_input/tag/assignment.rb +32 -0
- data/lib/dsl/file_generator/content_input/tag/simple.rb +26 -0
- data/lib/dsl/file_generator/content_input/{tags.rb → tag.rb} +61 -23
- data/lib/dsl/file_generator/content_input.rb +1 -1
- data/lib/dsl/file_generator.rb +7 -0
- data/lib/dsl/file_parser.rb +1 -0
- data/lib/dsl/file_type/match.rb +68 -0
- data/lib/dsl/file_type/matching_files.rb +57 -0
- data/lib/dsl/file_type/subclasses.rb +71 -0
- data/lib/dsl/file_type.rb +120 -51
- data/lib/dsl/input_output_common/canonical/hash.rb +7 -1
- data/lib/dsl/input_output_common/canonical/hash_key.rb +20 -1
- data/lib/dsl/qualified_key.rb +2 -0
- data/lib/dsl/template/constant_class_mixin.rb +8 -9
- data/lib/dsl/template/generation/class_mixin.rb +6 -2
- data/lib/dsl/template/generation/mixin.rb +35 -20
- data/lib/dsl/template/loader.rb +1 -1
- data/lib/dsl/template/nested_dsl_file/mixin.rb +77 -0
- data/lib/dsl/template/nested_dsl_file.rb +25 -0
- data/lib/dsl/template/parsing/class_mixin.rb +8 -9
- data/lib/dsl/template/parsing/mixin.rb +31 -8
- data/lib/dsl/template/v1/assembly.rb +13 -16
- data/lib/dsl/template/v1/common_module_summary.rb +1 -1
- data/lib/dsl/template/v1/component.rb +12 -8
- data/lib/dsl/template/v1/service_instance.rb +5 -3
- data/lib/dsl/template/v1/workflow.rb +108 -38
- data/lib/dsl/template/v1.rb +4 -0
- data/lib/dsl/template.rb +3 -0
- data/lib/dsl/version.rb +1 -1
- data/lib/dtk_dsl.rb +1 -0
- metadata +11 -4
- data/lib/dsl/directory_parser/path_info.rb +0 -62
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80e593bfb3fdafca2ec5659cb23d027021b12646
|
4
|
+
data.tar.gz: 719da019d2d90879ae54fb0cd5862644eef253fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5180a6a6ff23dff2c813d535b04885164bef6d45e397843c06cab7f5907cea83681846f62fae3025b4800074f2b5968d1e864f5e804261cdaa5013d37be14013
|
7
|
+
data.tar.gz: af53ec0c65ce2625bcc8bd2548e7c3e8a66e1748697565952eb9755d99cb4f24aba8cd0a5e42f7d6d6d90537064f2461ccddbe262dc893819dae12da02881eee
|
data/lib/dsl/aux.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
module DTK
|
19
|
+
module DSL
|
20
|
+
module Aux
|
21
|
+
def self.snake_to_camel_case(string)
|
22
|
+
::DTK::Common::Aux.snake_to_camel_case(string)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.camel_case_to_snake(string)
|
26
|
+
string.gsub(/(.)([A-Z])/,'\1_\2').downcase
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/dsl/directory_parser.rb
CHANGED
@@ -19,14 +19,10 @@
|
|
19
19
|
module DTK::DSL
|
20
20
|
# Abstract class; application that uses this library must provide a concrete class that inherits from this
|
21
21
|
class DirectoryParser
|
22
|
-
|
23
|
-
#
|
24
|
-
# opts can have keys
|
25
|
-
# :file_path - string
|
26
|
-
# :dir_path - string
|
27
|
-
# Returns FileObj that matches a file_typeo bject that matches a file_type in file_types
|
22
|
+
# file_types - a single or array of FileType
|
23
|
+
# Returns a FileObj that matches a file_type object that matches a file_type in file_types
|
28
24
|
# or returns nil if no match found
|
29
|
-
def self.matching_file_obj?(
|
25
|
+
def self.matching_file_obj?(_file_types, *_args)
|
30
26
|
raise Error::NoMethodForConcreteClass.new(self.class)
|
31
27
|
end
|
32
28
|
end
|
data/lib/dsl/dsl_version.rb
CHANGED
@@ -34,10 +34,7 @@ module DTK::DSL
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def add_tags!(new_tags)
|
37
|
-
|
38
|
-
new_tags = [new_tags] unless new_tags.kind_of?(::Array)
|
39
|
-
@tags += new_tags
|
40
|
-
@tags.uniq!
|
37
|
+
Tag.add_tags!(@tags, new_tags)
|
41
38
|
self
|
42
39
|
end
|
43
40
|
|
@@ -46,7 +43,7 @@ module DTK::DSL
|
|
46
43
|
end
|
47
44
|
|
48
45
|
def matches_tag_type?(tag_type)
|
49
|
-
!! @tags.find { |tag|
|
46
|
+
!! @tags.find { |tag| Tag.matches_tag_type?(tag_type, tag) }
|
50
47
|
end
|
51
48
|
|
52
49
|
def add_tags_to_obj?(obj, new_tags)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
module DTK::DSL
|
19
|
+
class FileGenerator::ContentInput
|
20
|
+
class Tag
|
21
|
+
class Assignment < self
|
22
|
+
attr_reader :value
|
23
|
+
def initialize(tag_name, tag_value)
|
24
|
+
super(tag_name)
|
25
|
+
@value = tag_value
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
module DTK::DSL
|
19
|
+
class FileGenerator::ContentInput
|
20
|
+
class Tag
|
21
|
+
class Simple < self
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -17,7 +17,57 @@
|
|
17
17
|
#
|
18
18
|
module DTK::DSL
|
19
19
|
class FileGenerator::ContentInput
|
20
|
-
|
20
|
+
class Tag
|
21
|
+
require_relative('tag/simple')
|
22
|
+
require_relative('tag/assignment')
|
23
|
+
|
24
|
+
attr_reader :name
|
25
|
+
def initialize(tag_name)
|
26
|
+
@name = tag_name
|
27
|
+
end
|
28
|
+
private :initialize
|
29
|
+
|
30
|
+
def self.create(tag_input)
|
31
|
+
tag =
|
32
|
+
if tag_input.kind_of?(::String) or tag_input.kind_of?(::Symbol)
|
33
|
+
Simple.new(tag_input.to_sym)
|
34
|
+
elsif tag_input.kind_of?(::Hash) and tag_input.size == 1
|
35
|
+
tag_name = tag_input.keys.first
|
36
|
+
if tag_name.kind_of?(::String) or tag_name.kind_of?(::Symbol)
|
37
|
+
tag_value = tag_input.values.first
|
38
|
+
Assignment.new(tag_name.to_sym, tag_value)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
raise Error, "Invalid form for a tag: #{tag_input.inspect}" unless tag
|
42
|
+
raise Error, "Invalid tag name '#{tag.name}'" unless tag.valid_tag_name?
|
43
|
+
tag
|
44
|
+
end
|
45
|
+
private_class_method :create
|
46
|
+
|
47
|
+
def self.add_tags!(tags, new_tags_input)
|
48
|
+
new_tags_input.each do |new_tag_input|
|
49
|
+
new_tag = create(new_tag_input)
|
50
|
+
new_tag_name = new_tag.name
|
51
|
+
unless match = tags.find { |tag| tag.name == new_tag_name }
|
52
|
+
tags << new_tag
|
53
|
+
else
|
54
|
+
raise_error_if_conflicting_tags(match, new_tag)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
tags
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.matches_tag_type?(tag_type, tag)
|
61
|
+
tag_type_split = split(tag_type)
|
62
|
+
tag_split = split(tag.name)
|
63
|
+
if tag_split.size >= tag_type_split.size
|
64
|
+
tag_type_split.each_with_index do |tag_type_part, i|
|
65
|
+
return nil unless tag_type_part == tag_split[i]
|
66
|
+
end
|
67
|
+
true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
21
71
|
#####
|
22
72
|
# In this module a 'tag_type' subsumes a tag and consitutes an element in BASE_LEVEL_TAGS or one its prefixes
|
23
73
|
#
|
@@ -27,35 +77,23 @@ module DTK::DSL
|
|
27
77
|
:desired__derived__default,
|
28
78
|
:desired__derived__propagated,
|
29
79
|
:actual,
|
30
|
-
:hidden
|
80
|
+
:hidden,
|
81
|
+
:dsl_location
|
31
82
|
]
|
32
83
|
|
33
|
-
def
|
34
|
-
|
35
|
-
tag_split = split(tag)
|
36
|
-
if tag_split.size >= tag_type_split.size
|
37
|
-
tag_type_split.each_with_index do |tag_type_part, i|
|
38
|
-
return nil unless tag_type_part == tag_split[i]
|
39
|
-
end
|
40
|
-
true
|
41
|
-
end
|
84
|
+
def valid_tag_name?
|
85
|
+
self.class.valid_tag_types.include?(name)
|
42
86
|
end
|
43
87
|
|
44
|
-
|
45
|
-
valid_tag_types.include?(tag_type)
|
46
|
-
end
|
88
|
+
private
|
47
89
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
err_msg = bad_tag_types.size == 1 ? "Invalid tag '#{bad_tag_types.first}'" : "Invalid tag_types: #{bad_tag_types.join(', ')}"
|
53
|
-
raise Error, err_msg
|
90
|
+
def raise_error_if_conflicting_tags(existing_tag, new_tag)
|
91
|
+
if (existing_tag.class != new_tag.class) or
|
92
|
+
(existing_tag.kind_of?(Assignment) and existing_tag.value != new_tag.value)
|
93
|
+
raise Error, "The tags (#{existing_tag.inspect}) and (#{new_tag.inspect}) are conflicting"
|
54
94
|
end
|
55
95
|
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
96
|
+
|
59
97
|
def self.valid_tag_types
|
60
98
|
@valid_tag_tag_types ||= compute_valid_tag_types
|
61
99
|
end
|
@@ -18,7 +18,7 @@
|
|
18
18
|
module DTK::DSL
|
19
19
|
class FileGenerator
|
20
20
|
class ContentInput < InputOutputCommon::Canonical
|
21
|
-
require_relative('content_input/
|
21
|
+
require_relative('content_input/tag')
|
22
22
|
require_relative('content_input/mixin')
|
23
23
|
# mixin must go before the files below
|
24
24
|
require_relative('content_input/hash')
|
data/lib/dsl/file_generator.rb
CHANGED
@@ -34,6 +34,13 @@ module DTK::DSL
|
|
34
34
|
template_class = Template.template_class(parse_template_type, dsl_version)
|
35
35
|
template_class.create_for_generation(content_input, opts).generate_yaml_text
|
36
36
|
end
|
37
|
+
|
38
|
+
# opts can have keys
|
39
|
+
# :filter
|
40
|
+
def self.generate_yaml_file_path__content_array(parse_template_type, top_file_path, content_input, dsl_version, opts = {})
|
41
|
+
template_class = Template.template_class(parse_template_type, dsl_version)
|
42
|
+
template_class.create_for_generation(content_input, opts).generate_yaml_file_path__content_array(top_file_path)
|
43
|
+
end
|
37
44
|
end
|
38
45
|
end
|
39
46
|
|
data/lib/dsl/file_parser.rb
CHANGED
@@ -57,6 +57,7 @@ module DTK::DSL
|
|
57
57
|
|
58
58
|
DSL_VERSION_KEY = 'dsl_version'
|
59
59
|
def self.dsl_version__raise_error_if_illegal(input_hash, file_obj)
|
60
|
+
raise Error::Usage, "Ill-formed DSL#{file_ref_in_error(file_obj)}" unless input_hash.kind_of?(::Hash)
|
60
61
|
if dsl_version = input_hash[DSL_VERSION_KEY]
|
61
62
|
unless DSLVersion.legal?(dsl_version)
|
62
63
|
raise Error::Usage, "Illegal DSL version '#{dsl_version}'#{file_ref_in_error(file_obj)}"
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module DTK::DSL
|
20
|
+
class FileType
|
21
|
+
class Match
|
22
|
+
def initialize(file_type)
|
23
|
+
@file_type = file_type
|
24
|
+
end
|
25
|
+
private :initialize
|
26
|
+
|
27
|
+
# opts can have keys:
|
28
|
+
# :exact (Booelan) - meaning regexp completely matches file_path; otherwise it means jsut match the end
|
29
|
+
def self.matches?(file_type, file_path, opts = {})
|
30
|
+
new(file_type).matches?(file_path, opts = {})
|
31
|
+
end
|
32
|
+
|
33
|
+
def matches?(file_path, opts = {})
|
34
|
+
file_path = remove_multiple_slashes(file_path)
|
35
|
+
if opts[:exact]
|
36
|
+
file_path =~ regexp_exact
|
37
|
+
else
|
38
|
+
# extra check to see if regexp is just for file part or has '/' seperators
|
39
|
+
# if just for file then we can have more restrictive match
|
40
|
+
if regexp.source =~ Regexp.new('/')
|
41
|
+
file_path =~ regexp_match_end
|
42
|
+
else
|
43
|
+
file_path.split('/').last =~ regexp_exact
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def remove_multiple_slashes(string)
|
51
|
+
string.split('/').reject { |el| el.empty?}.join('/')
|
52
|
+
end
|
53
|
+
|
54
|
+
def regexp
|
55
|
+
@regexp ||= @file_type.regexp
|
56
|
+
end
|
57
|
+
|
58
|
+
def regexp_exact
|
59
|
+
@regexp_exact ||= Regexp.new("^#{regexp.source}$")
|
60
|
+
end
|
61
|
+
|
62
|
+
def regexp_match_end
|
63
|
+
@regexp_match_end ||= Regexp.new("#{regexp.source}$")
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module DTK::DSL
|
20
|
+
class FileType
|
21
|
+
class MatchingFiles
|
22
|
+
attr_reader :file_type_instance, :file_paths
|
23
|
+
def initialize(file_type_instance)
|
24
|
+
@file_type_instance = file_type_instance
|
25
|
+
@file_paths = []
|
26
|
+
end
|
27
|
+
private :initialize
|
28
|
+
|
29
|
+
def add_file_path!(file_path)
|
30
|
+
@file_paths << file_path
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns array of MatchingFiles
|
35
|
+
def self.matching_files_array(file_type_classes, file_paths)
|
36
|
+
ndx_ret = {}
|
37
|
+
file_type_classes = [file_type_classes] unless file_type_classes.kind_of?(Array)
|
38
|
+
file_type_classes.each do |file_type_class|
|
39
|
+
file_paths.each do |file_path|
|
40
|
+
if file_type_instance = file_type_class.file_type_instance_if_match?(file_path)
|
41
|
+
file_type_instance_index = file_type_instance.index
|
42
|
+
if matching_index = ndx_ret.keys.find { |index| index == file_type_instance_index }
|
43
|
+
ndx_ret[matching_index].add_file_path!(file_path)
|
44
|
+
else
|
45
|
+
ndx_ret[file_type_instance_index] = new(file_type_instance).add_file_path!(file_path)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
ndx_ret.values
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2010-2016 dtk contributors
|
3
|
+
#
|
4
|
+
# This file is part of the dtk project.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module DTK::DSL
|
20
|
+
class FileType
|
21
|
+
class CommonModule < self
|
22
|
+
def self.top_level_type
|
23
|
+
:common_module
|
24
|
+
end
|
25
|
+
|
26
|
+
class DSLFile < self
|
27
|
+
class Top < self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class ServiceInstance < self
|
33
|
+
def self.top_level_type
|
34
|
+
:service_instance
|
35
|
+
end
|
36
|
+
|
37
|
+
class DSLFile < self
|
38
|
+
class Top < self
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class NestedModule < self
|
43
|
+
attr_reader :module_name
|
44
|
+
# params can have keys:
|
45
|
+
# :module_name (required)
|
46
|
+
def initialize(params = {})
|
47
|
+
unless @module_name = params[:module_name]
|
48
|
+
raise Error, "Unexpected that opts[:module_name] is nil"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def index
|
53
|
+
"#{super}--#{@module_name}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def canonical_path
|
57
|
+
self.class.canonical_path_lambda.call(:module_name => @module_name)
|
58
|
+
end
|
59
|
+
|
60
|
+
def base_dir
|
61
|
+
matching_type_def(:base_dir_lambda).call(:module_name => @module_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
class DSLFile < self
|
65
|
+
class Top < self
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/dsl/file_type.rb
CHANGED
@@ -17,62 +17,131 @@
|
|
17
17
|
#
|
18
18
|
|
19
19
|
module DTK::DSL
|
20
|
-
# This has specific file type meta info
|
21
20
|
class FileType
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
:regexp => "/dtk\.module\.(yml|yaml)/",
|
27
|
-
:canonical_path => 'dtk.module.yaml',
|
28
|
-
:backup_path => 'dtk.module.bak.yaml',
|
29
|
-
:print_name => 'module DSL file'
|
30
|
-
},
|
31
|
-
{
|
32
|
-
:type => :service_instance,
|
33
|
-
:regexp => "/dtk\.service\.(yml|yaml)/",
|
34
|
-
:canonical_path => 'dtk.service.yaml',
|
35
|
-
:backup_path => 'dtk.service.bak.yaml',
|
36
|
-
:print_name => 'service DSL file'
|
37
|
-
}
|
38
|
-
]
|
39
|
-
# regexps purposely do not have ^ or $ so calling function can insert these depending on context
|
40
|
-
|
41
|
-
Types.each do |type_info|
|
42
|
-
# convert to camel case
|
43
|
-
class_name = type_info[:type].to_s.gsub(/(?<=_|^)(\w)/){$1.upcase}.gsub(/(?:_)(\w)/,'\1')
|
44
|
-
class_eval("
|
45
|
-
class #{class_name} < self
|
46
|
-
def self.type
|
47
|
-
:#{type_info[:type]}
|
48
|
-
end
|
49
|
-
def self.print_name
|
50
|
-
'#{type_info[:print_name]}'
|
51
|
-
end
|
52
|
-
def self.canonical_path
|
53
|
-
'#{type_info[:canonical_path]}'
|
54
|
-
end
|
55
|
-
def self.backup_path
|
56
|
-
'#{type_info[:backup_path]}'
|
57
|
-
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def self.regexp
|
62
|
-
#{type_info[:regexp]}
|
63
|
-
end
|
64
|
-
end")
|
65
|
-
end
|
66
|
-
|
67
|
-
def self.create_path_info
|
68
|
-
DirectoryParser::PathInfo.new(regexp)
|
69
|
-
end
|
70
|
-
|
21
|
+
require_relative('file_type/subclasses')
|
22
|
+
require_relative('file_type/match')
|
23
|
+
require_relative('file_type/matching_files')
|
24
|
+
|
71
25
|
# opts can have keys:
|
72
26
|
# :exact - Booelan (default: false) - meaning regexp completely matches file_path
|
73
27
|
def self.matches?(file_path, opts = {})
|
74
|
-
|
28
|
+
Match.matches?(self, file_path, opts)
|
29
|
+
end
|
30
|
+
def matches?(file_path, opts = {})
|
31
|
+
Match.matches?(self, file_path, opts)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns array of MatchingFiles or nil
|
35
|
+
def self.matching_files_array?(file_type_classes, file_paths)
|
36
|
+
MatchingFiles.matching_files_array?(file_type_classes, file_paths)
|
37
|
+
end
|
38
|
+
|
39
|
+
SERVICE_INSTANCE_NESTED_MODULE_DIR = 'modules'
|
40
|
+
TYPES = {
|
41
|
+
CommonModule::DSLFile::Top => {
|
42
|
+
:regexp => Regexp.new("dtk\.module\.(yml|yaml)"),
|
43
|
+
:canonical_path_lambda => lambda { |_params| 'dtk.module.yaml' },
|
44
|
+
:print_name => 'module DSL file'
|
45
|
+
},
|
46
|
+
ServiceInstance::DSLFile::Top => {
|
47
|
+
:regexp => Regexp.new("dtk\.service\.(yml|yaml)"),
|
48
|
+
:canonical_path_lambda => lambda { |_params| 'dtk.service.yaml' },
|
49
|
+
:print_name => 'service DSL file'
|
50
|
+
},
|
51
|
+
ServiceInstance::NestedModule => {
|
52
|
+
:instance_match_lambda => lambda { |path| path =~ Regexp.new("^#{SERVICE_INSTANCE_NESTED_MODULE_DIR}/([^/]+)/.+$") && { :module_name => $1 } },
|
53
|
+
:base_dir_lambda => lambda { |params| "#{SERVICE_INSTANCE_NESTED_MODULE_DIR}/#{params[:module_name]}" },
|
54
|
+
:print_name => 'nested module file'
|
55
|
+
},
|
56
|
+
ServiceInstance::NestedModule::DSLFile::Top => {
|
57
|
+
:regexp => Regexp.new("#{SERVICE_INSTANCE_NESTED_MODULE_DIR}/[^/]+/dtk\.nested_module\.(yml|yaml)"),
|
58
|
+
:canonical_path_lambda => lambda { |params| "#{SERVICE_INSTANCE_NESTED_MODULE_DIR}/#{params[:module_name]}/dtk.nested_module.yaml" },
|
59
|
+
:print_name => 'nested module DSL file'
|
60
|
+
}
|
61
|
+
}
|
62
|
+
# regexps, except for one in :instance_match_lambda, purposely do not have ^ or $ so calling function can insert these depending on context
|
63
|
+
|
64
|
+
def self.print_name
|
65
|
+
matching_type_def(:print_name)
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.regexp
|
69
|
+
matching_type_def(:regexp)
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.canonical_path
|
73
|
+
canonical_path_lambda.call({})
|
74
|
+
end
|
75
|
+
# This can be over-written
|
76
|
+
def canonical_path
|
77
|
+
self.class.canonical_path
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.backup_path
|
81
|
+
backup_path_from_canonical_path(canonical_path)
|
82
|
+
end
|
83
|
+
def backup_path
|
84
|
+
self.class.backup_path_from_canonical_path(canonical_path)
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.base_dir
|
88
|
+
nil
|
75
89
|
end
|
90
|
+
# This can be over-written
|
91
|
+
def base_dir
|
92
|
+
self.class.base_dir
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
# If match it retuns a hash with params that can be used to create a File Type instance
|
97
|
+
def self.file_type_instance_if_match?(file_path)
|
98
|
+
# just want to match 'this' and dont want to match parent so not using matching_type_def
|
99
|
+
if instance_match_lambda = TYPES[self][:instance_match_lambda]
|
100
|
+
if hash_params_for_new = instance_match_lambda.call(file_path)
|
101
|
+
new(hash_params_for_new)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.type_level_type
|
107
|
+
raise Error::NoMethodForConcreteClass.new(self)
|
108
|
+
end
|
109
|
+
|
110
|
+
# This can be over-written
|
111
|
+
def index
|
112
|
+
self.class.to_s
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
BASE_CLASS = FileType
|
118
|
+
# The method matching_type_def starts at tpe and looks to see if or recursive parents have definition
|
119
|
+
def self.matching_type_def(key, klass = nil, orig_klass = nil)
|
120
|
+
klass ||= self
|
121
|
+
orig_klass ||= self
|
122
|
+
fail Error, "Type '#{orig_klass}' is not in TYPES" if klass == BASE_CLASS
|
123
|
+
if type_def_hash = TYPES[klass]
|
124
|
+
type_def_hash[key]
|
125
|
+
else
|
126
|
+
matching_type_def(key, klass.superclass, orig_klass)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
def matching_type_def(key)
|
130
|
+
self.class.matching_type_def(key)
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.canonical_path_lambda
|
134
|
+
matching_type_def(:canonical_path_lambda)
|
135
|
+
end
|
136
|
+
|
137
|
+
FILE_PREFIX = 'bak'
|
138
|
+
def self.backup_path_from_canonical_path(canonical_path)
|
139
|
+
split_path = canonical_path.split('/')
|
140
|
+
file_path = split_path.pop
|
141
|
+
backup_file_path = "#{FILE_PREFIX}.#{file_path}"
|
142
|
+
split_path.empty? ? backup_file_path : "#{split_path.join('/')}/#{backup_file_path}"
|
143
|
+
end
|
144
|
+
|
76
145
|
end
|
77
146
|
end
|
78
147
|
|