ananke 0.1.1 → 1.0.0

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.
@@ -1,3 +1,4 @@
1
+ require 'json'
1
2
  module Ananke
2
3
 
3
4
  extend Colored
@@ -11,20 +12,12 @@ module Ananke
11
12
  mod
12
13
  end
13
14
 
14
- def get_json(path, obj, links)
15
- if obj.nil?
16
- out :error, "#{path} - No return object"
17
- ''
18
- else
19
- root_path = path.to_s.split('/')[0]
20
- dic = {root_path.to_sym => obj}
21
- dic[:links] = links unless links.nil?
22
- dic.to_json
23
- end
24
- end
25
-
26
15
  def get_id(obj, key)
27
- obj.respond_to?(key) ? obj.instance_variable_get(key) : obj.class == Hash && obj.has_key?(key) ? obj[key] : nil
16
+ if !key
17
+ out :error, "Cannot get id on object #{obj}, key is nil"
18
+ return nil
19
+ end
20
+ obj.class == Hash && obj.has_key?(key) ? obj[key] : obj.respond_to?(key) ? obj.instance_variable_get("@#{key}") : nil
28
21
  end
29
22
 
30
23
  def out(type, message)
@@ -10,7 +10,9 @@ module Ananke
10
10
  end
11
11
  #===========================SELF===============================
12
12
  def build_link_self(path, id)
13
- [{:rel => 'self', :uri => "/#{path}/#{id}"}]
13
+ uri = "/#{path.to_s}"
14
+ uri << "/#{id}" if id
15
+ [{:rel => 'self', :uri => uri}]#"/#{path}/#{id}"}]
14
16
  end
15
17
  #===========================LINKED=============================
16
18
  def build_link_list(path, id, mod, link_list)
@@ -1,6 +1,7 @@
1
- require './lib/ananke/validation'
2
- require './lib/ananke/linking'
3
- require './lib/ananke/helpers'
1
+ require 'ananke/linking'
2
+ require 'ananke/helpers'
3
+ require 'ananke/serialize'
4
+ require 'ananke/validation'
4
5
 
5
6
  module Ananke
6
7
  public
@@ -28,12 +29,44 @@ module Ananke
28
29
  end
29
30
  end
30
31
 
32
+ def make_response_item(path, mod, link_list, link_to_list, obj, key)
33
+ item = nil
34
+ id = get_id(obj, key)
35
+ if !id.nil?
36
+ dic = {path.to_sym => obj}
37
+ links = build_links(link_list, link_to_list, path, id, mod) if Ananke.settings[:links]
38
+ dic[:links] = links if links
39
+ item = dic
40
+ else
41
+ out :info, "#{path} - Cannot find key(#{key}) on object #{obj}"
42
+ end
43
+ item
44
+ end
45
+
46
+ def make_response(path, mod, link_list, link_to_list, obj, key)
47
+ if obj.class == Array
48
+ result_list = []
49
+ obj.each{|i| result_list << make_response_item(path, mod, link_list, link_to_list, i, key)}
50
+
51
+ dic = result_list.empty? ? {} : {"#{path}_list".to_sym => result_list}
52
+ link_self = build_link_self(path, '') if Ananke.settings[:links]
53
+ dic[:links] = link_self if link_self
54
+
55
+ Serialize.to_j(dic)
56
+ else
57
+ Serialize.to_j(make_response_item(path, mod, link_list, link_to_list, obj, key))
58
+ end
59
+ end
60
+
31
61
  def build(path)
32
62
  mod = get_mod(path)
33
63
  if mod.nil?
34
64
  out(:error, "Repository for #{path} not found")
35
65
  return
36
66
  end
67
+ if @id.empty?
68
+ out :info, "No Id specified for #{path}"
69
+ end
37
70
  key = @id[:key]
38
71
  fields = @fields
39
72
  link_list = @link_list
@@ -45,36 +78,16 @@ module Ananke
45
78
  param_missing!(key) if params[key].nil?
46
79
  obj = mod.one(params[key])
47
80
 
48
- links = build_links(link_list, link_to_list, path, params[key], mod)
49
- json = get_json(path, obj, links)
50
-
51
81
  status 200
52
- json
82
+ make_response(path, mod, link_list, link_to_list, obj, key)
53
83
  end
54
84
 
55
85
  #===========================GET================================
56
86
  build_route mod, :all, :get, "/#{path}/?" do
57
- obj_list = mod.all
87
+ obj = mod.all
58
88
 
59
89
  status 200
