grape_hal_integration 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cfefb012fe2d46d776de00e9ce1844199d544d94
4
- data.tar.gz: a0f99b7f66cf398663b39bf3d6bd5719b33c909d
3
+ metadata.gz: 1f1456724906907fcd3387a1f008a35d1583b2c9
4
+ data.tar.gz: d69dcb3eee1fcfc54fda87fa1db6c09fb5e912e2
5
5
  SHA512:
6
- metadata.gz: d6de74da3117f62348a74073d2332f7f9e98a3be1d9f276d8a50ecc543cb43236a1381ecbc2ef791036270defde2ddedbc294118326ea3f441a64380227147db
7
- data.tar.gz: 41d9936337de2d93d956cf6dbdb200cbd96ee5da9898e31e6abe6c63481ec084ea97f5a82f0d9b3ee0b33697b3b285443d5b8bea3e33e1ec71460cbe5b7d2825
6
+ metadata.gz: 383b13f0cf50d92a48bdab2f6a8dea0e6849d9e90e14a78dbe8f8fcc53a45b493b27509f2cbd381df47d0fa1a2e06fcbb998ab638673c2aa3838d29460bf2e73
7
+ data.tar.gz: 4c3b6b1886613c0fc85d67030433a0b7f583f1120d1f41da541928283d9f3117bcc1c91a77972d76b3794f107562dc428c3e1c5ddf919f1f697d051f2b26ad28
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'grape_hal_integration'
7
- spec.version = '0.0.1'
7
+ spec.version = '0.1.0'
8
8
  spec.authors = ['Miroslav Csonka']
9
9
  spec.email = ['miroslav.csonka@gmail.com']
10
10
  spec.summary = %q{Provides convenient helpers for using hal with grape framework}
@@ -4,15 +4,36 @@ class GrapeHalIntegration < Grape::API
4
4
 
5
5
  @@endpoints = {}
6
6
 
7
- def self.build_action(name)
8
- "#{self.name}-#{name.to_s}"
7
+ def self.links(class_name, action_name)
8
+ links = class_name.endpoint(action_name)[:links]
9
+ _links = Hash[links.map { |link|
10
+
11
+ if link.include? '#'
12
+ class_name2, action_name2 = link.split '#'
13
+ name = action_name2
14
+ endpoint = class_name2.constantize.endpoint(action_name2)
15
+ else
16
+ name = link
17
+ endpoint = class_name.endpoint(link)
18
+ end
19
+
20
+ raise "Unregistered link to '#{link}'" if endpoint.nil?
21
+
22
+ return [name, endpoint[:self]]
23
+ }]
24
+ _links[:self] = class_name.endpoint(action_name)[:self]
25
+ _links
26
+ end
27
+
28
+ def self.build_current_action(name)
29
+ "#{self.name}##{name.to_s}"
9
30
  end
10
31
 
11
- def self.implement_new(name, url, links = [], &block)
32
+ def self.implement(name, url, links = [], &block)
12
33
  name = name.to_s
13
34
  http_verb, url = url.split ' '
14
- get_params_name = url.scan(/\{([^}]*)\}/).flatten
15
- @@endpoints[build_action(name)] = {
35
+
36
+ @@endpoints[build_current_action(name)] = {
16
37
  name: name,
17
38
  links: links,
18
39
  block: block,
@@ -21,28 +42,39 @@ class GrapeHalIntegration < Grape::API
21
42
  method: http_verb.upcase
22
43
  }
23
44
  }
45
+ @@endpoints[build_current_action(name)][:self][:templated] = true if url.include? '{'
24
46
 
25
- if url.include? '{'
26
- @@endpoints[build_action(name)][:self][:templated] = true
27
- end
28
-
29
- super_context = lambda do
47
+ class_name = self.name.constantize
48
+ get_params_name = url.scan(/\{([^}]*)\}/).flatten
49
+ wrapper_block = lambda do
30
50
  get_params_values = get_params_name.map do |get_param_name|
31
- params[get_param_name.intern]
51
+ result = get_param_name.match(/(.+)_id/)
52
+ value = params[get_param_name.intern]
53
+ unless result.blank?
54
+ begin
55
+ klass = result[1].singularize.classify.constantize
56
+ value = klass.find(value) if klass.class == Class
57
+ rescue NameError
58
+ end
59
+ end
60
+ value
32
61
  end
33
- self.instance_exec *get_params_values, &block
62
+
63
+ hal = {_links: HalIntegrator.links(class_name, name)}
64
+ response = self.instance_exec *get_params_values, &block
65
+ hal.merge(response)
34
66
  end
35
67
 
36
68
  resource url.gsub('{', ':').gsub('}', '') do
37
69
  case http_verb.upcase
38
70
  when 'POST'
39
- post &super_context
71
+ post &wrapper_block
40
72
  when 'PUT'
41
- put &super_context
73
+ put &wrapper_block
42
74
  when 'DELETE'
43
- delete &super_context
75
+ delete &wrapper_block
44
76
  when 'GET'
45
- get &super_context
77
+ get &wrapper_block
46
78
  else
47
79
  raise "Undefined http verb '#{http_verb}'"
48
80
  end
@@ -50,19 +82,17 @@ class GrapeHalIntegration < Grape::API
50
82
  end
51
83
 
52
84
  def self.endpoint(name)
53
- @@endpoints[build_action(name.to_s)]
85
+ @@endpoints[build_current_action(name.to_s)]
86
+ end
87
+
88
+ def self.endpoint_url(name)
89
+ endpoint(name)[:self]
54
90
  end
55
91
 
56
92
  def self.method_missing(method_name, *arguments, &block)
57
- raise "Unknown name '#{build_action(method_name)}'" unless @@endpoints.has_key? build_action(method_name)
93
+ raise "Unknown name '#{build_current_action(method_name)}'" unless @@endpoints.has_key? build_current_action(method_name)
58
94
  context = arguments.shift
59
95
  context.instance_exec *arguments, &endpoint(method_name)[:block]
60
96
  end
61
97
 
62
- def self.endpoint_url(name)
63
- e = endpoint(name)
64
- raise "Could not find endpoint '#{name}'" unless e.is_a? Hash
65
- e[:self]
66
- end
67
-
68
98
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape_hal_integration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miroslav Csonka