ananke 0.0.3 → 0.0.4

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.
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