hal_api-rails 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,108 @@
1
+ # encoding: utf-8
2
+
3
+ require 'active_support/concern'
4
+
5
+ # expects underlying model to have filename, class, and id attributes
6
+ module HalApi::Representer::UriMethods
7
+ extend ActiveSupport::Concern
8
+
9
+ module ClassMethods
10
+ attr_accessor :profile_host, :alternate_host
11
+
12
+ def self_link
13
+ link(:self) do
14
+ {
15
+ href: self_url(represented),
16
+ profile: model_uri(represented)
17
+ }
18
+ end
19
+ end
20
+
21
+ def profile_link
22
+ link(:profile) { model_uri(represented) }
23
+ end
24
+
25
+ def alternate_link
26
+ link :alternate do
27
+ {
28
+ href: alternate_url(model_path(represented)),
29
+ type: 'text/html'
30
+ }
31
+ end
32
+ end
33
+ end
34
+
35
+ def model_path(represented)
36
+ rep = becomes_represented_class(represented)
37
+ class_path = rep.class.name.underscore.pluralize
38
+ "#{class_path}/#{represented.id}"
39
+ end
40
+
41
+ def self_url(represented)
42
+ rep = becomes_represented_class(represented)
43
+ polymorphic_path([:api, rep])
44
+ end
45
+
46
+ def becomes_represented_class(rep)
47
+ return rep unless rep.respond_to?(:becomes)
48
+ klass = rep.try(:item_class) || rep.class.try(:base_class)
49
+ (klass && (klass != rep.class)) ? rep.becomes(klass) : rep
50
+ end
51
+
52
+ def alternate_url(*path)
53
+ "https://#{self.class.alternate_host}/#{path.map(&:to_s).join('/')}"
54
+ end
55
+
56
+ def model_uri(*args)
57
+ "http://#{self.class.profile_host}/model/#{joined_names(args)}"
58
+ end
59
+
60
+ alias_method :profil_url, :model_uri
61
+
62
+ def joined_names(args)
63
+ (Array(args.map { |arg| model_uri_part_to_string(arg) }) +
64
+ model_uri_suffix(args)).flatten.compact.join('/')
65
+ end
66
+
67
+ def model_uri_suffix(args)
68
+ represented = args.last
69
+ klass = represented.try(:item_decorator) || self.class
70
+ klass.name.deconstantize.underscore.dasherize.split('/')[1..-1] || []
71
+ end
72
+
73
+ def model_uri_part_to_string(part)
74
+ if part.is_a?(String) || part.is_a?(Symbol)
75
+ part.to_s.dasherize
76
+ else
77
+ klass = part.is_a?(Class) ? part : (part.try(:item_class) || part.class)
78
+ if klass.respond_to?(:base_class) && (klass.superclass != ActiveRecord::Base)
79
+ base = klass.superclass.name.underscore.dasherize
80
+ child = klass.name.underscore.gsub(/_#{base}$/, "").dasherize
81
+ [base, child]
82
+ else
83
+ klass.name.underscore.dasherize
84
+ end
85
+ end
86
+ end
87
+
88
+ def method_missing(method_name, *args, &block)
89
+ if method_name.to_s.ends_with?('_path_template')
90
+ original_method_name = method_name[0..-10]
91
+ template_named_path(original_method_name, *args)
92
+ else
93
+ super(method_name, *args, &block)
94
+ end
95
+ end
96
+
97
+ def template_named_path(named_path, options)
98
+ replace_options = options.keys.inject({}) do |s, k|
99
+ s[k] = "_#{k.upcase}_REPLACE_"
100
+ s
101
+ end
102
+ path = send(named_path, replace_options)
103
+ replace_options.keys.each do |k|
104
+ path.gsub!(replace_options[k], (options[k] || ''))
105
+ end
106
+ path
107
+ end
108
+ end
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hal_api-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Rhoden
8
+ - Andrew Kuklewicz
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2016-01-15 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activemodel
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 3.0.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 3.0.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: actionpack
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 3.0.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 3.0.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: rack-test
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 0.6.2
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.6.2
56
+ - !ruby/object:Gem::Dependency
57
+ name: activesupport
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 3.0.0
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 3.0.0
70
+ - !ruby/object:Gem::Dependency
71
+ name: responders
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '2.0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: roar-rails
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 1.0.1
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 1.0.1
98
+ - !ruby/object:Gem::Dependency
99
+ name: multi_json
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: bundler
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.10'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '1.10'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rake
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: '10.0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '10.0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: minitest
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ description: JSON HAL APIs on Rails in the style of PRX v4. Uses ROAR
155
+ email:
156
+ - carhoden@gmail.com
157
+ - andrew@beginsinwonder.com
158
+ executables: []
159
+ extensions: []
160
+ extra_rdoc_files: []
161
+ files:
162
+ - ".gitignore"
163
+ - ".travis.yml"
164
+ - CODE_OF_CONDUCT.md
165
+ - Gemfile
166
+ - LICENSE.txt
167
+ - README.md
168
+ - Rakefile
169
+ - bin/console
170
+ - bin/setup
171
+ - hal_api-rails.gemspec
172
+ - lib/hal_api.rb
173
+ - lib/hal_api/controller.rb
174
+ - lib/hal_api/controller/actions.rb
175
+ - lib/hal_api/controller/cache.rb
176
+ - lib/hal_api/controller/exceptions.rb
177
+ - lib/hal_api/controller/resources.rb
178
+ - lib/hal_api/errors.rb
179
+ - lib/hal_api/paged_collection.rb
180
+ - lib/hal_api/rails.rb
181
+ - lib/hal_api/rails/version.rb
182
+ - lib/hal_api/represented_model.rb
183
+ - lib/hal_api/representer.rb
184
+ - lib/hal_api/representer/caches.rb
185
+ - lib/hal_api/representer/caches/serialized_json.rb
186
+ - lib/hal_api/representer/curies.rb
187
+ - lib/hal_api/representer/embeds.rb
188
+ - lib/hal_api/representer/format_keys.rb
189
+ - lib/hal_api/representer/link_serialize.rb
190
+ - lib/hal_api/representer/uri_methods.rb
191
+ homepage: https://www.github.com/PRX/
192
+ licenses:
193
+ - MIT
194
+ metadata: {}
195
+ post_install_message:
196
+ rdoc_options: []
197
+ require_paths:
198
+ - lib
199
+ required_ruby_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ required_rubygems_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ requirements: []
210
+ rubyforge_project:
211
+ rubygems_version: 2.4.5
212
+ signing_key:
213
+ specification_version: 4
214
+ summary: JSON HAL APIs on Rails in the style of PRX
215
+ test_files: []