toast 1.0.8 → 1.0.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 50d88f29268283ea8b037037c3b0bf95df8b639b
4
- data.tar.gz: 8fce6e446f54b375c90ef90cbccc00f746142d2b
3
+ metadata.gz: 013c0b6f57e6509f8555a3bb9a4886e1abaf3f33
4
+ data.tar.gz: 317ecb00aeaff9b9c7e3faf0271119e956d96075
5
5
  SHA512:
6
- metadata.gz: 4966d74e26040d21f39286c65e1ed2211557ea094eddbd3a0e85f9439cf6e4ed96e5417ca108c9dbeec7af0245c14c31aff82ca448e91f6353906e80ab121aae
7
- data.tar.gz: d7039b45831ffd6e25dd35ee76b1219461495c74707040811660deb4062bc79b926af42df66e87fe8954176116e36c34b2dec5d5e4c021828f941f54ed58a776
6
+ metadata.gz: f14236d4f0d9d5bb2f4959c36e759bf2d51b1509dbd31b1b4c2560fa31c2a8cbe90c335e73b533fecc7c95bf8588cedcef1681f858ff4694b9ce1f6e45a9b3ee
7
+ data.tar.gz: 8cdb9770f943e081eb7e9d099de3214cb7ab167dc25558162ae0300beb05cfabd29b0508c891cdd3a8d0aa3a9a94b827bf0769b05a4392256d586d477aad16fa
data/README.md CHANGED
@@ -20,7 +20,7 @@ Other features are:
20
20
  * attribute selection per request
21
21
  * processing of URI parameters
22
22
 
