cloud-templates 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +4 -0
- data/.rubocop.yml +1 -0
- data/Rakefile +1 -1
- data/bin/cloud-templates-runner.rb +5 -0
- data/cloud-templates.gemspec +9 -4
- data/examples/lib/user_directory.rb +0 -10
- data/examples/lib/user_directory/artifacts.rb +8 -0
- data/examples/lib/user_directory/artifacts/catalogized.rb +8 -7
- data/examples/lib/user_directory/artifacts/group.rb +27 -30
- data/examples/lib/user_directory/artifacts/ided.rb +8 -7
- data/examples/lib/user_directory/artifacts/organization.rb +10 -11
- data/examples/lib/user_directory/artifacts/pathed.rb +17 -17
- data/examples/lib/user_directory/artifacts/person.rb +20 -15
- data/examples/lib/user_directory/artifacts/team.rb +26 -21
- data/examples/lib/user_directory/artifacts/unit.rb +15 -17
- data/examples/lib/user_directory/artifacts/user.rb +26 -23
- data/examples/lib/user_directory/render.rb +8 -0
- data/examples/lib/user_directory/render/etc.rb +2 -0
- data/examples/lib/user_directory/render/etc/artifact_view.rb +2 -2
- data/examples/lib/user_directory/render/etc/composite_view.rb +1 -2
- data/examples/lib/user_directory/render/etc/group_view.rb +3 -3
- data/examples/lib/user_directory/render/etc/person_view.rb +2 -2
- data/examples/lib/user_directory/render/etc/registry.rb +4 -6
- data/examples/lib/user_directory/render/etc/user_view.rb +2 -3
- data/examples/lib/user_directory/render/ldap.rb +2 -0
- data/examples/lib/user_directory/render/ldap/artifact_view.rb +3 -4
- data/examples/lib/user_directory/render/ldap/composite_view.rb +3 -4
- data/examples/lib/user_directory/render/ldap/group_view.rb +3 -4
- data/examples/lib/user_directory/render/ldap/organization_view.rb +3 -4
- data/examples/lib/user_directory/render/ldap/person_view.rb +3 -4
- data/examples/lib/user_directory/render/ldap/registry.rb +3 -4
- data/examples/lib/user_directory/render/ldap/unit_view.rb +3 -4
- data/examples/lib/user_directory/render/ldap/user_view.rb +3 -4
- data/examples/lib/user_directory/utils.rb +1 -1
- data/examples/spec/user_directory_spec.rb +24 -25
- data/lib/aws/templates.rb +0 -8
- data/lib/aws/templates/artifact.rb +20 -12
- data/lib/aws/templates/cli.rb +14 -0
- data/lib/aws/templates/cli/formatter.rb +21 -0
- data/lib/aws/templates/cli/formatter/json.rb +20 -0
- data/lib/aws/templates/cli/interface.rb +92 -0
- data/lib/aws/templates/composite.rb +6 -9
- data/lib/aws/templates/exception.rb +8 -0
- data/lib/aws/templates/exception/nested_parameter_exception.rb +19 -0
- data/lib/aws/templates/exception/option_error.rb +14 -0
- data/lib/aws/templates/exception/option_scalar_on_the_way.rb +26 -0
- data/lib/aws/templates/exception/option_should_be_recursive.rb +20 -0
- data/lib/aws/templates/exception/option_value_deleted.rb +22 -0
- data/lib/aws/templates/exception/parameter_already_exist.rb +26 -0
- data/lib/aws/templates/exception/parameter_exception.rb +26 -0
- data/lib/aws/templates/exception/parameter_getter_is_not_defined.rb +23 -0
- data/lib/aws/templates/exception/parameter_method_name_conflict.rb +26 -0
- data/lib/aws/templates/exception/parameter_specification_is_invalid.rb +30 -0
- data/lib/aws/templates/exception/parameter_value_invalid.rb +37 -0
- data/lib/aws/templates/exception/parametrized_dsl_error.rb +14 -0
- data/lib/aws/templates/exception/view_not_found.rb +26 -0
- data/lib/aws/templates/help.rb +43 -0
- data/lib/aws/templates/help/aggregate.rb +74 -0
- data/lib/aws/templates/help/dsl.rb +30 -0
- data/lib/aws/templates/help/provider.rb +15 -0
- data/lib/aws/templates/help/rdoc.rb +105 -0
- data/lib/aws/templates/help/rdoc/artifact.rb +50 -0
- data/lib/aws/templates/help/rdoc/composite.rb +20 -0
- data/lib/aws/templates/help/rdoc/contextualized.rb +12 -0
- data/lib/aws/templates/help/rdoc/contextualized/filter.rb +19 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters.rb +14 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/add.rb +21 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/chain.rb +33 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/copy.rb +23 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/identity.rb +23 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/override.rb +29 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/proxy.rb +28 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/recursive_schema_filter.rb +28 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/remove.rb +21 -0
- data/lib/aws/templates/help/rdoc/contextualized/filters/scoped.rb +29 -0
- data/lib/aws/templates/help/rdoc/contextualized/provider.rb +28 -0
- data/lib/aws/templates/help/rdoc/default.rb +12 -0
- data/lib/aws/templates/help/rdoc/default/definition.rb +89 -0
- data/lib/aws/templates/help/rdoc/default/provider.rb +25 -0
- data/lib/aws/templates/help/rdoc/dsl.rb +20 -0
- data/lib/aws/templates/help/rdoc/inheritable.rb +48 -0
- data/lib/aws/templates/help/rdoc/parametrized.rb +12 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraint.rb +31 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints.rb +14 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/all_of.rb +39 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/condition.rb +44 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/depends_on_value.rb +41 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/enum.rb +33 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/matches.rb +27 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/not_nil.rb +27 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/requires.rb +33 -0
- data/lib/aws/templates/help/rdoc/parametrized/constraints/satisfies_condition.rb +28 -0
- data/lib/aws/templates/help/rdoc/parametrized/getter.rb +17 -0
- data/lib/aws/templates/help/rdoc/parametrized/getters.rb +14 -0
- data/lib/aws/templates/help/rdoc/parametrized/nested.rb +32 -0
- data/lib/aws/templates/help/rdoc/parametrized/parameter.rb +55 -0
- data/lib/aws/templates/help/rdoc/parametrized/provider.rb +32 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformation.rb +17 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations.rb +14 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_boolean.rb +25 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_chain.rb +34 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_hash.rb +40 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_integer.rb +26 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_list.rb +32 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_module.rb +25 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_object.rb +32 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_rendered.rb +28 -0
- data/lib/aws/templates/help/rdoc/parametrized/transformations/as_string.rb +25 -0
- data/lib/aws/templates/help/rdoc/provider.rb +20 -0
- data/lib/aws/templates/help/rdoc/routing.rb +104 -0
- data/lib/aws/templates/help/rdoc/texting.rb +42 -0
- data/lib/aws/templates/processor.rb +53 -0
- data/lib/aws/templates/processor/handler.rb +104 -0
- data/lib/aws/templates/processor/registry.rb +74 -0
- data/lib/aws/templates/processor/routing.rb +27 -0
- data/lib/aws/templates/render.rb +27 -25
- data/lib/aws/templates/render/basic_view.rb +47 -0
- data/lib/aws/templates/render/utils.rb +14 -0
- data/lib/aws/templates/render/utils/base_type_views.rb +12 -19
- data/lib/aws/templates/render/utils/inspect.rb +2 -4
- data/lib/aws/templates/render/utils/stringify.rb +2 -5
- data/lib/aws/templates/render/view.rb +3 -100
- data/lib/aws/templates/utils.rb +39 -15
- data/lib/aws/templates/utils/artifact_storage.rb +2 -3
- data/lib/aws/templates/utils/{named.rb → as_named.rb} +2 -3
- data/lib/aws/templates/utils/autoload.rb +224 -0
- data/lib/aws/templates/utils/contextualized.rb +8 -17
- data/lib/aws/templates/utils/contextualized/filter.rb +62 -0
- data/lib/aws/templates/utils/contextualized/filter/add.rb +67 -0
- data/lib/aws/templates/utils/contextualized/filter/chain.rb +56 -0
- data/lib/aws/templates/utils/contextualized/filter/copy.rb +38 -0
- data/lib/aws/templates/utils/contextualized/filter/dsl.rb +50 -0
- data/lib/aws/templates/utils/contextualized/filter/identity.rb +45 -0
- data/lib/aws/templates/utils/contextualized/filter/override.rb +62 -0
- data/lib/aws/templates/utils/contextualized/filter/proxy.rb +29 -0
- data/lib/aws/templates/utils/contextualized/filter/recursive_schema_filter.rb +46 -0
- data/lib/aws/templates/utils/contextualized/filter/remove.rb +66 -0
- data/lib/aws/templates/utils/contextualized/filter/scoped.rb +42 -0
- data/lib/aws/templates/utils/contextualized/refinements.rb +51 -0
- data/lib/aws/templates/utils/default.rb +258 -50
- data/lib/aws/templates/utils/dependency.rb +7 -6
- data/lib/aws/templates/utils/dependency/refinements.rb +80 -0
- data/lib/aws/templates/utils/dependent.rb +6 -3
- data/lib/aws/templates/utils/guarded.rb +30 -0
- data/lib/aws/templates/utils/inheritable.rb +21 -16
- data/lib/aws/templates/utils/inspectable.rb +4 -4
- data/lib/aws/templates/utils/late_bound.rb +2 -2
- data/lib/aws/templates/utils/memoized.rb +2 -0
- data/lib/aws/templates/utils/options.rb +49 -35
- data/lib/aws/templates/utils/parametrized.rb +32 -25
- data/lib/aws/templates/utils/parametrized/constraint.rb +95 -0
- data/lib/aws/templates/utils/parametrized/constraint/all_of.rb +51 -0
- data/lib/aws/templates/utils/parametrized/constraint/condition.rb +93 -0
- data/lib/aws/templates/utils/parametrized/constraint/depends_on_value.rb +60 -0
- data/lib/aws/templates/utils/parametrized/constraint/dsl.rb +86 -0
- data/lib/aws/templates/utils/parametrized/constraint/enum.rb +45 -0
- data/lib/aws/templates/utils/parametrized/constraint/matches.rb +44 -0
- data/lib/aws/templates/utils/parametrized/constraint/not_nil.rb +38 -0
- data/lib/aws/templates/utils/parametrized/constraint/requires.rb +54 -0
- data/lib/aws/templates/utils/parametrized/constraint/satisfies_condition.rb +55 -0
- data/lib/aws/templates/utils/parametrized/getter.rb +67 -0
- data/lib/aws/templates/utils/parametrized/getter/as_instance_variable.rb +41 -0
- data/lib/aws/templates/utils/parametrized/getter/as_is.rb +37 -0
- data/lib/aws/templates/utils/parametrized/getter/dsl.rb +62 -0
- data/lib/aws/templates/utils/parametrized/getter/one_of.rb +48 -0
- data/lib/aws/templates/utils/parametrized/getter/path.rb +53 -0
- data/lib/aws/templates/utils/parametrized/getter/value.rb +50 -0
- data/lib/aws/templates/utils/parametrized/nested.rb +9 -16
- data/lib/aws/templates/utils/parametrized/transformation.rb +74 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_boolean.rb +42 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_chain.rb +57 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_hash.rb +89 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_integer.rb +39 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_list.rb +97 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_module.rb +42 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_object.rb +76 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_rendered.rb +100 -0
- data/lib/aws/templates/utils/parametrized/transformation/as_string.rb +39 -0
- data/lib/aws/templates/utils/parametrized/transformation/dsl.rb +94 -0
- data/lib/aws/templates/utils/recursive.rb +22 -0
- data/spec/aws/templates/artifact_spec.rb +10 -10
- data/spec/aws/templates/cli_spec.rb +83 -0
- data/spec/aws/templates/composite_spec.rb +6 -4
- data/spec/aws/templates/help/rdoc/artifact_spec.rb +94 -0
- data/spec/aws/templates/help/rdoc/composite_spec.rb +53 -0
- data/spec/aws/templates/help/rdoc/parametrized/constraints/all_of_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/constraints/depends_on_value_spec.rb +21 -0
- data/spec/aws/templates/help/rdoc/parametrized/constraints/enum_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/constraints/matches_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/constraints/satisfies_condition_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_boolean_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_chain_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_hash_spec.rb +72 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_integer_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_list_spec.rb +39 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_module_spec.rb +17 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_object_spec.rb +38 -0
- data/spec/aws/templates/help/rdoc/parametrized/transformations/as_rendered_spec.rb +17 -0
- data/spec/aws/templates/render/utils/base_type_views_spec.rb +9 -11
- data/spec/aws/templates/render_spec.rb +1 -1
- data/spec/aws/templates/utils/as_named_spec.rb +0 -2
- data/spec/aws/templates/utils/autoload_spec.rb +14 -0
- data/spec/aws/templates/utils/contextualized_spec.rb +5 -5
- data/spec/aws/templates/utils/late_bound_spec.rb +2 -2
- data/spec/aws/templates/utils/parametrized/constraint_spec.rb +8 -10
- data/spec/aws/templates/utils/parametrized/getters_spec.rb +6 -7
- data/spec/aws/templates/utils/parametrized/transformation_spec.rb +3 -6
- data/spec/aws/templates/utils/parametrized_spec.rb +9 -10
- data/spec/aws/templates/utils_spec.rb +18 -0
- data/spec/test_empty/stuff.rb +4 -0
- data/spec/test_empty/stuff/here/test.rb +9 -0
- metadata +235 -19
- data/lib/aws/templates/exceptions.rb +0 -221
- data/lib/aws/templates/render/registry.rb +0 -60
- data/lib/aws/templates/utils/contextualized/filters.rb +0 -437
- data/lib/aws/templates/utils/contextualized/hash.rb +0 -13
- data/lib/aws/templates/utils/contextualized/nil.rb +0 -13
- data/lib/aws/templates/utils/contextualized/proc.rb +0 -13
- data/lib/aws/templates/utils/dependency/enumerable.rb +0 -13
- data/lib/aws/templates/utils/dependency/object.rb +0 -46
- data/lib/aws/templates/utils/parametrized/constraints.rb +0 -423
- data/lib/aws/templates/utils/parametrized/getters.rb +0 -293
- data/lib/aws/templates/utils/parametrized/guarded.rb +0 -32
- data/lib/aws/templates/utils/parametrized/transformations.rb +0 -652
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'aws/templates/utils'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Templates
|
5
|
+
module Help
|
6
|
+
module Rdoc
|
7
|
+
##
|
8
|
+
# Rdoc classes wrapper
|
9
|
+
#
|
10
|
+
# Creates simple DSL over Rdoc native classes so text blocks can be composed in idiomatic
|
11
|
+
# Ruby way.
|
12
|
+
module Texting
|
13
|
+
def sub(*parts)
|
14
|
+
item = ::RDoc::Markup::ListItem.new(nil, *parts)
|
15
|
+
yield item if block_given?
|
16
|
+
item
|
17
|
+
end
|
18
|
+
|
19
|
+
def text(str)
|
20
|
+
::RDoc::Markup::Paragraph.new(str)
|
21
|
+
end
|
22
|
+
|
23
|
+
def list(type = :BULLET, *parts)
|
24
|
+
list = ::RDoc::Markup::List.new(type, *parts)
|
25
|
+
yield list if block_given?
|
26
|
+
list
|
27
|
+
end
|
28
|
+
|
29
|
+
def parsed_for(str)
|
30
|
+
sub { |s| RDoc::Markup.parse(str).each { |part| s << part } }
|
31
|
+
end
|
32
|
+
|
33
|
+
def document(*parts)
|
34
|
+
doc = ::RDoc::Markup::Document.new(*parts)
|
35
|
+
yield doc if block_given?
|
36
|
+
doc
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'aws/templates/utils'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Templates
|
5
|
+
##
|
6
|
+
# Abstract processor
|
7
|
+
#
|
8
|
+
# Processors are used in artifacts rendering and help generators. Processor embodies
|
9
|
+
# functionality required to register an entity handler and look-up the registry when the
|
10
|
+
# entity is processed.
|
11
|
+
module Processor
|
12
|
+
include Routing
|
13
|
+
|
14
|
+
##
|
15
|
+
# Proxy for Registry handler_for method
|
16
|
+
def handler_for(*args)
|
17
|
+
registry.handler_for(*args)
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Proxy for Registry handler? method
|
22
|
+
def handler?(*args)
|
23
|
+
registry.handler?(*args)
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# Handlder look-up logic.
|
28
|
+
#
|
29
|
+
# Should provide logic for processing entities.
|
30
|
+
def process(_entity, _params = nil)
|
31
|
+
raise Templates::Exception::NotImplementedError.new('The method should be overriden')
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Define handler for entity
|
36
|
+
#
|
37
|
+
# Another way to define handlers for entities. Creates anonymous class and attaches as
|
38
|
+
# the handler to the specified entity.
|
39
|
+
def define_handler(entity, handler, &blk)
|
40
|
+
Class.new(handler, &blk).register_in(self).for_entity(entity)
|
41
|
+
end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Add handlers
|
45
|
+
#
|
46
|
+
# Add routing between handlers and correspondent entities from another entity which supports
|
47
|
+
# routing concept.
|
48
|
+
def routing(routes)
|
49
|
+
registry.merge(routes.registry)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'aws/templates/utils'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Templates
|
5
|
+
module Processor
|
6
|
+
##
|
7
|
+
# Basic entity handler
|
8
|
+
#
|
9
|
+
# Handler are classes encapsulating functionality of transforming entity into desired output.
|
10
|
+
# For instance, the same LDAP record can be transformed into JSON description or LDIF
|
11
|
+
# definition. The same help article can be written to output console or HTML.
|
12
|
+
#
|
13
|
+
# Each handler is attached to a registry object which stores correspondence
|
14
|
+
# between entities and their handlers. A handler is registered in a registry only when it is
|
15
|
+
# attached to an entity. Handler depend on entities but entities are not aware of handlers.
|
16
|
+
#
|
17
|
+
# Handlers are regular Ruby classes and all assumptions made about polymorphism, inheritance
|
18
|
+
# and incapsulation are true for them.
|
19
|
+
#
|
20
|
+
# Handler class itself is an abstract class which can't be instantiated directly.
|
21
|
+
class Handler
|
22
|
+
class << self
|
23
|
+
##
|
24
|
+
# Render accessor
|
25
|
+
#
|
26
|
+
# Returns either processor of this handler class or processor of any ancestor.
|
27
|
+
def processor
|
28
|
+
@processor || (superclass.processor if superclass < Handler)
|
29
|
+
end
|
30
|
+
|
31
|
+
##
|
32
|
+
# Register the hander class in a processor
|
33
|
+
#
|
34
|
+
# Registers the handler class in the processor
|
35
|
+
# * +r+ - processor registrar
|
36
|
+
def register_in(r)
|
37
|
+
@processor = r
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Link the handler class to the entity
|
43
|
+
#
|
44
|
+
# Registers the link in the processor object of the handler class.
|
45
|
+
def for_entity(entity)
|
46
|
+
@entity = entity
|
47
|
+
processor.register(entity, self)
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Entity the handler is registered for
|
53
|
+
attr_reader :entity
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Context handler object is attached to
|
58
|
+
attr_reader :context
|
59
|
+
|
60
|
+
##
|
61
|
+
# Assigned handler parameters
|
62
|
+
attr_reader :parameters
|
63
|
+
|
64
|
+
##
|
65
|
+
# Execute in the context
|
66
|
+
#
|
67
|
+
# Executes passed block in the context. It helps against putting too much context-dependend
|
68
|
+
# method accesses in long blocks. Returns the value returned by the block.
|
69
|
+
def in_context(*args, &blk)
|
70
|
+
context.instance_exec(*args, &blk)
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# Create handler instance and link it to the context
|
75
|
+
def initialize(ctx, params = nil)
|
76
|
+
@context = ctx
|
77
|
+
@parameters = params
|
78
|
+
end
|
79
|
+
|
80
|
+
##
|
81
|
+
# Alias for class method processor
|
82
|
+
def processor
|
83
|
+
self.class.processor
|
84
|
+
end
|
85
|
+
|
86
|
+
##
|
87
|
+
# Process the object
|
88
|
+
#
|
89
|
+
# Processes passed object with the handler default processor
|
90
|
+
def processed_for(obj, parameters_override = nil)
|
91
|
+
processor.process(obj, parameters_override.nil? ? parameters : parameters_override)
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Get handler for the entity
|
96
|
+
#
|
97
|
+
# Returns registered handler for the entity
|
98
|
+
def handler_for(entity)
|
99
|
+
processor.handler_for(entity)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'aws/templates/utils'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Templates
|
5
|
+
module Processor
|
6
|
+
##
|
7
|
+
# Handler registry
|
8
|
+
#
|
9
|
+
# Handler registries encapsulate differerent ways of transforming entities into
|
10
|
+
# domain-specific output. In nutshell, they are registries of Handler classes which are able
|
11
|
+
# to lookup proper Handler for a given entity.
|
12
|
+
class Registry
|
13
|
+
# Handler registry accessor
|
14
|
+
def registry
|
15
|
+
@registry ||= ::Concurrent::Map.new
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Register pair entity-handler
|
20
|
+
#
|
21
|
+
# Invoked from inside of a Handler class at definition of the link between the handler class
|
22
|
+
# and an entity.
|
23
|
+
# * +entity+ - entity the handler claims to be able to process
|
24
|
+
# * +handler+ - handler class
|
25
|
+
def register(entity, handler)
|
26
|
+
registry.put_if_absent(_process_entity(entity), handler)
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Try to look-up the handler
|
31
|
+
def handler_for(entity)
|
32
|
+
handler = self[entity]
|
33
|
+
raise "Handler is not found for #{entity}" unless handler
|
34
|
+
handler.reduce
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Merge map with another recursive
|
39
|
+
def merge(recursive)
|
40
|
+
raise "#{recursive} is not recursive" unless Utils.recursive?(recursive)
|
41
|
+
recursive.keys.each { |k| register(k, recursive[k]) }
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
# All possible entity types
|
46
|
+
def keys
|
47
|
+
registry.keys
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Look-up the handler
|
52
|
+
def [](entity)
|
53
|
+
return registry[entity] unless entity.is_a?(Module)
|
54
|
+
registry[entity.name] || registry[entity]
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Check if handler exists
|
59
|
+
def include?(k)
|
60
|
+
!self[k].nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
alias handler? include?
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def _process_entity(entity)
|
68
|
+
return entity unless entity.is_a?(Module)
|
69
|
+
entity.name || entity.reduce
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'aws/templates/utils'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Templates
|
5
|
+
module Processor
|
6
|
+
##
|
7
|
+
# Routing DSL
|
8
|
+
#
|
9
|
+
# Defines trivial methods to wire handlers with respective entities.
|
10
|
+
module Routing
|
11
|
+
##
|
12
|
+
# Registry accessor
|
13
|
+
#
|
14
|
+
# All handlers and corresponding entities in a processor are stored in a registry.
|
15
|
+
def registry
|
16
|
+
@registry ||= Processor::Registry.new
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Proxy for Registry register method
|
21
|
+
def register(*args)
|
22
|
+
registry.register(*args)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/aws/templates/render.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require 'aws/templates/
|
2
|
-
require 'aws/templates/render/registry'
|
3
|
-
require 'aws/templates/render/view'
|
1
|
+
require 'aws/templates/utils'
|
4
2
|
|
5
3
|
module Aws
|
6
4
|
module Templates
|
@@ -29,31 +27,36 @@ module Aws
|
|
29
27
|
# extend Aws::Templates::Render
|
30
28
|
# end
|
31
29
|
module Render
|
30
|
+
include Templates::Processor
|
31
|
+
|
32
32
|
##
|
33
|
-
#
|
33
|
+
# Can object be rendered
|
34
34
|
#
|
35
|
-
#
|
36
|
-
|
37
|
-
|
38
|
-
@registry ||= Registry.new
|
35
|
+
# Returns true if the object passed can be rendered by one of the views in the registry
|
36
|
+
def can_render?(instance)
|
37
|
+
instance.class.ancestors.any? { |ancestor| handler?(ancestor) }
|
39
38
|
end
|
40
39
|
|
41
40
|
##
|
42
|
-
#
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
# Lookup a view for the artifact
|
42
|
+
#
|
43
|
+
# Searches registry for artifact's class and all its ancestors
|
44
|
+
# in the registry and returns the closest matching view
|
45
|
+
# * +instance+ - artifact instance to render
|
46
|
+
# * +params+ - assigned parameters; it can be arbitrary value;
|
47
|
+
# it is propagated to selected render
|
48
|
+
def view_for(instance, params = nil)
|
49
|
+
return instance if instance.respond_to?(:to_rendered)
|
46
50
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
+
ancestor = instance.class.ancestors.find { |mod| handler?(mod) }
|
52
|
+
|
53
|
+
raise Templates::Exception::ViewNotFound.new(instance) unless ancestor
|
54
|
+
|
55
|
+
handler_for(ancestor).new(instance, params)
|
51
56
|
end
|
52
57
|
|
53
|
-
|
54
|
-
|
55
|
-
def view_for(*args)
|
56
|
-
registry.view_for(*args)
|
58
|
+
def process(entity, params = nil)
|
59
|
+
view_for(entity, params).to_rendered
|
57
60
|
end
|
58
61
|
|
59
62
|
##
|
@@ -61,12 +64,11 @@ module Aws
|
|
61
64
|
#
|
62
65
|
# Another way to define views for artifacts. Creates anonymous class and attaches as the view
|
63
66
|
# to the specified artifact
|
64
|
-
def
|
65
|
-
|
66
|
-
.new(view || Aws::Templates::Render::BasicView, &blk)
|
67
|
-
.register_in(self)
|
68
|
-
.artifact(artifact_class)
|
67
|
+
def define_handler(artifact_class, view = nil, &blk)
|
68
|
+
super(artifact_class, view || BasicView, &blk)
|
69
69
|
end
|
70
|
+
|
71
|
+
alias define_view define_handler
|
70
72
|
end
|
71
73
|
end
|
72
74
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'aws/templates/utils'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Templates
|
5
|
+
module Render
|
6
|
+
##
|
7
|
+
# Basic render view
|
8
|
+
#
|
9
|
+
# Views are classes encapsulating functionality of transforming
|
10
|
+
# artifacts into domain-specific output. For instance, the same
|
11
|
+
# LDAP record can be transformed into JSON description or LDIF definition.
|
12
|
+
# Views can be attached to ancestors of an artifact and it expected
|
13
|
+
# that the library will look-up the closest ancestor having view attached
|
14
|
+
# if the render is invoked on a child.
|
15
|
+
#
|
16
|
+
# Each view is attached to a registry object which stores correspondence
|
17
|
+
# between artifact classes and their views, and optionally to an artifact.
|
18
|
+
# A view is registered in a registry only when it is attached to an artifact.
|
19
|
+
# Views depend on artifacts but artifacts are not aware of views.
|
20
|
+
# As the extreme case, a sole view can be attached to Artifact
|
21
|
+
# if you have universal way to render your domain objects.
|
22
|
+
#
|
23
|
+
# Views are regular Ruby classes and all assumptions made about
|
24
|
+
# polymorphism, inheritance and incapsulation are true for them.
|
25
|
+
#
|
26
|
+
# View class itself is an abstract class which can't be instantiated
|
27
|
+
# directly.
|
28
|
+
class BasicView < Templates::Processor::Handler
|
29
|
+
class << self
|
30
|
+
alias artifact for_entity
|
31
|
+
end
|
32
|
+
|
33
|
+
alias instance context
|
34
|
+
alias in_instance in_context
|
35
|
+
alias rendered_for processed_for
|
36
|
+
|
37
|
+
##
|
38
|
+
# Render the instance of the artifact
|
39
|
+
#
|
40
|
+
# The method should be overriden and return rendered form of the attached instance
|
41
|
+
def to_rendered
|
42
|
+
raise Templates::Exception::NotImplementedError.new('The method should be overriden')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'aws/templates/utils'
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Templates
|
5
|
+
module Render
|
6
|
+
##
|
7
|
+
# Namespace for rendering utils
|
8
|
+
#
|
9
|
+
# Contains supplemental re-usable components which are not related to the core functionality.
|
10
|
+
module Utils
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|