appfuel 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +78 -1
  4. data/appfuel.gemspec +1 -0
  5. data/docs/images/appfuel_basic_flow.png +0 -0
  6. data/lib/appfuel/application/app_container.rb +24 -1
  7. data/lib/appfuel/application/container_class_registration.rb +29 -4
  8. data/lib/appfuel/application/root.rb +1 -0
  9. data/lib/appfuel/application.rb +0 -1
  10. data/lib/appfuel/domain/base_criteria.rb +171 -0
  11. data/lib/appfuel/domain/criteria_builder.rb +248 -0
  12. data/lib/appfuel/domain/criteria_settings.rb +156 -0
  13. data/lib/appfuel/domain/dsl.rb +5 -1
  14. data/lib/appfuel/domain/entity.rb +1 -2
  15. data/lib/appfuel/domain/exists_criteria.rb +57 -0
  16. data/lib/appfuel/domain/expr.rb +66 -97
  17. data/lib/appfuel/domain/expr_conjunction.rb +27 -0
  18. data/lib/appfuel/domain/expr_parser.rb +199 -0
  19. data/lib/appfuel/domain/expr_transform.rb +68 -0
  20. data/lib/appfuel/domain/search_criteria.rb +137 -0
  21. data/lib/appfuel/domain.rb +6 -1
  22. data/lib/appfuel/feature/initializer.rb +5 -0
  23. data/lib/appfuel/handler/action.rb +3 -0
  24. data/lib/appfuel/handler/base.rb +11 -1
  25. data/lib/appfuel/handler/command.rb +4 -0
  26. data/lib/appfuel/repository/base.rb +16 -2
  27. data/lib/appfuel/repository/mapper.rb +41 -7
  28. data/lib/appfuel/repository/mapping_dsl.rb +4 -4
  29. data/lib/appfuel/repository/mapping_entry.rb +2 -2
  30. data/lib/appfuel/repository.rb +0 -1
  31. data/lib/appfuel/storage/db/active_record_model.rb +32 -28
  32. data/lib/appfuel/storage/db/mapper.rb +38 -125
  33. data/lib/appfuel/storage/db/repository.rb +6 -10
  34. data/lib/appfuel/storage/memory/repository.rb +4 -0
  35. data/lib/appfuel/types.rb +0 -1
  36. data/lib/appfuel/version.rb +1 -1
  37. data/lib/appfuel.rb +6 -10
  38. metadata +26 -7
  39. data/lib/appfuel/application/container_key.rb +0 -201
  40. data/lib/appfuel/application/qualify_container_key.rb +0 -76
  41. data/lib/appfuel/db_model.rb +0 -16
  42. data/lib/appfuel/domain/criteria.rb +0 -436
  43. data/lib/appfuel/repository/mapping_registry.rb +0 -121
@@ -2,37 +2,47 @@ module Appfuel
2
2
  module Db
3
3
  class Mapper < Appfuel::Repository::Mapper
4
4
 
5
- # Determines if an domain entity exists for this key
6
- #
7
- # @param key [String, Symbol]
8
- # @return [Boolean]
9
- def entity_mapped?(name)
10
- registry.entity?(name)
5
+ def search(domain_name, criteria, opts = {})
6
+
11
7
  end
12
8
 
13
- # Returns the active record model from a map for a given entity
9
+ # Return qualified db column name from entity expression.
14
10
  #
15
- # @raise [RuntimeError] if entity key does not exist
16
- # @raise [RuntimeError] if map key does not exist
11
+ # @param expr [SpCore::Domain::Expr]
12
+ # @return db column name [String]
13
+ def qualified_db_column(expr, entry = nil)
14
+ table_name, column = db_table_column(expr, entry)
15
+ "#{table_name}.#{column}"
16
+ end
17
+
18
+ # Determine Domain Mapentry and DbModel from entity expression.
17
19
  #
18
- # @param entity [String] encoded "feature.entity"
19
- # @param domain_attr [String] attribute of entity
20
- # @return [DbModel]
21
- def db_class_key(entity_name, entity_attr)
22
- entry = find(entity_name, entity_attr)
23
- db_class_key = entry.storage(:db)
20
+ # @param expr [SpCore::Domain::Expr]
21
+ # @return [table_name, column] [Array]
22
+ def db_table_column(expr, entry = nil)
23
+ entry ||= find(expr.domain_name, expr.domain_attr)
24
+ db = storage_class_from_entry(entry, :db)
24
25
 
25
- mapp.storage(entity, domain_attr)
26
+ [db.table_name, entry.storage_attr]
26
27
  end
27
28
 
28
- # Converts an entity expression into a valid active record expresion with
29
- # string expresion (array canditions) and value(s)
29
+ # Converts an entity expression into a valid active record expresion
30
+ # expression.
30
31
  #
31
32
  # @param expr [Domain::Expr]
32
- # @param results [Hash]
33
- # @return [DbExpr] Returns a valid active record expresion
34
- def create_db_expr(expr)
35
- DbExpr.new(qualified_db_column(expr), expr.op, expr.value)
33
+ # @param entry [Repository::MappingEntry] optional
34
+ # @return [Array] The first index is the expr string using ? for values
35
+ # The second index is the actual value(s)
36
+ def convert_expr(expr, entry = nil)
37
+ column = qualified_db_column(expr, entry)
38
+ op = expr.op
39
+ arg = case expr.op
40
+ when 'in', 'not in' then '(?)'
41
+ when 'between', 'not between' then '? AND ?'
42
+ else
43
+ '?'
44
+ end
45
+ ["#{column} #{op} #{arg}", expr.value]
36
46
  end
37
47
 
38
48
  # Validates if a record exists in the table that matches the array with
@@ -40,14 +50,15 @@ module Appfuel
40
50
  #
41
51
  # @param criteria [Criteria]
42
52
  # @return [Boolean]
43
- def exists?(criteria)
44
- domain_expr = criteria.exists_expr
53
+ def exists?(domain_expr)
45
54
  domain_name = domain_expr.domain_name
46
55
  domain_attr = domain_expr.domain_attr
47
56
 
48
- db_expr = create_db_expr(domain_expr)
49
- db_model = registry.db_class(domain_name, domain_attr)
50
- db_model.exists?([db_expr.string, db_expr.values])
57
+ entry = find(domain_name, domain_attr)
58
+ db_expr, values = convert_expr(domain_expr, entry)
59
+ db = storage_class_from_entry(entry, :db)
60
+
61
+ db.exists?([db_expr, values])
51
62
  end
52
63
 
53
64
  # Build a where expression from the mapped db class using the criteria.Ï
@@ -70,25 +81,6 @@ module Appfuel
70
81
  relation
71
82
  end
72
83
 
73
- # Return qualified db column name from entity expression.
74
- #
75
- # @param expr [SpCore::Domain::Expr]
76
- # @return db column name [String]
77
- def qualified_db_column(expr)
78
- table_name, column = db_table_column(expr)
79
- "#{table_name}.#{column}"
80
- end
81
-
82
- # Determine Domain Mapentry and DbModel from entity expression.
83
- #
84
- # @param expr [SpCore::Domain::Expr]
85
- # @return [table_name, column] [Array]
86
- def db_table_column(expr)
87
- entry = registry.find(expr.domain_name, expr.domain_attr)
88
- db = registry.db_class_constant(entry.db_class)
89
- [db.table_name, entry.db_column]
90
- end
91
-
92
84
  # Build an order by expression for the given db relation based on the
93
85
  # criteria
94
86
  #
@@ -129,85 +121,6 @@ module Appfuel
129
121
  db_expr = create_db_expr(domain_expr)
130
122
  relation.where([db_expr.string, db_expr.values])
131
123
  end
132
-
133
- # Convert the entity into a hash of db tables that represent
134
- # that entity. Each table has its own hash of mapped columns.
135
- #
136
- # @param domain [Appfuel::Domain::Entity]
137
- # @param opts [Hash]
138
- # @option exclued [Array] list of columns to exclude from mapping
139
- #
140
- # @return [Hash] each key is a table with a hash of column name/value
141
- def to_storage(domain, opts = {})
142
- excluded = opts[:exclude] || []
143
- data = {}
144
- each_entity_attr(domain.domain_name) do |entry|
145
- column = entry.storage_attr
146
- db_class = entry.storage(:db)
147
- next if excluded.include?(column) || entry.skip?
148
-
149
- data[db_class] = {} unless data.key?(db_class)
150
- data[db_class][column] = entity_value(domain, entry)
151
- end
152
- data
153
- end
154
-
155
- # Handles entity value by checking if its a computed property,
156
- # fetching the value and converting undefined values to nil.
157
- #
158
- # @param domain [Appfuel::Domain::Entity]
159
- # @param map_entry [MappingEntity]
160
- # @return the value
161
- def entity_value(domain, entry)
162
- value = retrieve_entity_value(domain, entry.domain_attr)
163
- if entry.computed_attr?
164
- value = entry.compute_attr(value)
165
- end
166
-
167
- value = nil if undefined?(value)
168
-
169
- value
170
- end
171
-
172
- # @params value [mixed]
173
- # @return [Boolean]
174
- def undefined?(value)
175
- value == Types::Undefined
176
- end
177
-
178
- # Fetch the value for the entity attribute. When the attribute name
179
- # contains a '.' then traverse the dots and call the last attribute
180
- # for the value
181
- #
182
- # @param domain [Appfuel::Domain::Entity]
183
- # @param entity_attribute [String]
184
- # @return the value
185
- def retrieve_entity_value(domain, entity_attr)
186
- chain = entity_attr.split('.')
187
- target = domain
188
- chain.each do |attr_method|
189
- unless target.respond_to?(attr_method)
190
- return nil
191
- end
192
-
193
- target = target.public_send(attr_method)
194
- end
195
- target
196
- end
197
-
198
- # Create nested hashes from string
199
- #
200
- # @param domain_attr [String]
201
- # @param entity_value [String]
202
- # @return [nested hash]
203
- def create_entity_hash(domain_attr, entity_value)
204
- domain_attr.split('.').reverse.inject(entity_value) { |a,n| {n => a}}
205
- end
206
-
207
- def model_attributes(relation)
208
- ap relation
209
- relation.attributes.select {|_, value| !value.nil?}
210
- end
211
124
  end
212
125
  end
213
126
  end
@@ -2,8 +2,12 @@ module Appfuel
2
2
  module Db
3
3
  class Repository < Appfuel::Repository::Base
4
4
  class << self
5
+ def container_class_type
6
+ "#{super}.db"
7
+ end
8
+
5
9
  def create_mapper(maps = nil)
6
- Mapper.new(maps)
10
+ Mapper.new(container_root_name, maps)
7
11
  end
8
12
  end
9
13
 
@@ -116,14 +120,6 @@ module Appfuel
116
120
  apply_query_conditions(criteria, relation)
117
121
  end
118
122
 
119
- # Factory method to create a pagination result
120
- #
121
- # @param data [Hash]
122
- # @return [SpCore::Pagination::Result]
123
- def create_pager_result(data)
124
- Appfuel::Pagination::Result.new(data)
125
- end
126
-
127
123
  # Factory method to create a domain entity
128
124
  #
129
125
  # @param domain_name [String]
@@ -197,7 +193,7 @@ module Appfuel
197
193
  #
198
194
  # @param criteria [SpCore::Criteria]
199
195
  # @return [SpCore::Domain::Entity, SpCore::Domain::EntityCollection]
200
- def query(criteria)
196
+ def search(criteria)
201
197
  return execute_criteria(criteria) if criteria.exec?
202
198
 
203
199
  begin
@@ -3,6 +3,10 @@ module Appfuel
3
3
  class Repository < Appfuel::Repository::Base
4
4
 
5
5
  class << self
6
+ def container_class_type
7
+ "#{super}.memory"
8
+ end
9
+
6
10
  def create_mapper(maps = nil)
7
11
  Mapper.new(maps)
8
12
  end
data/lib/appfuel/types.rb CHANGED
@@ -44,7 +44,6 @@ module Types
44
44
  fail "Domain must be a Appfuel::Entity or respond to :domain_name"
45
45
  end
46
46
  name = opts.key?(:as) ? opt[:as] : klass.domain_name
47
- p name
48
47
  return if key?(name) && self[name] == klass
49
48
 
50
49
  register(name, klass)
@@ -1,3 +1,3 @@
1
1
  module Appfuel
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
data/lib/appfuel.rb CHANGED
@@ -29,16 +29,6 @@ require "appfuel/validation"
29
29
  # Dependency management for actions, commands and repos
30
30
  require "appfuel/root_module"
31
31
 
32
- require "appfuel/presenter"
33
-
34
- require "appfuel/repository"
35
- require "appfuel/db_model"
36
- require "appfuel/repository_runner"
37
- require "appfuel/storage"
38
-
39
- # callable operations
40
- require "appfuel/handler"
41
-
42
32
  module Appfuel
43
33
  # The appfuel top level interface mainly deals with interacting with both
44
34
  # the application dependency injection container and the framework di
@@ -206,5 +196,11 @@ end
206
196
 
207
197
  # Domain Entities
208
198
  require "appfuel/domain"
199
+ require "appfuel/presenter"
200
+ require "appfuel/repository"
201
+ require "appfuel/repository_runner"
202
+ require "appfuel/storage"
203
+ require "appfuel/handler"
204
+
209
205
 
210
206
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appfuel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Scott-Buccleuch
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-10 00:00:00.000000000 Z
11
+ date: 2017-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: parslet
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.8.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.8.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -232,6 +246,7 @@ files:
232
246
  - ".rspec"
233
247
  - ".rubocop.yml"
234
248
  - ".travis.yml"
249
+ - CHANGELOG.md
235
250
  - CODE_OF_CONDUCT.md
236
251
  - Gemfile
237
252
  - README.md
@@ -239,12 +254,11 @@ files:
239
254
  - appfuel.gemspec
240
255
  - bin/console
241
256
  - bin/setup
257
+ - docs/images/appfuel_basic_flow.png
242
258
  - lib/appfuel.rb
243
259
  - lib/appfuel/application.rb
244
260
  - lib/appfuel/application/app_container.rb
245
261
  - lib/appfuel/application/container_class_registration.rb
246
- - lib/appfuel/application/container_key.rb
247
- - lib/appfuel/application/qualify_container_key.rb
248
262
  - lib/appfuel/application/root.rb
249
263
  - lib/appfuel/cli_msg_request.rb
250
264
  - lib/appfuel/configuration.rb
@@ -252,14 +266,20 @@ files:
252
266
  - lib/appfuel/configuration/file_loader.rb
253
267
  - lib/appfuel/configuration/populate.rb
254
268
  - lib/appfuel/configuration/search.rb
255
- - lib/appfuel/db_model.rb
256
269
  - lib/appfuel/domain.rb
257
- - lib/appfuel/domain/criteria.rb
270
+ - lib/appfuel/domain/base_criteria.rb
271
+ - lib/appfuel/domain/criteria_builder.rb
272
+ - lib/appfuel/domain/criteria_settings.rb
258
273
  - lib/appfuel/domain/domain_name_parser.rb
259
274
  - lib/appfuel/domain/dsl.rb
260
275
  - lib/appfuel/domain/entity.rb
261
276
  - lib/appfuel/domain/entity_collection.rb
277
+ - lib/appfuel/domain/exists_criteria.rb
262
278
  - lib/appfuel/domain/expr.rb
279
+ - lib/appfuel/domain/expr_conjunction.rb
280
+ - lib/appfuel/domain/expr_parser.rb
281
+ - lib/appfuel/domain/expr_transform.rb
282
+ - lib/appfuel/domain/search_criteria.rb
263
283
  - lib/appfuel/domain/value_object.rb
264
284
  - lib/appfuel/errors.rb
265
285
  - lib/appfuel/feature.rb
@@ -283,7 +303,6 @@ files:
283
303
  - lib/appfuel/repository/mapper.rb
284
304
  - lib/appfuel/repository/mapping_dsl.rb
285
305
  - lib/appfuel/repository/mapping_entry.rb
286
- - lib/appfuel/repository/mapping_registry.rb
287
306
  - lib/appfuel/repository_runner.rb
288
307
  - lib/appfuel/request.rb
289
308
  - lib/appfuel/response.rb
@@ -1,201 +0,0 @@
1
- module Appfuel
2
- module Application
3
- # Mixins to allow you to handle application container keys. The application
4
- # container operates based on certain conventions which we take into account
5
- # here.
6
- module ContainerKey
7
- # Parse the namespace assuming it is a ruby namespace and assign
8
- # the list to container_path_list
9
- #
10
- # @param namespace [String]
11
- # @return [Array]
12
- def load_path_from_ruby_namespace(namespace)
13
- self.container_path = parse_list_string(namespace, '::')
14
- end
15
-
16
- # Parse the namespace assuming it is a dry container namespace and
17
- # assign the list to container_path_list
18
- #
19
- # @param namespace [String]
20
- # @return [Array]
21
- def load_path_from_container_namespace(namespace)
22
- self.container_path = parse_list_string(namespace, '.')
23
- end
24
-
25
- # @param namespace [String] encoded string that represents a path
26
- # @param char [String] character used to split the keys into a list
27
- # @return [Array] an array of lower case snake cased strings
28
- def parse_list_string(namespace, char)
29
- fail "split char must be '.' or '::'" unless ['.', '::'].include?(char)
30
- namespace.to_s.split(char).map {|i| i.underscore }
31
- end
32
-
33
- # return [Boolean]
34
- def container_path?
35
- !@container_path.nil?
36
- end
37
-
38
- # @param list [Array] list of container namespace parts including root
39
- # @return [Array]
40
- def container_path=(list)
41
- fail "container path list must be an array" unless list.is_a?(Array)
42
- @container_path = list
43
- @container_path.freeze
44
- end
45
-
46
- # An array representation of the application container namespace, where
47
- # the root is the name of the application and not part of the namespace
48
- # and the rest is hierarchical path to features or globals
49
- #
50
- # @return [Array]
51
- def container_path
52
- load_path_from_ruby_namespace(self.to_s) unless container_path?
53
- @container_path
54
- end
55
-
56
- # This is the application name used to identify the application container
57
- # that is stored in the framework container
58
- #
59
- # @return string
60
- def container_root_name
61
- @container_root_name ||= container_path.first
62
- end
63
-
64
- # All root namespace for anything inside features, use this name. It is
65
- # important to note that to avoid long namespace in ruby features are the
66
- # name of the module directly below the root.
67
- #
68
- # @return [String]
69
- def container_features_root_name
70
- @container_features_root_name ||= 'features'
71
- end
72
-
73
- # The actual name of the feature
74
- #
75
- # @return [String]
76
- def container_feature_name
77
- container_path[1]
78
- end
79
-
80
- # The feature name is the second item in the path, that is always prexfix
81
- # with "features"
82
- #
83
- # @return [String]
84
- def container_feature_key
85
- @container_feature_key ||= (
86
- "#{container_features_root_name}.#{container_feature_name}"
87
- )
88
- end
89
-
90
- # Container key relative from feature or global, depending on which class
91
- # this is mixed into
92
- #
93
- # @return [String]
94
- def container_relative_key
95
- @container_relative_key ||= container_path[2..-1].join('.')
96
- end
97
-
98
- # This refers to either the global path or the path to a particular
99
- # feature
100
- #
101
- # @return [String]
102
- def top_container_key
103
- container_global_path? ? container_global_name : container_feature_key
104
- end
105
-
106
- def container_key_basename
107
- @container_path.last
108
- end
109
-
110
- # Fully qualified key, meaning you can access the class this was mixed into
111
- # if you stored it into the container using this key
112
- #
113
- # @return [String]
114
- def container_qualified_key
115
- @container_qualified_key ||= (
116
- "#{top_container_key}.#{container_relative_key}"
117
- )
118
- end
119
-
120
- # Determines if the container path represents a global glass
121
- #
122
- # @return [Boolean]
123
- def container_global_path?
124
- container_path[1] == container_global_name
125
- end
126
-
127
- # @return [String]
128
- def container_global_name
129
- @container_global_name ||= 'global'
130
- end
131
-
132
- # Convert the injection key to a fully qualified namespaced key that
133
- # is used to pull an item out of the app container.
134
- #
135
- # Rules:
136
- # 1) split the injection key by '.'
137
- # 2) use the feature_key as the initial namespace
138
- # 3) when the first part of the key is "global" use that instead of
139
- # the feature_key
140
- # 4) append the type_key to the namespace unless it is "container"
141
- # type_key like "repositories" or "commands" removes the need for
142
- # the user to have to specify it since they already did that when
143
- # they used the type param.
144
- #
145
- #
146
- # note: feature_key in these examples will be "features.my-feature"
147
- # @example of a feature repository named foo
148
- #
149
- # convert_to_qualified_container_key('foo', 'repositories')
150
- #
151
- # returns 'features.my-feature.repositories.foo'
152
- #
153
- # @example of a global command names bar
154
- #
155
- # convert_to_qualified_container_key('global.bar', 'commands')
156
- #
157
- # returns 'gloval.commands.bar'
158
- #
159
- # @example of a container item baz
160
- # NOTE: feature container items are not in any namespace, they are any item
161
- # that can resolve from the namespace given by "feature_key"
162
- #
163
- # convert_to_qualified_container_key('baz', 'container')
164
- #
165
- # returns 'features.my-feature.baz'
166
- #
167
- # @example of a global container item baz
168
- # NOTE: global container items are not in any namespace, they are any item
169
- # you can resolve from the application container.
170
- #
171
- # convert_to_qualified_container_key('global.baz', 'container')
172
- #
173
- # returns 'baz'
174
- #
175
- # @param key [String] partial key to be built into fully qualified key
176
- # @param type_ns [String] namespace for key
177
- # @return [String] fully qualified namespaced key
178
- def qualify_container_key(key, type_ns)
179
- parts = key.to_s.split('.')
180
- namespace = "#{container_feature_key}."
181
- if parts[0].downcase == 'global'
182
- namespace = 'global.'
183
- parts.shift
184
- elsif parts[0] == container_feature_name
185
- parts.shift
186
- end
187
-
188
- # when the key is a global container the namespace is only the path
189
- if type_ns == "container"
190
- namespace = '' if namespace == 'global.'
191
- type_ns = ''
192
- else
193
- type_ns = "#{type_ns}."
194
- end
195
-
196
- path = parts.join('.')
197
- "#{namespace}#{type_ns}#{path}"
198
- end
199
- end
200
- end
201
- end
@@ -1,76 +0,0 @@
1
- module Appfuel
2
- module Application
3
- # Mixins to allow you to handle application container keys. The application
4
- # container operates based on certain conventions which we take into account
5
- # here.
6
- module QualifyContainerKey
7
- # Convert the injection key to a fully qualified namespaced key that
8
- # is used to pull an item out of the app container.
9
- #
10
- # Rules:
11
- # 1) split the injection key by '.'
12
- # 2) use the feature_key as the initial namespace
13
- # 3) when the first part of the key is "global" use that instead of
14
- # the feature_key
15
- # 4) append the type_key to the namespace unless it is "container"
16
- # type_key like "repositories" or "commands" removes the need for
17
- # the user to have to specify it since they already did that when
18
- # they used the type param.
19
- #
20
- #
21
- # note: feature_key in these examples will be "features.my-feature"
22
- # @example of a feature repository named foo
23
- #
24
- # convert_to_qualified_container_key('foo', 'repositories')
25
- #
26
- # returns 'features.my-feature.repositories.foo'
27
- #
28
- # @example of a global command names bar
29
- #
30
- # convert_to_qualified_container_key('global.bar', 'commands')
31
- #
32
- # returns 'gloval.commands.bar'
33
- #
34
- # @example of a container item baz
35
- # NOTE: feature container items are not in any namespace, they are any item
36
- # that can resolve from the namespace given by "feature_key"
37
- #
38
- # convert_to_qualified_container_key('baz', 'container')
39
- #
40
- # returns 'features.my-feature.baz'
41
- #
42
- # @example of a global container item baz
43
- # NOTE: global container items are not in any namespace, they are any item
44
- # you can resolve from the application container.
45
- #
46
- # convert_to_qualified_container_key('global.baz', 'container')
47
- #
48
- # returns 'baz'
49
- #
50
- # @param key [String] partial key to be built into fully qualified key
51
- # @param type_ns [String] namespace for key
52
- # @return [String] fully qualified namespaced key
53
- def qualify_container_key(key, type_ns)
54
- parts = key.to_s.split('.')
55
- namespace = "#{container_feature_key}."
56
- if parts[0].downcase == 'global'
57
- namespace = 'global.'
58
- parts.shift
59
- elsif parts[0] == container_feature_name
60
- parts.shift
61
- end
62
-
63
- # when the key is a global container the namespace is only the path
64
- if type_ns == "container"
65
- namespace = '' if namespace == 'global.'
66
- type_ns = ''
67
- else
68
- type_ns = "#{type_ns}."
69
- end
70
-
71
- path = parts.join('.')
72
- "#{namespace}#{type_ns}#{path}"
73
- end
74
- end
75
- end
76
- end
@@ -1,16 +0,0 @@
1
- module Appfuel
2
- class DbModel < ActiveRecord::Base
3
- self.abstract_class = true
4
- extend Appfuel::Application::ContainerKey
5
- extend Appfuel::Application::ContainerClassRegistration
6
-
7
- def self.inherited(klass)
8
- super
9
- register_container_class(klass)
10
- end
11
-
12
- def entity_attributes
13
- attributes.symbolize_keys.select {|_,value| !value.nil?}
14
- end
15
- end
16
- end