60
- #json_list = []
61
- result_list = []
62
- obj_list.each do |obj|
63
- id = get_id(obj, key)
64
- if !id.nil?
65
- dic = {path.to_sym => obj}
66
- links = build_links(link_list, link_to_list, path, id, mod) if Ananke.settings[:links]
67
- dic[:links] = links unless links.nil?
68
- result_list << dic
69
- else
70
- out :error, "#{path} - Cannot find key(#{key}) on object #{obj}"
71
- end
72
- end
73
- dic = {"#{path}_list".to_sym => result_list}
74
- link_self = build_link_self(path, '') if Ananke.settings[:links]
75
- dic[:links] = link_self unless link_self.nil?
76
-
77
- dic.to_json
90
+ make_response(path, mod, link_list, link_to_list, obj, key)
78
91
  end
79
92
 
80
93
  #===========================POST===============================
@@ -85,11 +98,8 @@ module Ananke
85
98
 
86
99
  obj = repository_call(mod, :add, new_params)
87
100
 
88
- links = build_links(link_list, link_to_list, path, new_params[key], mod)
89
- json = get_json(path, obj, links)
90
-
91
101
  status 201
92
- json
102
+ make_response(path, mod, link_list, link_to_list, obj, key)
93
103
  end
94
104
 
95
105
  #===========================PUT================================
@@ -100,12 +110,9 @@ module Ananke
100
110
  error status, message unless status.nil?
101
111
 
102
112
  obj = repository_call(mod, :edit, new_params)
103
-
104
- links = build_links(link_list, link_to_list, path, params[key], mod)
105
- json = get_json(path, obj, links)
106
-
113
+
107
114
  status 200
108
- json
115
+ make_response(path, mod, link_list, link_to_list, obj, key)
109
116
  end
110
117
 
111
118
  build_route mod, :edit, :put, "/#{path}/?" do
@@ -134,12 +141,10 @@ module Ananke
134
141
  param_missing!(:key) if inputs.length == 1 && new_params[:key].nil?
135
142
 
136
143
  obj = repository_call(mod, r[:name], new_params)
137
-
138
- links = build_links(link_list, link_to_list, "#{path}/#{r[:name]}", params[:key], mod)
139
- json = get_json("#{path}/#{r[:name]}", obj, links)
144
+ obj_list = obj.class == Array ? obj : [obj]
140
145
 
141
146
  status 200
142
- json
147
+ make_response(path, mod, link_list, link_to_list, obj_list, key).gsub("\"/#{path}/\"", "\"#{request.path}\"")
143
148
  end
144
149
  end
145
150
  end
@@ -0,0 +1,38 @@
1
+ require 'json'
2
+ module Serialize
3
+
4
+ def self.can_serialize?(obj)
5
+ obj.class != Array and !obj.to_json.start_with?('"#<')
6
+ end
7
+
8
+ def self.to_h(obj)
9
+ ret = {}
10
+
11
+ if obj.class == Hash
12
+ obj.each do |k, v|
13
+ ret[k.to_sym] = (can_serialize?(v) ? v : Serialize.to_h(v))
14
+ end
15
+ elsif obj.class == Array
16
+ ret = []
17
+ obj.each do |i|
18
+ #ret << (can_serialize?(i) ? i : Serialize.to_hash(i))
19
+ ret << Serialize.to_h(i)
20
+ end
21
+ else
22
+ obj.instance_variables.each do |e|
23
+ value = obj.instance_variable_get e.to_sym
24
+ ret[e[1..-1]] = (can_serialize?(value) ? value : Serialize.to_h(value))
25
+ end
26
+ end
27
+ ret
28
+ end
29
+
30
+ def self.to_j(obj)
31
+ Serialize.to_h(obj).to_json
32
+ end
33
+
34
+ def self.to_json_pretty(obj)
35
+ JSON.pretty_generate(Serialize.to_h(obj), opts = {:indent => ' '})
36
+ end
37
+
38
+ end
data/lib/ananke.rb CHANGED
@@ -2,13 +2,13 @@ libdir = File.dirname(__FILE__)
2
2
  $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
3
3
 
4
4
  require 'colored'
5
- require 'json'
6
5
  require 'sinatra/base'
7
6
 
8
7
  require 'ananke/helpers'
9
8
  require 'ananke/linking'
10
9
  require 'ananke/routing'
11
10
  require 'ananke/settings'
11
+ require 'ananke/serialize'
12
12
  require 'ananke/validation'
13
13
 
14
14
  module Ananke
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ananke
2
- VERSION = "0.1.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -15,18 +15,18 @@ describe 'Resource Route-For' do
15
15
  module Repository
16
16
  module Route_for
17
17
  def self.custom(id)
18
- {:content => 'Test'}
18
+ {:route_for_id => id, :content => 'Test'}
19
19
  end
20
20
  end
21
21
  end
22
22
  route :route_for do
23
- id :link_id
23
+ id :route_for_id
24
24
  route_for :custom
25
25
  end
26
26
 
27
27
  get "/route_for/custom/1"
28
28
  check_status(200)
29
- last_response.body.should == '{"route_for":{"content":"Test"},"links":[{"rel":"self","uri":"/route_for/custom/1"}]}'
29
+ last_response.body.should == '{"route_for_list":[{"route_for":{"route_for_id":"1","content":"Test"},"links":[{"rel":"self","uri":"/route_for/1"}]}],"links":[{"rel":"self","uri":"/route_for/custom/1"}]}'
30
30
  end
31
31
 
32
32
  it """
@@ -35,17 +35,17 @@ describe 'Resource Route-For' do
35
35
  module Repository
36
36
  module Route_for
37
37
  def self.multi(id, name)
38
- {:content => 'Test'}
38
+ {:route_for_id => id, :content => 'Test'}
39
39
  end
40
40
  end
41
41
  end
42
42
  route :route_for do
43
- id :link_id
43
+ id :route_for_id
44
44
  route_for :multi, :post
45
45
  end
46
46
 
47
47
  post "/route_for/multi", body={:id => 1, :name => 'some name'}
48
48
  check_status(200)
49
- last_response.body.should == '{"route_for":{"content":"Test"},"links":[{"rel":"self","uri":"/route_for/multi/"}]}'
49
+ last_response.body.should == '{"route_for_list":[{"route_for":{"route_for_id":"1","content":"Test"},"links":[{"rel":"self","uri":"/route_for/1"}]}],"links":[{"rel":"self","uri":"/route_for/multi"}]}'
50
50
  end
51
51
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: ananke
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.1
5
+ version: 1.0.0
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-18 00:00:00 +02:00
13
+ date: 2011-02-22 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -100,24 +100,25 @@ extra_rdoc_files:
100
100
  - README.rdoc
101
101
  files:
102
102
  - lib/ananke.rb
103
- - lib/version.rb
104
103
  - lib/ananke/settings.rb
104
+ - lib/ananke/helpers.rb
105
105
  - lib/ananke/linking.rb
106
- - lib/ananke/routing.rb
106
+ - lib/ananke/serialize.rb
107
107
  - lib/ananke/validation.rb
108
- - lib/ananke/helpers.rb
108
+ - lib/ananke/routing.rb
109
+ - lib/version.rb
110
+ - spec/nice_formatter.rb
111
+ - spec/call_chain.rb
109
112
  - spec/dumping.rb
110
113
  - spec/cov_adapter.rb
111
- - spec/lib/ananke_spec.rb
112
- - spec/lib/validation_spec.rb
113
- - spec/lib/out_spec.rb
114
114
  - spec/lib/json_spec.rb
115
- - spec/lib/link_to_spec.rb
115
+ - spec/lib/ananke_spec.rb
116
116
  - spec/lib/route_for_spec.rb
117
+ - spec/lib/out_spec.rb
118
+ - spec/lib/validation_spec.rb
117
119
  - spec/lib/linked_spec.rb
120
+ - spec/lib/link_to_spec.rb
118
121
  - spec/spec_helper.rb
119
- - spec/call_chain.rb
120
- - spec/nice_formatter.rb
121
122
  - Gemfile
122
123
  - Rakefile
123
124
  - README.rdoc
@@ -128,7 +129,7 @@ licenses: []
128
129
  post_install_message: |
129
130
  **************************************************
130
131
 
131
- Thank you for installing ananke-0.1.1
132
+ Thank you for installing ananke-1.0.0
132
133
 
133
134
  Please be sure to look at README.rdoc to see what might have changed
134
135
  since the last release and how to use this GEM.
@@ -157,17 +158,17 @@ rubyforge_project:
157
158
  rubygems_version: 1.5.0
158
159
  signing_key:
159
160
  specification_version: 3
160
- summary: ananke-0.1.1
161
+ summary: ananke-1.0.0
161
162
  test_files:
163
+ - spec/nice_formatter.rb
164
+ - spec/call_chain.rb
162
165
  - spec/dumping.rb
163
166
  - spec/cov_adapter.rb
164
- - spec/lib/ananke_spec.rb
165
- - spec/lib/validation_spec.rb
166
- - spec/lib/out_spec.rb
167
167
  - spec/lib/json_spec.rb
168
- - spec/lib/link_to_spec.rb
168
+ - spec/lib/ananke_spec.rb
169
169
  - spec/lib/route_for_spec.rb
170
+ - spec/lib/out_spec.rb
171
+ - spec/lib/validation_spec.rb
170
172
  - spec/lib/linked_spec.rb
173
+ - spec/lib/link_to_spec.rb
171
174
  - spec/spec_helper.rb
172
- - spec/call_chain.rb
173
- - spec/nice_formatter.rb