restful_objects 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: