ananke 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -26,7 +26,7 @@ Ananke is a DSL that extends the functionality of Sinatra for easy creation of R
26
26
  Install the gem and run with:
27
27
 
28
28
  gem install ananke
29
- ruby -rubygems myapp.rb
29
+ ruby myapp.rb
30
30
 
31
31
  All Users
32
32
  http://localhost:4567/user
@@ -0,0 +1,46 @@
1
+ module Ananke
2
+
3
+ extend Colored
4
+
5
+ public
6
+
7
+ def get_mod(path)
8
+ mod = nil
9
+ rep = Module.const_get(Ananke.repository) if Module.const_defined?(Ananke.repository)
10
+ mod = rep.const_get("#{path.capitalize}".to_sym) if !rep.nil? && rep.const_defined?("#{path.capitalize}".to_sym)
11
+ mod
12
+ end
13
+
14
+ def get_json(path, obj, links)
15
+ if obj.nil?
16
+ out :error, "#{path} - No return object"
17
+ ''
18
+ elsif !obj.respond_to?(:to_json)
19
+ out :error, "#{path} - Return object cannot be converted to JSON"
20
+ ''
21
+ else
22
+ root_path = path.to_s.split('/')[0]
23
+ dic = {root_path.to_sym => obj}
24
+ dic[:links] = links unless links.nil?
25
+ dic.to_json
26
+ end
27
+ end
28
+
29
+ def get_id(obj, key)
30
+ obj.respond_to?(key) ? obj.instance_variable_get(key) : obj.class == Hash && obj.has_key?(key) ? obj[key] : nil
31
+ end
32
+
33
+ def out(type, message)
34
+ return if !Ananke.settings[:output]
35
+ message = case
36
+ when type == :info && Ananke.settings[:info]
37
+ message.blue
38
+ when type == :warning && Ananke.settings[:warning]
39
+ message.yellow
40
+ when type == :error && Ananke.settings[:error]
41
+ message.red
42
+ end
43
+ puts message unless message.nil?
44
+ message
45
+ end
46
+ end
@@ -0,0 +1,37 @@
1
+ module Ananke
2
+ def build_links(link_list, link_to_list, path, id, mod)
3
+ return if !Ananke.settings[:links]
4
+
5
+ links = build_link_self(path, id)
6
+ links += build_link_list(path, id, mod, link_list)
7
+ links += build_link_to_list(path, id, link_to_list)
8
+
9
+ links
10
+ end
11
+ #===========================SELF===============================
12
+ def build_link_self(path, id)
13
+ [{:rel => 'self', :uri => "/#{path}/#{id}"}]
14
+ end
15
+ #===========================LINKED=============================
16
+ def build_link_list(path, id, mod, link_list)
17
+ links = []
18
+ link_list.each do |l|
19
+ mod_method = "#{l[:rel]}_id_list"
20
+ if mod.respond_to?(mod_method)
21
+ id_list = mod.send(mod_method, id)
22
+ id_list.each{|i| links << {:rel => "#{l[:rel]}", :uri => "/#{l[:rel]}/#{i}"}}
23
+ else
24
+ out :error, "#{path} - #{mod} does not respond to '#{mod_method.to_s}'"
25
+ end
26
+ end
27
+ links
28
+ end
29
+ #===========================LINK_TO============================
30
+ def build_link_to_list(path, id, link_to_list)
31
+ links = []
32
+ link_to_list.each do |l|
33
+ links << {:rel => "#{l[:rel]}", :uri => "/#{l[:rel]}/#{path}/#{id}"}
34
+ end
35
+ links
36
+ end
37
+ end
@@ -0,0 +1,117 @@
1
+ module Ananke
2
+ def build_route(mod, mod_method, verb, route, &block)
3
+ if mod.respond_to? mod_method
4
+ Sinatra::Base.send verb, "#{route}", do
5
+ instance_eval(&block)
6
+ end
7
+ else
8
+ out(:warning, "#{mod} does not respond to '#{mod_method.to_s}'")
9
+ end
10
+ end
11
+
12
+ def build(path)
13
+ mod = get_mod(path)
14
+ if mod.nil?
15
+ out(:error, "Repository for #{path} not found")
16
+ return
17
+ end
18
+ key = @id[:key]
19
+ fields = @fields
20
+ link_list = @link_list
21
+ link_to_list = @link_to_list
22
+ route_for_list = @route_for_list
23
+
24
+ #===========================GET/ID=============================
25
+ build_route mod, :one, :get, "/#{path}/:#{key}" do
26
+ param_missing!(key) if params[key].nil?
27
+ obj = mod.one(params[key])
28
+
29
+ links = build_links(link_list, link_to_list, path, params[key], mod)
30
+ json = get_json(path, obj, links)
31
+
32
+ status 200
33
+ json
34
+ end
35
+
36
+ #===========================GET================================
37
+ build_route mod, :all, :get, "/#{path}/?" do
38
+ obj_list = mod.all
39
+
40
+ status 200
41
+ #json_list = []
42
+ result_list = []
43
+ obj_list.each do |obj|
44
+ id = get_id(obj, key)
45
+ if !id.nil?
46
+ dic = {path.to_sym => obj}
47
+ links = build_links(link_list, link_to_list, path, id, mod) if Ananke.settings[:links]
48
+ dic[:links] = links unless links.nil?
49
+ result_list << dic
50
+ else
51
+ out :error, "#{path} - Cannot find key(#{key}) on object #{obj}"
52
+ end
53
+ end
54
+ dic = {"#{path}_list".to_sym => result_list}
55
+ link_self = build_link_self(path, '') if Ananke.settings[:links]
56
+ dic[:links] = link_self unless link_self.nil?
57
+
58
+ dic.to_json
59
+ end
60
+
61
+ #===========================POST===============================
62
+ build_route mod, :add, :post, "/#{path}/?" do
63
+ status, message = validate(fields, params)
64
+ error status, message unless status.nil?
65
+ obj = mod.add(params)
66
+
67
+ links = build_links(link_list, link_to_list, path, params[key], mod)
68
+ json = get_json(path, obj, links)
69
+
70
+ status 201
71
+ json
72
+ end
73
+
74
+ #===========================PUT================================
75
+ build_route mod, :edit, :put, "/#{path}/:#{key}" do
76
+ param_missing!(key) if params[key].nil?
77
+ status, message = validate(fields, params)
78
+ error status, message unless status.nil?
79
+ obj = mod.edit(params[key], params)
80
+
81
+ links = build_links(link_list, link_to_list, path, params[key], mod)
82
+ json = get_json(path, obj, links)
83
+
84
+ status 200
85
+ json
86
+ end
87
+
88
+ build_route mod, :edit, :put, "/#{path}/?" do
89
+ param_missing!(key)
90
+ end
91
+
92
+ #===========================DELETE=============================
93
+ build_route mod, :delete, :delete, "/#{path}/:#{key}" do
94
+ param_missing!(key) if params[key].nil?
95
+ mod.delete(params[key]) if !params[key].nil?
96
+ status 200
97
+ end
98
+
99
+ build_route mod, :delete, :delete, "/#{path}/?" do
100
+ param_missing!(key)
101
+ end
102
+
103
+ #===========================ROUTE_FOR==========================
104
+ route_for_list.each do |r|
105
+ build_route mod, r[:name], :get, "/#{path}/#{r[:name]}/:key" do
106
+ param_missing!(:key) if params[:key].nil?
107
+ obj = mod.send(r[:name], params[:key])
108
+
109
+ links = build_links(link_list, link_to_list, "#{path}/#{r[:name]}", params[:key], mod)
110
+ json = get_json("#{path}/#{r[:name]}", obj, links)
111
+
112
+ status 200
113
+ json
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,28 @@
1
+ module Ananke
2
+ class << self
3
+ attr_accessor :settings
4
+ end
5
+
6
+ private
7
+
8
+ @settings = {
9
+ :output => true,
10
+ :info => true,
11
+ :warning => true,
12
+ :error => true,
13
+
14
+ :links => true,
15
+
16
+ :repository => 'Repository'
17
+ }
18
+
19
+ public
20
+
21
+ def repository
22
+ @settings[:repository].to_sym
23
+ end
24
+
25
+ def set(name, val)
26
+ @settings[name] = val
27
+ end
28
+ end
@@ -0,0 +1,37 @@
1
+ module Ananke
2
+ class << self
3
+ attr_accessor :rules
4
+ end
5
+
6
+ private
7
+
8
+ @rules = [:length]
9
+
10
+ def validate(fields, params)
11
+ errors = []
12
+ fields.each do |field|
13
+ value = params[field[:key].to_s]
14
+ errors << "Missing Required Parameter: #{field[:key]}" if field[:type] == :required && value.nil?
15
+ Ananke::Rules.value = value
16
+ field[:rules].each do |r|
17
+ res = r.class == Hash ? Ananke::Rules.send("validate_#{r.first[0]}", r.first[1]) : Ananke::Rules.send("validate_#{r}")
18
+ errors << "#{field[:key]}: #{res}" unless res.nil?
19
+ end
20
+ end
21
+ return 400, errors unless errors.empty?
22
+ end
23
+ def param_missing!(key)
24
+ error 400, "Missing Parameter: #{key.to_s}"
25
+ end
26
+
27
+ #===========================Rules==============================
28
+
29
+ module Rules
30
+ class << self
31
+ attr_accessor :value
32
+ end
33
+ def self.validate_length(min)
34
+ value.length >= min ? nil : "Value must be at least #{min} characters long"
35
+ end
36
+ end
37
+ end
data/lib/ananke.rb CHANGED
@@ -2,238 +2,14 @@ require 'colored'
2
2
  require 'json'
3
3
  require 'sinatra/base'
4
4
 
5
+ require './lib/ananke/helpers'
6
+ require './lib/ananke/linking'
7
+ require './lib/ananke/routing'
8
+ require './lib/ananke/settings'
9
+ require './lib/ananke/validation'
10
+
5
11
  module Ananke
6
- class << self
7
- attr_accessor :default_repository, :rules, :settings
8
- end
9
-
10
12
  private
11
- extend Colored
12
-
13
- @default_repository = 'Repository'
14
- @rules = [:length]
15
- @settings = {
16
- :output => true,
17
- :info => true,
18
- :warning => true,
19
- :error => true,
20
-
21
- :links => true
22
- }
23
-
24
- #===========================OUTPUT=============================
25
- def out(type, message)
26
- return if !Ananke.settings[:output]
27
- message = case
28
- when type == :info && Ananke.settings[:info]
29
- message.blue
30
- when type == :warning && Ananke.settings[:warning]
31
- message.yellow
32
- when type == :error && Ananke.settings[:error]
33
- message.red
34
- end
35
- puts message unless message.nil?
36
- message
37
- end
38
-
39
- #===========================HELPERS============================
40
- def get_mod(path)
41
- mod = nil
42
- rep = Module.const_get(Ananke.default_repository.to_sym) if Module.const_defined?(Ananke.default_repository.to_sym)
43
- mod = rep.const_get("#{path.capitalize}".to_sym) if !rep.nil? && rep.const_defined?("#{path.capitalize}".to_sym)
44
- mod
45
- end
46
-
47
- def get_json(path, obj, links)
48
- if obj.nil?
49
- out :error, "#{path} - No return object"
50
- ''
51
- elsif !obj.respond_to?(:to_json)
52
- out :error, "#{path} - Return object cannot be converted to JSON"
53
- ''
54
- else
55
- root_path = path.to_s.split('/')[0]
56
- dic = {root_path.to_sym => obj}
57
- dic[:links] = links unless links.nil?
58
- dic.to_json
59
- end
60
- end
61
-
62
- def get_id(obj, key)
63
- obj.respond_to?(key) ? obj.instance_variable_get(key) : obj.class == Hash && obj.has_key?(key) ? obj[key] : nil
64
- end
65
-
66
- #===========================BUILDUP============================
67
- def build_route(mod, mod_method, verb, route, &block)
68
- if mod.respond_to? mod_method
69
- Sinatra::Base.send verb, "#{route}", do
70
- instance_eval(&block)
71
- end
72
- else
73
- out(:warning, "#{mod} does not respond to '#{mod_method.to_s}'")
74
- end
75
- end
76
-
77
- def build(path)
78
- mod = get_mod(path)
79
- if mod.nil?
80
- out(:error, "Repository for #{path} not found")
81
- return
82
- end
83
- key = @id[:key]
84
- fields = @fields
85
- link_list = @link_list
86
- link_to_list = @link_to_list
87
- route_for_list = @route_for_list
88
-
89
- #===========================GET/ID=============================
90
- build_route mod, :one, :get, "/#{path}/:#{key}" do
91
- param_missing!(key) if params[key].nil?
92
- obj = mod.one(params[key])
93
-
94
- links = build_links(link_list, link_to_list, path, params[key], mod)
95
- json = get_json(path, obj, links)
96
-
97
- status 200
98
- json
99
- end
100
-
101
- #===========================GET================================
102
- build_route mod, :all, :get, "/#{path}/?" do
103
- obj_list = mod.all
104
-
105
- status 200
106
- #json_list = []
107
- result_list = []
108
- obj_list.each do |obj|
109
- id = get_id(obj, key)
110
- if !id.nil?
111
- dic = {path.to_sym => obj}
112
- links = build_links(link_list, link_to_list, path, id, mod) if Ananke.settings[:links]
113
- dic[:links] = links unless links.nil?
114
- result_list << dic
115
- else
116
- out :error, "#{path} - Cannot find key(#{key}) on object #{obj}"
117
- end
118
- end
119
- dic = {"#{path}_list".to_sym => result_list}
120
- link_self = build_link_self(path, '') if Ananke.settings[:links]
121
- dic[:links] = link_self unless link_self.nil?
122
-
123
- dic.to_json
124
- end
125
-
126
- #===========================POST===============================
127
- build_route mod, :add, :post, "/#{path}/?" do
128
- status, message = validate(fields, params)
129
- error status, message unless status.nil?
130
- obj = mod.add(params)
131
-
132
- links = build_links(link_list, link_to_list, path, params[key], mod)
133
- json = get_json(path, obj, links)
134
-
135
- status 201
136
- json
137
- end
138
-
139
- #===========================PUT================================
140
- build_route mod, :edit, :put, "/#{path}/:#{key}" do
141
- param_missing!(key) if params[key].nil?
142
- status, message = validate(fields, params)
143
- error status, message unless status.nil?
144
- obj = mod.edit(params[key], params)
145
-
146
- links = build_links(link_list, link_to_list, path, params[key], mod)
147
- json = get_json(path, obj, links)
148
-
149
- status 200
150
- json
151
- end
152
-
153
- build_route mod, :edit, :put, "/#{path}/?" do
154
- param_missing!(key)
155
- end
156
-
157
- #===========================DELETE=============================
158
- build_route mod, :delete, :delete, "/#{path}/:#{key}" do
159
- param_missing!(key) if params[key].nil?
160
- mod.delete(params[key]) if !params[key].nil?
161
- status 200
162
- end
163
-
164
- build_route mod, :delete, :delete, "/#{path}/?" do
165
- param_missing!(key)
166
- end
167
-
168
- #===========================ROUTE_FOR==========================
169
- route_for_list.each do |r|
170
- build_route mod, r[:name], :get, "/#{path}/#{r[:name]}/:key" do
171
- param_missing!(:key) if params[:key].nil?
172
- obj = mod.send(r[:name], params[:key])
173
-
174
- links = build_links(link_list, link_to_list, "#{path}/#{r[:name]}", params[:key], mod)
175
- json = get_json("#{path}/#{r[:name]}", obj, links)
176
-
177
- status 200
178
- json
179
- end
180
- end
181
- end
182
-
183
- #===========================Validation=========================
184
- def validate(fields, params)
185
- errors = []
186
- fields.each do |field|
187
- value = params[field[:key].to_s]
188
- errors << "Missing Required Parameter: #{field[:key]}" if field[:type] == :required && value.nil?
189
- Ananke::Rules.value = value
190
- field[:rules].each do |r|
191
- res = r.class == Hash ? Ananke::Rules.send("validate_#{r.first[0]}", r.first[1]) : Ananke::Rules.send("validate_#{r}")
192
- errors << "#{field[:key]}: #{res}" unless res.nil?
193
- end
194
- end
195
- return 400, errors unless errors.empty?
196
- end
197
- def param_missing!(key)
198
- error 400, "Missing Parameter: #{key.to_s}"
199
- end
200
-
201
- #===========================LINKS==============================
202
- def build_links(link_list, link_to_list, path, id, mod)
203
- return if !Ananke.settings[:links]
204
-
205
- links = build_link_self(path, id)
206
- links += build_link_list(path, id, mod, link_list)
207
- links += build_link_to_list(path, id, link_to_list)
208
-
209
- links
210
- end
211
- #===========================SELF===============================
212
- def build_link_self(path, id)
213
- [{:rel => 'self', :uri => "/#{path}/#{id}"}]
214
- end
215
- #===========================LINKED=============================
216
- def build_link_list(path, id, mod, link_list)
217
- links = []
218
- link_list.each do |l|
219
- mod_method = "#{l[:rel]}_id_list"
220
- if mod.respond_to?(mod_method)
221
- id_list = mod.send(mod_method, id)
222
- id_list.each{|i| links << {:rel => "#{l[:rel]}", :uri => "/#{l[:rel]}/#{i}"}}
223
- else
224
- out :error, "#{path} - #{mod} does not respond to '#{mod_method.to_s}'"
225
- end
226
- end
227
- links
228
- end
229
- #===========================LINK_TO============================
230
- def build_link_to_list(path, id, link_to_list)
231
- links = []
232
- link_to_list.each do |l|
233
- links << {:rel => "#{l[:rel]}", :uri => "/#{l[:rel]}/#{path}/#{id}"}
234
- end
235
- links
236
- end
237
13
 
238
14
  public
239
15
  #===========================DSL================================
@@ -268,21 +44,6 @@ module Ananke
268
44
  def rule(name, &block)
269
45
  Ananke::Rules.send(:define_singleton_method, "validate_#{name}", block)
270
46
  end
271
-
272
- #===========================Rules==============================
273
- module Rules
274
- class << self
275
- attr_accessor :value
276
- end
277
- def self.validate_length(min)
278
- value.length >= min ? nil : "Value must be at least #{min} characters long"
279
- end
280
- end
281
-
282
- #===========================Settings===========================
283
- def set(name, val)
284
- @settings[name] = val
285
- end
286
47
  end
287
48
 
288
49
  include Ananke
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ananke
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -36,7 +36,7 @@ describe 'Basic Ananke REST' do
36
36
  it """
37
37
  Should setup the defaults for REST
38
38
  """ do
39
- Ananke.default_repository.should == 'Repository'
39
+ Ananke.repository.should == :Repository
40
40
  end
41
41
 
42
42
  it """
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ananke
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.0.4
6
6
  platform: ruby
7
7
  authors:
8
8
  - Andries Coetzee
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-02-11 00:00:00 +02:00
13
+ date: 2011-02-12 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -100,18 +100,23 @@ extra_rdoc_files:
100
100
  - README.rdoc
101
101
  files:
102
102
  - lib/ananke.rb
103
+ - lib/ananke/settings.rb
104
+ - lib/ananke/helpers.rb
105
+ - lib/ananke/linking.rb
106
+ - lib/ananke/validation.rb
107
+ - lib/ananke/routing.rb
103
108
  - lib/version.rb
109
+ - spec/nice_formatter.rb
110
+ - spec/call_chain.rb
104
111
  - spec/dumping.rb
105
112
  - spec/cov_adapter.rb
106
113
  - spec/lib/ananke_spec.rb
107
- - spec/lib/ananke_linked_spec.rb
108
- - spec/lib/ananke_out_spec.rb
114
+ - spec/lib/route_for_spec.rb
115
+ - spec/lib/out_spec.rb
109
116
  - spec/lib/validation_spec.rb
110
- - spec/lib/ananke_link_to_spec.rb
111
- - spec/lib/ananke_route_for_spec.rb
117
+ - spec/lib/linked_spec.rb
118
+ - spec/lib/link_to_spec.rb
112
119
  - spec/spec_helper.rb
113
- - spec/call_chain.rb
114
- - spec/nice_formatter.rb
115
120
  - Gemfile
116
121
  - Rakefile
117
122
  - README.rdoc
@@ -122,7 +127,7 @@ licenses: []
122
127
  post_install_message: |
123
128
  **************************************************
124
129
 
125
- Thank you for installing ananke-0.0.3
130
+ Thank you for installing ananke-0.0.4
126
131
 
127
132
  Please be sure to look at README.rdoc to see what might have changed
128
133
  since the last release and how to use this GEM.
@@ -151,16 +156,16 @@ rubyforge_project:
151
156
  rubygems_version: 1.5.0
152
157
  signing_key:
153
158
  specification_version: 3
154
- summary: ananke-0.0.3
159
+ summary: ananke-0.0.4
155
160
  test_files:
161
+ - spec/nice_formatter.rb
162
+ - spec/call_chain.rb
156
163
  - spec/dumping.rb
157
164
  - spec/cov_adapter.rb
158
165
  - spec/lib/ananke_spec.rb
159
- - spec/lib/ananke_linked_spec.rb
160
- - spec/lib/ananke_out_spec.rb
166
+ - spec/lib/route_for_spec.rb
167
+ - spec/lib/out_spec.rb
161
168
  - spec/lib/validation_spec.rb
162
- - spec/lib/ananke_link_to_spec.rb
163
- - spec/lib/ananke_route_for_spec.rb
169
+ - spec/lib/linked_spec.rb
170
+ - spec/lib/link_to_spec.rb
164
171
  - spec/spec_helper.rb
165
- - spec/call_chain.rb
166
- - spec/nice_formatter.rb
File without changes
File without changes