23
- See the [User Manual](https://robokopp.github.io/toast) for a detailed description.
23
+ See the [User Manual](https://robert-annies.github.io/toast) for a detailed description.
24
24
 
25
25
  Releases
26
26
  ========
data/lib/toast.rb CHANGED
@@ -15,7 +15,7 @@ module Toast
15
15
  # path tree to resolve the requested model
16
16
  @@path_tree = {}
17
17
 
18
- cattr_accessor :expositions, :settings, :path_tree
18
+ cattr_accessor :expositions, :settings, :path_tree, :request
19
19
 
20
20
  class ConfigError < StandardError
21
21
  end
@@ -59,7 +59,7 @@ module Toast
59
59
 
60
60
  def self.info str
61
61
  if Rails.const_defined?('Server') # only on console server
62
- puts Toast::Sym+' Toast: '+str
62
+ puts Toast::Sym+' Toast: '+str
63
63
  end
64
64
  end
65
65
 
@@ -82,7 +82,7 @@ module Toast
82
82
  # base_uri must be passed to be prepended in URIs
83
83
  def self.represent instance, base_uri = ''
84
84
 
85
- # using RequestHelper#represent_one method with a mocked up object
85
+ # using RequestHelper#represent_one method with a mocked up object :-/
86
86
  obj = Object.new
87
87
  class << obj
88
88
  include Toast::RequestHelpers
@@ -91,4 +91,13 @@ module Toast
91
91
  obj.base_uri = base_uri
92
92
  obj.represent_one(instance, obj.get_config(instance.class) )
93
93
  end
94
+
95
+ def self.base_uri
96
+ raise Toast::NotInRequestContext unless request
97
+
98
+ port = ":#{request.port}" unless request.port.in?([80,443])
99
+ # remove recource path part form full path (namespace remains)
100
+ path = request.path.sub(request.path_parameters[:toast_path],'')
101
+ (request.protocol + request.host + port.to_s + path).chomp('/')
102
+ end
94
103
  end
@@ -20,11 +20,14 @@ class Toast::ConfigDSL::Base
20
20
  raise_config_error 'Block expected.'
21
21
  end
22
22
 
23
+
24
+
25
+
23
26
  # register base path with 'under' prefix
24
- to_path_tree = lambda do |path|
27
+ to_path_tree = lambda do |path|
25
28
  if path.empty?
26
29
  { model_class.to_s.underscore.pluralize => model_class }
27
- else
30
+ else
28
31
  { path.first => to_path_tree.call(path[1..-1]) }
29
32
  end
30
33
  end
@@ -34,6 +37,15 @@ class Toast::ConfigDSL::Base
34
37
  raise_config_error "multiple definitions of endpoint URI segment `.../#{key}/...'"
35
38
  end
36
39
 
40
+ # externd model_class with toast_uri accessor
41
+ model_class.send(:define_method, :toast_full_uri) do
42
+ Toast.base_uri + '/' + self.toast_local_uri
43
+ end
44
+
45
+ model_class.send(:define_method, :toast_local_uri) do
46
+ [path, self.class.name.underscore.pluralize, self.id].delete_if(&:blank?).join('/')
47
+ end
48
+
37
49
  # base config object
38
50
  config_data = OpenStruct.new
39
51
 
@@ -43,7 +55,7 @@ class Toast::ConfigDSL::Base
43
55
  self.model_class = model_class
44
56
  self.media_type = as
45
57
  self.prefix_path = path
46
-
58
+
47
59
  # defaults
48
60
  self.readables = []
49
61
  self.writables = []
data/lib/toast/errors.rb CHANGED
@@ -38,4 +38,7 @@ module Toast::Errors
38
38
  @response_data = response_data
39
39
  end
40
40
  end
41
+
42
+ class Toast::NotInRequestContext < StandardError; end
43
+
41
44
  end
@@ -6,7 +6,7 @@ require 'toast/plural_assoc_request'
6
6
  require 'toast/errors'
7
7
 
8
8
  class Toast::RackApp
9
- # NOTE: the RackApp object is shared in threads of concurrent requests
9
+ # NOTE: the RackApp object is shared in threads of concurrent requests
10
10
  # (e.g. when using Puma server, but not in Passenger (single-threded, multi-process)).
11
11
  # Anyays, don't use any instance vars (@ variables in #call).
12
12
  # It causes chaos
@@ -16,17 +16,18 @@ class Toast::RackApp
16
16
  def call(env)
17
17
 
18
18
  request = ActionDispatch::Request.new(env)
19
-
19
+ Toast.request = request
20
+
20
21
  Toast.logger.info "[#{Thread.current.object_id}] processing: <#{URI.decode(request.fullpath)}>"
21
22
 
22
- # Authentication: respond with 401 on exception or falsy return value:
23
+ # Authentication: respond with 401 on exception or falsy return value:
23
24
  begin
24
25
  unless (auth = Toast::ConfigDSL::Settings::AuthenticateContext.new.
25
26
  instance_exec(request, &Toast.settings.authenticate))
26
27
  return response :unauthorized, msg: "authentication failed"
27
28
  end
28
- rescue Toast::Errors::CustomAuthFailure => caf
29
- return response(caf.response_data[:status] || :unauthorized,
29
+ rescue Toast::Errors::CustomAuthFailure => caf
30
+ return response(caf.response_data[:status] || :unauthorized,
30
31
  msg: caf.response_data[:body],
31
32
  headers: caf.response_data[:headers])
32
33
  rescue => error
@@ -34,7 +35,7 @@ class Toast::RackApp
34
35
  end
35
36
 
36
37
  path = request.path_parameters[:toast_path].split('/')
37
-
38
+
38
39
  # look up requested model
39
40
  model_class = resolve_model(path, Toast.path_tree)
40
41
 
@@ -120,15 +121,15 @@ class Toast::RackApp
120
121
  end
121
122
 
122
123
  private
123
- # gets the model class from the
124
+ # gets the model class from the
124
125
  # it's similar to Hash#dig but stops at a non string
125
126
  def resolve_model path, path_tree
126
- if path_tree[ path.first ].is_a?(Hash)
127
+ if path_tree[ path.first ].is_a?(Hash)
127
128
  # dig deeper
128
129
  resolve_model(path[1..-1], path_tree[ path.first ])
129
130
  else
130
131
  path_tree[ path.first ]
131
132
  end
132
- end
133
+ end
133
134
  end
134
135
 
@@ -8,13 +8,8 @@ module Toast::RequestHelpers
8
8
  end || raise(Toast::Errors::ConfigNotFound)
9
9
  end
10
10
 
11
- # this is hard when behind a proxy
12
- # relies on HTTP_X_FORWARDED* headers
13
11
  def base_uri request
14
- port = ":#{request.port}" unless request.port.in?([80,443])
15
- # remove recource path part form full path (namespace remains)
16
- path = request.path.sub(request.path_parameters[:toast_path],'')
17
- (request.protocol + request.host + port.to_s + path).chomp('/')
12
+ Toast.base_uri
18
13
  end
19
14
 
20
15
  # split the name and id of the resource from a LinkHeader
@@ -25,12 +20,21 @@ module Toast::RequestHelpers
25
20
  def represent_one record, config
26
21
  result = {}
27
22
 
23
+ model_uri = [@base_uri, config.prefix_path, record.class.name.underscore.pluralize].delete_if(&:blank?).join('/')
24
+
25
+ # can we inject model_uri into the recortd, so that virtual attribute methods can use it in their result?
26
+
27
+ # - setting a special property on the record :-/, OK Toast could extend all exposed classes by a special accessor,
28
+ # maybe only if configured.
29
+ # - calling somehow this method in different/extended context (how?)
30
+ # - passing this as parameter, while not requiring all the attribute methods to accept a 2. arg (possible?)
31
+ # - If the result is a String it can return a templated String like "{{ toast_uri }}", OK for single
32
+ # strings, but for mebedded Hashes with Strings no, too expensive.
33
+
28
34
  (config.readables + config.writables).each do |attr|
29
35
  result[attr.to_s] = record.send(attr) if attr_selected?(attr)
30
36
  end
31
37
 
32
- model_uri = [@base_uri, config.prefix_path, record.class.name.underscore.pluralize].delete_if(&:blank?).join('/')
33
-
34
38
  result['self'] = "#{model_uri}/#{record.id}" if attr_selected?('self')
35
39
 
36
40
  # add associations, collections and singles
@@ -127,7 +131,7 @@ module Toast::RequestHelpers
127
131
  rescue Toast::Errors::BadRequest
128
132
  raise # re-raise
129
133
  rescue => error
130
- raise Toast::Errors::HandlerError.new(error, error.backtrace.first.sub(/:in.*/,''))
134
+ raise Toast::Errors::HandlerError.new(error, error.backtrace.first.try(:sub,/:in.*/,''))
131
135
  end
132
136
  result
133
137
  end
data/lib/toast/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Toast
2
- VERSION = '1.0.8'
2
+ VERSION = '1.0.9'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toast
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.8
4
+ version: 1.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - robokopp (Robert Annies)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-21 00:00:00.000000000 Z
11
+ date: 2019-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails