restful_objects 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/restful_objects.rb +1 -2
  3. data/lib/restful_objects/domain_model/domain_model.rb +14 -11
  4. data/lib/restful_objects/domain_model/helpers/link_generator.rb +102 -90
  5. data/lib/restful_objects/domain_model/mixins/object.rb +10 -13
  6. data/lib/restful_objects/domain_model/mixins/object_actions.rb +106 -117
  7. data/lib/restful_objects/domain_model/mixins/object_base.rb +175 -131
  8. data/lib/restful_objects/domain_model/mixins/object_collections.rb +58 -71
  9. data/lib/restful_objects/domain_model/mixins/object_macros.rb +20 -26
  10. data/lib/restful_objects/domain_model/mixins/object_properties.rb +85 -98
  11. data/lib/restful_objects/domain_model/mixins/service.rb +9 -17
  12. data/lib/restful_objects/domain_model/types/action_description.rb +80 -82
  13. data/lib/restful_objects/domain_model/types/collection_description.rb +39 -40
  14. data/lib/restful_objects/domain_model/types/domain_type.rb +102 -105
  15. data/lib/restful_objects/domain_model/types/parameter_description.rb +42 -47
  16. data/lib/restful_objects/domain_model/types/parameter_description_list.rb +9 -12
  17. data/lib/restful_objects/domain_model/types/property_description.rb +62 -64
  18. data/lib/restful_objects/router.rb +6 -0
  19. data/lib/restful_objects/router/base.rb +23 -32
  20. data/lib/restful_objects/router/domain_object_resources.rb +89 -94
  21. data/lib/restful_objects/router/domain_type_resources.rb +24 -29
  22. data/lib/restful_objects/router/supporting_resources.rb +26 -31
  23. data/lib/restful_objects/version.rb +1 -1
  24. data/spec/integration/domain-types_actions_spec.rb +1 -3
  25. data/spec/integration/domain-types_collections_spec.rb +1 -39
  26. data/spec/integration/domain-types_properties_spec.rb +1 -78
  27. data/spec/integration/domain-types_spec.rb +39 -0
  28. data/spec/integration/{server-root_spec.rb → homepage_spec.rb} +2 -3
  29. data/spec/integration/objects_actions_spec.rb +7 -0
  30. data/spec/integration/objects_collections_spec.rb +169 -0
  31. data/spec/integration/objects_properties_spec.rb +122 -0
  32. data/spec/{acceptance/generate_json_representations_spec.rb → integration/objects_spec.rb} +12 -4
  33. data/spec/unit/object_actions_spec.rb +5 -5
  34. data/spec/unit/object_collections_spec.rb +1 -1
  35. data/spec/unit/object_properties_spec.rb +6 -6
  36. data/spec/unit/object_spec.rb +9 -9
  37. data/spec/unit/service_spec.rb +5 -5
  38. metadata +54 -35
  39. data/spec/integration/domain_model_spec.rb +0 -35
  40. data/spec/unit/type_list_spec.rb +0 -37
@@ -1,47 +1,46 @@
1
- module RestfulObjects
2
- class CollectionDescription
3
- include LinkGenerator
4
- attr_reader :id, :type, :read_only
5
- attr_accessor :friendly_name, :description, :plural_form, :member_order, :disabled_reason
1
+ class RestfulObjects::CollectionDescription
2
+ include RestfulObjects::LinkGenerator
6
3
 
7
- def initialize(id, type, domain_type, options = {})
8
- @id = id
9
- @type = type
10
- @domain_type = domain_type
11
- @read_only = options[:read_only].nil? ? false : options[:read_only]
12
- @disabled_reason = options[:disabled_reason] || 'read only collection' if read_only
13
- @friendly_name = options[:friendly_name] || id
14
- @description = options[:description] || id
15
- @plural_form = options[:plural_form]
16
- @member_order = options[:member_order]
17
- end
4
+ attr_reader :id, :type, :read_only
5
+ attr_accessor :friendly_name, :description, :plural_form, :member_order, :disabled_reason
18
6
 
19
- def get_representation
20
- representation = {
21
- 'id' => id,
22
- 'memberOrder' => member_order,
23
- 'links' => [
24
- link_to(:self, "/domain-types/#{@domain_type}/collections/#{@id}", :collection_description),
25
- link_to(:up, "/domain-types/#{@domain_type}", :domain_type),
26
- link_to(:return_type, "/domain-types/list", :domain_type),
27
- link_to(:element_type, "/domain-types/#{@type}", :domain_type)
28
- ],
29
- 'extensions' => metadata
30
- }
7
+ def initialize(id, type, domain_type, options = {})
8
+ @id = id
9
+ @type = type
10
+ @domain_type = domain_type
11
+ @read_only = options[:read_only].nil? ? false : options[:read_only]
12
+ @disabled_reason = options[:disabled_reason] || 'read only collection' if read_only
13
+ @friendly_name = options[:friendly_name] || id
14
+ @description = options[:description] || id
15
+ @plural_form = options[:plural_form]
16
+ @member_order = options[:member_order]
17
+ end
18
+
19
+ def get_representation
20
+ representation = {
21
+ 'id' => id,
22
+ 'memberOrder' => member_order,
23
+ 'links' => [
24
+ link_to(:self, "/domain-types/#{@domain_type}/collections/#{@id}", :collection_description),
25
+ link_to(:up, "/domain-types/#{@domain_type}", :domain_type),
26
+ link_to(:return_type, "/domain-types/list", :domain_type),
27
+ link_to(:element_type, "/domain-types/#{@type}", :domain_type)
28
+ ],
29
+ 'extensions' => metadata
30
+ }
31
31
 
32
- representation['friendlyName'] = friendly_name if friendly_name
33
- representation['description'] = description if description
32
+ representation['friendlyName'] = friendly_name if friendly_name
33
+ representation['description'] = description if description
34
34
 
35
- representation.to_json
36
- end
35
+ representation.to_json
36
+ end
37
37
 
38
- def metadata
39
- { 'friendlyName' => friendly_name,
40
- 'description' => description,
41
- 'returnType' => 'list',
42
- 'elementType' => type,
43
- 'memberOrder' => member_order,
44
- 'pluralForm' => plural_form }
45
- end
38
+ def metadata
39
+ { 'friendlyName' => friendly_name,
40
+ 'description' => description,
41
+ 'returnType' => 'list',
42
+ 'elementType' => type,
43
+ 'memberOrder' => member_order,
44
+ 'pluralForm' => plural_form }
46
45
  end
47
46
  end
@@ -2,129 +2,126 @@ require_relative 'property_description'
2
2
  require_relative 'collection_description'
3
3
  require_relative 'action_description'
4
4
 
5
- module RestfulObjects
6
- class DomainType
7
- include LinkGenerator
8
-
9
- attr_reader :id, :is_service, :properties, :collections, :actions
10
- attr_accessor :friendly_name, :plural_name, :description
11
-
12
- def initialize(id)
13
- @id = id
14
- @properties = {}
15
- @collections = {}
16
- @actions = {}
17
- @is_service = false
18
- @friendly_name = ''
19
- @plural_name = ''
20
- @description = ''
21
- end
5
+ class RestfulObjects::DomainType
6
+ include RestfulObjects::LinkGenerator
7
+
8
+ attr_reader :id, :is_service, :properties, :collections, :actions
9
+ attr_accessor :friendly_name, :plural_name, :description
10
+
11
+ def initialize(id)
12
+ @id = id
13
+ @properties = {}
14
+ @collections = {}
15
+ @actions = {}
16
+ @is_service = false
17
+ @friendly_name = ''
18
+ @plural_name = ''
19
+ @description = ''
20
+ end
22
21
 
23
- def register_property(name, return_type, options = {})
24
- options[:member_order] ||= @properties.count + 1
25
- @properties[name] = PropertyDescription.new(name, @id, return_type, options)
26
- end
22
+ def register_property(name, return_type, options = {})
23
+ options[:member_order] ||= @properties.count + 1
24
+ @properties[name] = RestfulObjects::PropertyDescription.new(name, @id, return_type, options)
25
+ end
27
26
 
28
- def register_collection(name, type, options = {})
29
- options[:member_order] ||= @collections.count + 1
30
- @collections[name] = CollectionDescription.new(name, type, @id, options)
31
- end
27
+ def register_collection(name, type, options = {})
28
+ options[:member_order] ||= @collections.count + 1
29
+ @collections[name] = RestfulObjects::CollectionDescription.new(name, type, @id, options)
30
+ end
32
31
 
33
- def register_action(name, options = {})
34
- options[:member_order] ||= @actions.count + 1
35
- @actions[name] = ActionDescription.new(name, @id, options)
36
- end
32
+ def register_action(name, options = {})
33
+ options[:member_order] ||= @actions.count + 1
34
+ @actions[name] = RestfulObjects::ActionDescription.new(name, @id, options)
35
+ end
37
36
 
38
- def get_representation
39
- { 'name' => @id,
40
- 'domainType' => @id,
41
- 'friendlyName' => @friendly_name,
42
- 'pluralName' => @plural_name,
43
- 'description' => @description,
44
- 'isService' => @is_service,
45
- 'members' => get_members,
46
- 'typeActions' => get_type_actions,
47
- 'links' => [ link_to(:self, "/domain-types/#{@id}", :domain_type) ],
48
- 'extensions' => {}
49
- }.to_json
50
- end
37
+ def get_representation
38
+ { 'name' => @id,
39
+ 'domainType' => @id,
40
+ 'friendlyName' => @friendly_name,
41
+ 'pluralName' => @plural_name,
42
+ 'description' => @description,
43
+ 'isService' => @is_service,
44
+ 'members' => get_members,
45
+ 'typeActions' => get_type_actions,
46
+ 'links' => [ link_to(:self, "/domain-types/#{@id}", :domain_type) ],
47
+ 'extensions' => {}
48
+ }.to_json
49
+ end
51
50
 
52
- def new_proto_persistent_object
53
- persist_link = link_to(:persist, "/objects/#{id}", :object, method: 'POST')
54
- persist_link['arguments'] = { 'members' => {} }
55
- members = {}
56
- properties.each do |name, property|
57
- if not property.optional
58
- persist_link['arguments']['members'][name] = {
59
- 'value' => nil,
60
- 'extensions' => property.metadata }
61
- end
62
- members[name] = { 'value' => nil }
51
+ def new_proto_persistent_object
52
+ persist_link = link_to(:persist, "/objects/#{id}", :object, method: 'POST')
53
+ persist_link['arguments'] = { 'members' => {} }
54
+ members = {}
55
+ properties.each do |name, property|
56
+ if not property.optional
57
+ persist_link['arguments']['members'][name] = {
58
+ 'value' => nil,
59
+ 'extensions' => property.metadata }
63
60
  end
64
-
65
- { 'title' => "New #{id}",
66
- 'members' => members,
67
- 'links' => [ persist_link ],
68
- 'extensions' => {} }
61
+ members[name] = { 'value' => nil }
69
62
  end
70
63
 
71
- def post_prototype_object(members_json)
72
- members = JSON.parse(members_json)['members']
64
+ { 'title' => "New #{id}",
65
+ 'members' => members,
66
+ 'links' => [ persist_link ],
67
+ 'extensions' => {} }
68
+ end
69
+
70
+ def post_prototype_object(members_json)
71
+ members = JSON.parse(members_json)['members']
73
72
 
74
- new_object = Object.const_get(@id.to_sym).new
73
+ new_object = Object.const_get(@id.to_sym).new
75
74
 
76
- members.each do |name, value|
77
- if properties.include?(name) then
78
- new_object.put_property_as_json(name, value.to_json)
79
- else
80
- raise "member of property '#{name}' not found in type '#{@id}'"
81
- end
75
+ members.each do |name, value|
76
+ if properties.include?(name) then
77
+ new_object.ro_put_property_and_get_response(name, value.to_json)
78
+ else
79
+ raise "member of property '#{name}' not found in type '#{@id}'"
82
80
  end
83
-
84
- new_object.get_representation
85
81
  end
86
82
 
87
- def metadata
88
- { 'domainType' => id,
89
- 'friendlyName' => friendly_name,
90
- 'pluralName' => plural_name,
91
- 'description' => description,
92
- 'isService' => is_service }
93
- end
83
+ new_object.ro_get_representation_response
84
+ end
94
85
 
95
- private
86
+ def metadata
87
+ { 'domainType' => id,
88
+ 'friendlyName' => friendly_name,
89
+ 'pluralName' => plural_name,
90
+ 'description' => description,
91
+ 'isService' => is_service }
92
+ end
96
93
 
97
- def get_members
98
- properties_members.merge(collections_members.merge(actions_members))
99
- end
94
+ protected
100
95
 
101
- def properties_members
102
- result = Hash.new
103
- @properties.each do |name, property|
104
- result[name] = link_to(:property, "/domain-types/#{@id}/properties/#{name}", :property_description)
105
- end
106
- result
107
- end
96
+ def get_members
97
+ ro_properties_members.merge(collections_members.merge(actions_members))
98
+ end
108
99
 
109
- def collections_members
110
- result = Hash.new
111
- @collections.each do |name, collection|
112
- result[name] = link_to(:collection, "/domain-types/#{@id}/collections/#{name}", :collection_description)
113
- end
114
- result
115
- end
100
+ def properties_members
101
+ result = {}
102
+ @properties.each do |name, property|
103
+ result[name] = link_to(:property, "/domain-types/#{@id}/properties/#{name}", :property_description)
104
+ end
105
+ result
106
+ end
116
107
 
117
- def actions_members
118
- result = Hash.new
119
- @actions.each do |name, action|
120
- result[name] = link_to(:action, "/domain-types/#{@id}/actions/#{name}", :action_description)
121
- end
122
- result
123
- end
108
+ def collections_members
109
+ result = {}
110
+ @collections.each do |name, collection|
111
+ result[name] = link_to(:collection, "/domain-types/#{@id}/collections/#{name}", :collection_description)
112
+ end
113
+ result
114
+ end
124
115
 
125
- def get_type_actions
126
- {}
127
- end
116
+ def actions_members
117
+ result = {}
118
+ @actions.each do |name, action|
119
+ result[name] = link_to(:action, "/domain-types/#{@id}/actions/#{name}", :action_description)
120
+ end
121
+ result
128
122
  end
129
- end
130
123
 
124
+ def get_type_actions
125
+ {}
126
+ end
127
+ end
@@ -1,60 +1,55 @@
1
- module RestfulObjects
2
- class ParameterDescription
3
- include LinkGenerator
1
+ class RestfulObjects::ParameterDescription
2
+ include RestfulObjects::LinkGenerator
4
3
 
5
- attr_reader :id, :name, :number, :kind_type, :type
6
- attr_accessor :friendly_name, :description, :optional, :max_length, :pattern, :format
4
+ attr_reader :id, :name, :number, :kind_type, :type
5
+ attr_accessor :friendly_name, :description, :optional, :max_length, :pattern, :format
7
6
 
8
- def initialize(id, definition, number)
9
- @id = id
10
- @name = id
7
+ def initialize(id, definition, number)
8
+ @id = id
9
+ @name = id
11
10
 
12
- if definition.is_a? Array # [type, options]
13
- if [:string, :int, :decimal, :date, :blob].include?(definition.first) # scalar
14
- @kind_type = :scalar
15
- @type = definition.first
16
- elsif definition.first.is_a?(Class) # object type
17
- @kind_type = :object
18
- @type = definition.first.name
19
- elsif definition.first.is_a?(Strign) # object type
20
- @kind_type = :object
21
- @type = definition.first
22
- else
23
- raise "unssuported parameter definition type #{definition.class}"
24
- end
25
- options = definition.last
26
- elsif definition.is_a? Symbol # scalar type
11
+ if definition.is_a?(Array)# [type, options]
12
+ if [:string, :int, :decimal, :date, :blob].include?(definition.first) # scalar
27
13
  @kind_type = :scalar
28
- @type = definition
29
- raise "result type for scalar '#{@type}' unssuported" if not [:string, :int, :decimal, :date, :blob].include?(@type)
30
- elsif definition.is_a? String # object type
14
+ @type = definition.first
15
+ elsif definition.first.is_a?(Class) # object type
31
16
  @kind_type = :object
32
- @type = definition
33
- elsif definition.is_a? Class # object type
17
+ @type = definition.first.name
18
+ elsif definition.first.is_a?(Strign) # object type
34
19
  @kind_type = :object
35
- @type = definition.to_s
20
+ @type = definition.first
36
21
  else
37
22
  raise "unssuported parameter definition type #{definition.class}"
38
23
  end
39
-
40
- options ||= {}
41
- @number = options[:number] || number
42
- @friendly_name = options[:friendly_name] || id
43
- @description = options[:description] || id
44
- @optional = options[:optional].nil? ? true : options[:optional]
45
- @max_length = options[:max_length]
46
- @pattern = options[:pattern]
24
+ options = definition.last
25
+ elsif definition.is_a?(Symbol) # scalar type
26
+ @kind_type = :scalar
27
+ @type = definition
28
+ raise "result type for scalar '#{@type}' unssuported" unless [:string, :int, :decimal, :date, :blob].include?(@type)
29
+ elsif definition.is_a?(String)# object type
30
+ @kind_type = :object
31
+ @type = definition
32
+ elsif definition.is_a?(Class)# object type
33
+ @kind_type = :object
34
+ @type = definition.to_s
35
+ else
36
+ raise "unssuported parameter definition type #{definition.class}"
47
37
  end
48
38
 
49
- def metadata
50
- result = { 'friendlyName' => friendly_name,
51
- 'description' => description,
52
- 'optional' => optional,
53
- 'returnType' => type }
54
- result['maxLength'] = max_length if max_length
55
- result['pattern'] = pattern if pattern
56
- result['format'] = format if format
57
- result
58
- end
39
+ options ||= {}
40
+ @number = options[:number] || number
41
+ @friendly_name = options[:friendly_name] || id
42
+ @description = options[:description] || id
43
+ @optional = options[:optional].nil? ? true : options[:optional]
44
+ @max_length = options[:max_length]
45
+ @pattern = options[:pattern]
46
+ end
47
+
48
+ def metadata
49
+ result = { 'friendlyName' => friendly_name, 'description' => description, 'optional' => optional, 'returnType' => type }
50
+ result['maxLength'] = max_length if max_length
51
+ result['pattern'] = pattern if pattern
52
+ result['format'] = format if format
53
+ result
59
54
  end
60
55
  end
@@ -1,18 +1,15 @@
1
1
  require_relative 'parameter_description'
2
2
 
3
- module RestfulObjects
4
- class ParameterDescriptionList
5
- extend Forwardable
3
+ class RestfulObjects::ParameterDescriptionList
4
+ extend Forwardable
6
5
 
7
- def initialize
8
- @parameters = Hash.new
9
- end
10
-
11
- def add(id, definition)
12
- @parameters[id] = ParameterDescription.new(id, definition, count + 1)
13
- end
6
+ def initialize
7
+ @parameters = Hash.new
8
+ end
14
9
 
15
- def_delegators :@parameters, :[], :each, :include?, :count, :empty?
10
+ def add(id, definition)
11
+ @parameters[id] = RestfulObjects::ParameterDescription.new(id, definition, count + 1)
16
12
  end
17
- end
18
13
 
14
+ def_delegators :@parameters, :[], :each, :include?, :count, :empty?
15
+ end
@@ -1,75 +1,73 @@
1
- module RestfulObjects
2
- class PropertyDescription
3
- include LinkGenerator
1
+ class RestfulObjects::PropertyDescription
2
+ include RestfulObjects::LinkGenerator
4
3
 
5
- attr_accessor :id, :domain_type, :return_type, :is_reference, :friendly_name, :description, :optional, :read_only,
6
- :member_order, :max_length, :disabled_reason, :pattern
4
+ attr_accessor :id, :domain_type, :return_type, :is_reference, :friendly_name, :description, :optional, :read_only,
5
+ :member_order, :max_length, :disabled_reason, :pattern
7
6
 
8
- def initialize(id, domain_type, return_type, options)
9
- if return_type.is_a?(Hash)
10
- raise "hash with :object key expected for property reference" unless return_type.has_key?(:object)
11
- else
12
- raise "property type #{return_type} usupported" if not [:string, :int, :bool, :decimal, :date, :blob].include?(return_type)
13
- end
14
-
15
- @id = id
16
- @domain_type = domain_type
17
- if return_type.is_a?(Hash)
18
- @return_type = return_type[:object]
19
- @is_reference = true
20
- else
21
- @return_type = return_type
22
- @is_reference = false
23
- end
24
- @friendly_name = options[:friendly_name] || id
25
- @description = options[:description] || id
26
- @optional = options[:optional].nil? ? true : options[:optional]
27
- @read_only = options[:read_only].nil? ? false : options[:read_only]
28
- @member_order = options[:member_order] || 1
29
- @max_length = options[:max_length]
30
- @disabled_reason = options[:disabled_reason] || 'read-only property' if read_only
31
- @pattern = options[:pattern]
7
+ def initialize(id, domain_type, return_type, options)
8
+ if return_type.is_a?(Hash)
9
+ raise "hash with :object key expected for property reference" unless return_type.has_key?(:object)
10
+ else
11
+ raise "property type #{return_type} usupported" unless [:string, :int, :bool, :decimal, :date, :blob].include?(return_type)
32
12
  end
33
13
 
34
- def get_representation
35
- {
36
- 'id' => @id,
37
- 'friendlyName' => friendly_name || '',
38
- 'description' => description || '',
39
- 'optional' => optional,
40
- 'memberOrder' => @member_order,
41
- 'links' => [
42
- link_to(:self, "/domain-types/#{@domain_type}/properties/#{@id}", :property_description),
43
- link_to(:up, "/domain-types/#{@domain_type}", :domain_type),
44
- link_to(:return_type, "/domain-types/#{@return_type}", :domain_type)
45
- ],
46
- 'extensions' => {}
47
- }.to_json
14
+ @id = id
15
+ @domain_type = domain_type
16
+ if return_type.is_a?(Hash)
17
+ @return_type = return_type[:object]
18
+ @is_reference = true
19
+ else
20
+ @return_type = return_type
21
+ @is_reference = false
48
22
  end
23
+ @friendly_name = options[:friendly_name] || id
24
+ @description = options[:description] || id
25
+ @optional = options[:optional].nil? ? true : options[:optional]
26
+ @read_only = options[:read_only].nil? ? false : options[:read_only]
27
+ @member_order = options[:member_order] || 1
28
+ @max_length = options[:max_length]
29
+ @disabled_reason = options[:disabled_reason] || 'read-only property' if read_only
30
+ @pattern = options[:pattern]
31
+ end
49
32
 
50
- def metadata
51
- result = { 'friendlyName' => friendly_name,
52
- 'description' => description,
53
- 'returnType' => return_type,
54
- 'format' => format,
55
- 'optional' => optional,
56
- 'memberOrder' => member_order }
57
- result['maxLength'] = max_length if max_length
58
- result['pattern'] = pattern if pattern
59
- result
60
- end
33
+ def get_representation
34
+ {
35
+ 'id' => @id,
36
+ 'friendlyName' => friendly_name || '',
37
+ 'description' => description || '',
38
+ 'optional' => optional,
39
+ 'memberOrder' => @member_order,
40
+ 'links' => [
41
+ link_to(:self, "/domain-types/#{@domain_type}/properties/#{@id}", :property_description),
42
+ link_to(:up, "/domain-types/#{@domain_type}", :domain_type),
43
+ link_to(:return_type, "/domain-types/#{@return_type}", :domain_type)
44
+ ],
45
+ 'extensions' => {}
46
+ }.to_json
47
+ end
61
48
 
62
- def format
63
- case return_type
64
- when :string
65
- 'string'
66
- end
67
- end
49
+ def metadata
50
+ result = { 'friendlyName' => friendly_name,
51
+ 'description' => description,
52
+ 'returnType' => return_type,
53
+ 'format' => format,
54
+ 'optional' => optional,
55
+ 'memberOrder' => member_order }
56
+ result['maxLength'] = max_length if max_length
57
+ result['pattern'] = pattern if pattern
58
+ result
59
+ end
68
60
 
69
- def get_value_as_json
70
- { 'id' =>
71
- { 'value' => '' }
72
- }.to_json
61
+ def format
62
+ case return_type
63
+ when :string
64
+ 'string'
73
65
  end
74
66
  end
67
+
68
+ def get_value_as_json
69
+ { 'id' =>
70
+ { 'value' => '' }
71
+ }.to_json
72
+ end
75
73
  end