restful_objects 0.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.
@@ -0,0 +1,129 @@
1
+ module RestfulObjects
2
+ class Server < Sinatra::Base
3
+ after do
4
+ headers['Access-Control-Allow-Origin'] = '*'
5
+ end
6
+
7
+ # B. SUPPORTING RESOURCES
8
+ # B.5 Homepage
9
+ get '/' do
10
+ model.get_homepage
11
+ end
12
+ # B.6 User
13
+ get "/user" do
14
+ model.get_user_as_json
15
+ end
16
+ # B.7 Services
17
+ get "/services" do
18
+ model.get_services
19
+ end
20
+ # B.8 Version
21
+ get '/version' do
22
+ model.get_version
23
+ end
24
+ # B.9 Objects of Type Resource
25
+ post '/objects/:domain_type' do
26
+ populate_response model.types[params[:domain_type]].post_prototype_object(request.body.read)
27
+ end
28
+ # C. DOMAIN OBJECT RESOURCES
29
+ # C.14 Domain Object
30
+ get "/objects/:domain_type/:instance_id" do
31
+ populate_response model.objects[params[:instance_id].to_i].get_representation
32
+ end
33
+ delete "/objects/:domain_type/:instance_id" do
34
+ model.objects[params[:instance_id].to_i].rs_delete
35
+ end
36
+ # C.15 Domain Services
37
+ get "/services/:service_id" do
38
+ populate_response model.services[params[:service_id]].get_representation
39
+ end
40
+ # C.16 Property
41
+ get "/objects/:domain_type/:instance_id/properties/:property_id" do
42
+ model.objects[params[:instance_id].to_i].get_property_as_json(params[:property_id])
43
+ end
44
+ put "/objects/:domain_type/:instance_id/properties/:property_id" do
45
+ model.objects[params[:instance_id].to_i].put_property_as_json(params[:property_id], request.body.read)
46
+ end
47
+ delete "/objects/:domain_type/:instance_id/properties/:property_id" do
48
+ model.objects[params[:instance_id].to_i].clear_property(params[:property_id])
49
+ end
50
+ # C.17 Collection #
51
+ get "/objects/:domain_type/:instance_id/collections/:collection_id" do
52
+ model.objects[params[:instance_id].to_i].get_collection_as_json(params[:collection_id])
53
+ end
54
+ put "/objects/:domain_type/:instance_id/collections/:collection_id" do
55
+ model.objects[params[:instance_id].to_i].add_to_collection(params[:collection_id], request.body.read)
56
+ end
57
+ delete "/objects/:domain_type/:instance_id/collections/:collection_id" do
58
+ model.objects[params[:instance_id].to_i].delete_from_collection(params[:collection_id], request.body.read)
59
+ end
60
+ # C.18 Action
61
+ get "/objects/:domain_type/:instance_id/actions/:action_id" do
62
+ model.objects[params[:instance_id].to_i].get_action(params[:action_id])
63
+ end
64
+ get "/services/:service_id/actions/:action_id" do
65
+ model.services[params[:service_id]].get_action(params[:action_id])
66
+ end
67
+ # C.19 Action Invoke
68
+ get "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
69
+ model.objects[params[:instance_id].to_i].get_action_invoke(params[:action_id], process_params)
70
+ end
71
+ get "/services/:service_id/actions/:action_id/invoke" do
72
+ model.services[params[:service_id]].get_action_invoke(params[:action_id], process_params)
73
+ end
74
+ post "/objects/:domain_type/:instance_id/actions/:action_id/invoke" do
75
+ model.objects[params[:instance_id].to_i].get_action_invoke(params[:action_id], request.body.read)
76
+ end
77
+ post "/services/:service_id/actions/:action_id/invoke" do
78
+ model.services[params[:service_id]].get_action_invoke(params[:action_id], request.body.read)
79
+ end
80
+ # D. DOMAIN TYPE RESOURCES #
81
+ # D.21 Domain Types
82
+ get "/domain-types" do
83
+ model.types.get_representation
84
+ end
85
+ # D.22 Domain Type
86
+ get "/domain-types/:domain_type" do
87
+ model.types[params[:domain_type]].get_representation
88
+ end
89
+ # D.23 Domain Type Property
90
+ get "/domain-types/:domain_type/properties/:property_id" do
91
+ model.types[params[:domain_type]].properties[params[:property_id]].get_representation
92
+ end
93
+ # D.24 Domain Type Collection
94
+ get "/domain-types/:domain_type/collections/:collection_id" do
95
+ model.types[params[:domain_type]].collections[params[:collection_id]].get_representation
96
+ end
97
+ # D.25 Domain Type Action
98
+ get "/domain-types/:domain_type/actions/:action_id" do
99
+ model.types[params[:domain_type]].actions[params[:action_id]].get_representation
100
+ end
101
+ # D.26 Domain Type Action Parameter
102
+
103
+ # D.27 Domain Type Action Invoke
104
+
105
+ # ------------------------------------------------------------------------------------------ #
106
+ helpers do
107
+ def model
108
+ RestfulObjects::DomainModel.current
109
+ end
110
+
111
+ def populate_response(http_response)
112
+ content_type http_response.content_type
113
+ status http_response.status
114
+ body http_response.body
115
+ end
116
+
117
+ def process_params
118
+ if request.query_string != ''
119
+ query_params = CGI.parse(request.query_string)
120
+ parameters = Hash.new
121
+ query_params.each { |key, value| parameters[key] = { 'value' => value.first } }
122
+ parameters.to_json
123
+ else
124
+ request.body.read
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,55 @@
1
+ module RestfulObjects
2
+ class ServiceList
3
+ extend Forwardable
4
+ include LinkGenerator
5
+
6
+ def initialize(base_url)
7
+ @services = Hash.new
8
+ @base_url = base_url
9
+ end
10
+
11
+ def register(service)
12
+ raise 'service registration should be done with a class' if not service.is_a? Class
13
+ @services[service.name] = service
14
+ end
15
+
16
+ def get_list
17
+ representation = {
18
+ 'links' => [
19
+ link_to(:self, '/services', :services),
20
+ link_to(:up, '/', :homepage),
21
+ ],
22
+ 'value' => generate_values,
23
+ 'extensions' => { }
24
+ }.to_json
25
+ end
26
+
27
+ def [](key)
28
+ value = @services[key]
29
+ if value.is_a? Class
30
+ value = value.new
31
+ @services[key] = value
32
+ end
33
+ value
34
+ end
35
+
36
+ def_delegators :@services, :each, :include?, :count, :empty?, :clear
37
+
38
+ private
39
+
40
+ def generate_values
41
+ ensure_all_created
42
+ values = []
43
+ each do |name, service|
44
+ element = link_to(:service, "/services/#{name}", :object, service_id: name)
45
+ element['title'] = service.title
46
+ values << element
47
+ end
48
+ values
49
+ end
50
+
51
+ def ensure_all_created
52
+ @services.each { |name, value| @services[name] = value.new if value.is_a? Class }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,110 @@
1
+ module RestfulObjects
2
+ class Type
3
+ include LinkGenerator
4
+
5
+ attr_reader :id, :is_service, :properties, :collections, :actions
6
+ attr_accessor :friendly_name, :plural_name, :description
7
+
8
+ def initialize(id)
9
+ @id = id
10
+ @properties = PropertyList.new(id)
11
+ @collections = CollectionList.new(id)
12
+ @actions = ActionList.new(id)
13
+ @is_service = false
14
+ @friendly_name = ''
15
+ @plural_name = ''
16
+ @description = ''
17
+ end
18
+
19
+ def get_representation
20
+ { 'name' => @id,
21
+ 'domainType' => @id,
22
+ 'friendlyName' => @friendly_name,
23
+ 'pluralName' => @plural_name,
24
+ 'description' => @description,
25
+ 'isService' => @is_service,
26
+ 'members' => get_members,
27
+ 'typeActions' => get_type_actions,
28
+ 'links' => [ link_to(:self, "/domain-types/#{@id}", :domain_type) ],
29
+ 'extensions' => {}
30
+ }.to_json
31
+ end
32
+
33
+ def new_proto_persistent_object
34
+ persist_link = link_to(:persist, "/objects/#{id}", :object, method: 'POST')
35
+ persist_link['arguments'] = { 'members' => {} }
36
+ members = {}
37
+ properties.each do |name, property|
38
+ if not property.optional
39
+ persist_link['arguments']['members'][name] = {
40
+ 'value' => nil,
41
+ 'extensions' => property.metadata }
42
+ end
43
+ members[name] = { 'value' => nil }
44
+ end
45
+
46
+ { 'title' => "New #{id}",
47
+ 'members' => members,
48
+ 'links' => [ persist_link ],
49
+ 'extensions' => {} }
50
+ end
51
+
52
+ def post_prototype_object(members_json)
53
+ members = JSON.parse(members_json)['members']
54
+
55
+ new_object = Object.const_get(@id.to_sym).new
56
+
57
+ members.each do |name, value|
58
+ if properties.include?(name) then
59
+ new_object.put_property_as_json(name, value.to_json)
60
+ else
61
+ raise "member of property '#{name}' not found in type '#{@id}'"
62
+ end
63
+ end
64
+
65
+ new_object.get_representation
66
+ end
67
+
68
+ def metadata
69
+ { 'domainType' => id,
70
+ 'friendlyName' => friendly_name,
71
+ 'pluralName' => plural_name,
72
+ 'description' => description,
73
+ 'isService' => is_service }
74
+ end
75
+
76
+ private
77
+
78
+ def get_members
79
+ properties_members.merge(collections_members.merge(actions_members))
80
+ end
81
+
82
+ def properties_members
83
+ result = Hash.new
84
+ @properties.each do |name, property|
85
+ result[name] = link_to(:property, "/domain-types/#{@id}/properties/#{name}", :property_description)
86
+ end
87
+ result
88
+ end
89
+
90
+ def collections_members
91
+ result = Hash.new
92
+ @collections.each do |name, collection|
93
+ result[name] = link_to(:collection, "/domain-types/#{@id}/collections/#{name}", :collection_description)
94
+ end
95
+ result
96
+ end
97
+
98
+ def actions_members
99
+ result = Hash.new
100
+ @actions.each do |name, action|
101
+ result[name] = link_to(:action, "/domain-types/#{@id}/actions/#{name}", :action_description)
102
+ end
103
+ result
104
+ end
105
+
106
+ def get_type_actions
107
+ {}
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,30 @@
1
+ module RestfulObjects
2
+ class TypeList
3
+ extend Forwardable
4
+ include LinkGenerator
5
+
6
+ def initialize
7
+ @types = Hash.new
8
+ end
9
+
10
+ def add(name)
11
+ @types[name] = Type.new(name)
12
+ end
13
+
14
+ def get_representation
15
+ response = {
16
+ 'links' => [
17
+ link_to(:self, '/domain-types', :type_list),
18
+ link_to(:up, '/', :homepage),
19
+ ],
20
+ 'value' => []
21
+ }
22
+
23
+ each { |name, type| response['value'] << link_to(:domain_type, "/domain-types/#{name}", :domain_type) }
24
+
25
+ response.to_json
26
+ end
27
+
28
+ def_delegators :@types, :[], :each, :include?, :size?, :clear, :empty?
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ module RestfulObjects
2
+ class User
3
+ include LinkGenerator
4
+
5
+ attr_reader :base_url, :user_name
6
+ attr_accessor :friendly_name, :email
7
+
8
+ def initialize(base_url, user_name)
9
+ @base_url = base_url
10
+ @user_name = user_name
11
+ @friendly_name = ''
12
+ @email = ''
13
+ @roles = Array.new
14
+ end
15
+
16
+ def add_role(role)
17
+ @roles.push(role)
18
+ end
19
+
20
+ def get_as_json
21
+ { 'links' => [ gen_link('self', '/user', 'user'), gen_link('up', '/', 'homepage') ],
22
+ 'userName' => @user_name,
23
+ 'friendlyName' => @friendly_name,
24
+ 'email' => @email,
25
+ 'roles' => @roles,
26
+ 'extensions' => {}
27
+ }.to_json
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module RestfulObjects
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: restful_objects
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Pablo Vizcay
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 10.1.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 10.1.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 2.14.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 2.14.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack-test
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.6.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.6.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: json_expressions
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.8.2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.8.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: sinatra
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.4.4
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.4.4
97
+ description: This gem is a framework for implementing Restful Objects servers.
98
+ email:
99
+ - pabo.vizcay@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - lib/restful_objects/action_description.rb
105
+ - lib/restful_objects/action_list.rb
106
+ - lib/restful_objects/collection_description.rb
107
+ - lib/restful_objects/collection_list.rb
108
+ - lib/restful_objects/http_response.rb
109
+ - lib/restful_objects/link_generator.rb
110
+ - lib/restful_objects/model.rb
111
+ - lib/restful_objects/object.rb
112
+ - lib/restful_objects/object_actions.rb
113
+ - lib/restful_objects/object_collections.rb
114
+ - lib/restful_objects/object_list.rb
115
+ - lib/restful_objects/object_macros.rb
116
+ - lib/restful_objects/object_properties.rb
117
+ - lib/restful_objects/parameter_description.rb
118
+ - lib/restful_objects/parameter_description_list.rb
119
+ - lib/restful_objects/property_list.rb
120
+ - lib/restful_objects/server.rb
121
+ - lib/restful_objects/service_list.rb
122
+ - lib/restful_objects/type.rb
123
+ - lib/restful_objects/type_list.rb
124
+ - lib/restful_objects/user.rb
125
+ - lib/restful_objects/version.rb
126
+ homepage: https://github.com/vizcay/RestfulObjectsRuby
127
+ licenses:
128
+ - MIT
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.1.9
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: This gem is a framework for implementing Restful Objects servers.
150
+ test_files: []
151
+ has_rdoc: