safrano 0.4.4 → 0.5.2
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 +4 -4
- data/lib/odata/attribute.rb +2 -2
- data/lib/odata/collection.rb +15 -10
- data/lib/odata/collection_filter.rb +5 -5
- data/lib/odata/collection_media.rb +63 -25
- data/lib/odata/complex_type.rb +185 -43
- data/lib/odata/entity.rb +31 -8
- data/lib/odata/error.rb +28 -0
- data/lib/odata/filter/base.rb +5 -0
- data/lib/odata/filter/parse.rb +6 -0
- data/lib/odata/filter/sequel.rb +15 -0
- data/lib/odata/filter/token.rb +13 -10
- data/lib/odata/filter/tree.rb +4 -4
- data/lib/odata/function_import.rb +35 -34
- data/lib/odata/model_ext.rb +28 -5
- data/lib/odata/transition.rb +22 -2
- data/lib/odata/walker.rb +23 -5
- data/lib/safrano/contract.rb +7 -9
- data/lib/safrano/core.rb +12 -12
- data/lib/safrano/deprecation.rb +5 -5
- data/lib/safrano/multipart.rb +4 -4
- data/lib/safrano/rack_app.rb +1 -1
- data/lib/safrano/request.rb +3 -2
- data/lib/safrano/service.rb +38 -21
- data/lib/safrano/version.rb +1 -1
- metadata +9 -9
data/lib/odata/transition.rb
CHANGED
@@ -6,7 +6,7 @@ require_relative 'error'
|
|
6
6
|
module Safrano
|
7
7
|
# represents a state transition when navigating/parsing the url path
|
8
8
|
# from left to right
|
9
|
-
class Transition
|
9
|
+
class Transition
|
10
10
|
attr_accessor :trans
|
11
11
|
attr_accessor :match_result
|
12
12
|
attr_accessor :rgx
|
@@ -52,8 +52,28 @@ module Safrano
|
|
52
52
|
ctx.method(@trans).call(@match_result)
|
53
53
|
end
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
|
+
#Transition that does not move/change the input
|
57
|
+
class InplaceTransition < Transition
|
58
|
+
def initialize(trans: )
|
59
|
+
@trans = trans
|
60
|
+
end
|
61
|
+
def do_match(str)
|
62
|
+
@str = str
|
63
|
+
end
|
64
|
+
def path_remain
|
65
|
+
@str
|
66
|
+
end
|
67
|
+
def path_done
|
68
|
+
EMPTYSTR
|
69
|
+
end
|
70
|
+
def do_transition(ctx)
|
71
|
+
ctx.method(@trans).call(@str)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
56
75
|
TransitionEnd = Transition.new('\A(\/?)\z', trans: 'transition_end')
|
76
|
+
TransitionExecuteFunc = InplaceTransition.new(trans: 'transition_execute_func')
|
57
77
|
TransitionMetadata = Transition.new('\A(\/\$metadata)(.*)',
|
58
78
|
trans: 'transition_metadata')
|
59
79
|
TransitionBatch = Transition.new('\A(\/\$batch)(.*)',
|
data/lib/odata/walker.rb
CHANGED
@@ -29,18 +29,24 @@ module Safrano
|
|
29
29
|
|
30
30
|
# are $links requested ?
|
31
31
|
attr_reader :do_links
|
32
|
+
|
33
|
+
attr_reader :request
|
32
34
|
|
33
|
-
NIL_SERVICE_FATAL = 'Walker is called with a nil service'
|
34
|
-
EMPTYSTR = ''
|
35
|
-
SLASH = '/'
|
35
|
+
NIL_SERVICE_FATAL = 'Walker is called with a nil service'
|
36
|
+
EMPTYSTR = ''
|
37
|
+
SLASH = '/'
|
36
38
|
|
37
|
-
def initialize(service, path, content_id_refs = nil)
|
39
|
+
def initialize(service, path, request, content_id_refs = nil )
|
38
40
|
raise NIL_SERVICE_FATAL unless service
|
39
41
|
|
40
42
|
path = URI.decode_www_form_component(path)
|
41
43
|
@context = service
|
42
44
|
@content_id_refs = content_id_refs
|
43
|
-
|
45
|
+
|
46
|
+
# needed because for function import we need access to the url parameters (req.params)
|
47
|
+
# who contains the functions params
|
48
|
+
@request = request
|
49
|
+
|
44
50
|
@contexts = [@context]
|
45
51
|
|
46
52
|
@path_start = @path_remain = if service
|
@@ -109,6 +115,16 @@ module Safrano
|
|
109
115
|
end
|
110
116
|
end
|
111
117
|
|
118
|
+
# execute function import with request parameters
|
119
|
+
# input: @context containt the function to exectute,
|
120
|
+
# @request.params should normally contain the params
|
121
|
+
# result: validate the params for the given function, execute the function and
|
122
|
+
# return it's result back into @context,
|
123
|
+
# and finaly set status :end (or error if anyting went wrong )
|
124
|
+
def do_run_with_execute_func
|
125
|
+
@context, @status, @error = @context.do_execute_func(@request)
|
126
|
+
end
|
127
|
+
|
112
128
|
# little hacks... depending on returned state, set some attributes
|
113
129
|
def state_mappings
|
114
130
|
case @status
|
@@ -137,6 +153,8 @@ module Safrano
|
|
137
153
|
# entity reference here and place it in @context
|
138
154
|
when :run_with_content_id
|
139
155
|
do_run_with_content_id
|
156
|
+
when :run_with_execute_func
|
157
|
+
do_run_with_execute_func
|
140
158
|
end
|
141
159
|
|
142
160
|
@contexts << @context
|
data/lib/safrano/contract.rb
CHANGED
@@ -62,6 +62,8 @@ module Safrano
|
|
62
62
|
# All tap_valid* handlers are executed
|
63
63
|
# tap_error* handlers are not executed
|
64
64
|
class Valid
|
65
|
+
attr_reader :result
|
66
|
+
|
65
67
|
def initialize(result)
|
66
68
|
@result = result
|
67
69
|
end
|
@@ -100,17 +102,13 @@ module Safrano
|
|
100
102
|
def error
|
101
103
|
nil
|
102
104
|
end
|
103
|
-
|
104
|
-
def result
|
105
|
-
@result
|
106
|
-
end
|
107
105
|
end # class Valid
|
108
106
|
|
109
|
-
def
|
107
|
+
def self.valid(result)
|
110
108
|
Contract::Valid.new(result)
|
111
109
|
end
|
112
110
|
|
113
|
-
def
|
111
|
+
def self.and(*contracts)
|
114
112
|
# pick the first error if any
|
115
113
|
if (ff = contracts.find(&:error))
|
116
114
|
return ff
|
@@ -118,18 +116,18 @@ module Safrano
|
|
118
116
|
|
119
117
|
# return a new one with @result = list of the contracts's results
|
120
118
|
# usually this then be reduced again with #collect_result! or # #if_valid_collect methods
|
121
|
-
|
119
|
+
valid(contracts.map(&:result))
|
122
120
|
end
|
123
121
|
|
124
122
|
# shortcut for Contract.and(*contracts).collect_result!
|
125
|
-
def
|
123
|
+
def self.collect_result!(*contracts)
|
126
124
|
# pick the first error if any
|
127
125
|
if (ff = contracts.find(&:error))
|
128
126
|
return ff
|
129
127
|
end
|
130
128
|
|
131
129
|
# return a new one with @result = yield(*list of the contracts's results)
|
132
|
-
|
130
|
+
valid(yield(*contracts.map(&:result)))
|
133
131
|
end
|
134
132
|
|
135
133
|
# generic success return, when return value does not matter
|
data/lib/safrano/core.rb
CHANGED
@@ -6,22 +6,22 @@ module Safrano
|
|
6
6
|
EMPTY_ARRAY = [].freeze
|
7
7
|
EMPTY_HASH = {}.freeze
|
8
8
|
EMPTY_HASH_IN_ARY = [EMPTY_HASH].freeze
|
9
|
-
EMPTY_STRING = ''
|
9
|
+
EMPTY_STRING = ''
|
10
10
|
ARY_204_EMPTY_HASH_ARY = [204, EMPTY_HASH, EMPTY_ARRAY].freeze
|
11
|
-
SPACE = ' '
|
12
|
-
COMMA = ','
|
11
|
+
SPACE = ' '
|
12
|
+
COMMA = ','
|
13
13
|
|
14
14
|
# some prominent constants... probably already defined elsewhere eg in Rack
|
15
15
|
# but lets KISS
|
16
|
-
CONTENT_TYPE = 'Content-Type'
|
17
|
-
CTT_TYPE_LC = 'content-type'
|
18
|
-
TEXTPLAIN_UTF8 = 'text/plain;charset=utf-8'
|
19
|
-
APPJSON = 'application/json'
|
20
|
-
APPXML = 'application/xml'
|
21
|
-
MP_MIXED = 'multipart/mixed'
|
22
|
-
APPXML_UTF8 = 'application/xml;charset=utf-8'
|
23
|
-
APPATOMXML_UTF8 = 'application/atomsvc+xml;charset=utf-8'
|
24
|
-
APPJSON_UTF8 = 'application/json;charset=utf-8'
|
16
|
+
CONTENT_TYPE = 'Content-Type'
|
17
|
+
CTT_TYPE_LC = 'content-type'
|
18
|
+
TEXTPLAIN_UTF8 = 'text/plain;charset=utf-8'
|
19
|
+
APPJSON = 'application/json'
|
20
|
+
APPXML = 'application/xml'
|
21
|
+
MP_MIXED = 'multipart/mixed'
|
22
|
+
APPXML_UTF8 = 'application/xml;charset=utf-8'
|
23
|
+
APPATOMXML_UTF8 = 'application/atomsvc+xml;charset=utf-8'
|
24
|
+
APPJSON_UTF8 = 'application/json;charset=utf-8'
|
25
25
|
|
26
26
|
CT_JSON = { CONTENT_TYPE => APPJSON_UTF8 }.freeze
|
27
27
|
CT_TEXT = { CONTENT_TYPE => TEXTPLAIN_UTF8 }.freeze
|
data/lib/safrano/deprecation.rb
CHANGED
@@ -22,7 +22,7 @@ module Safrano
|
|
22
22
|
module Deprecation
|
23
23
|
@backtrace_filter = false
|
24
24
|
@output = $stderr
|
25
|
-
@prefix =
|
25
|
+
@prefix = 'SAFRANO DEPRECATION WARNING: '
|
26
26
|
|
27
27
|
class << self
|
28
28
|
# How to filter backtraces. +false+ does not include backtraces, +true+ includes
|
@@ -64,10 +64,10 @@ module Safrano
|
|
64
64
|
# otherwise do nothing as the ruby implementation does not support constant deprecation.
|
65
65
|
def self.deprecate_constant(mod, constant)
|
66
66
|
# :nocov:
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
return unless RUBY_VERSION > '2.3'
|
68
|
+
|
69
|
+
# :nocov:
|
70
|
+
mod.deprecate_constant(constant)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
data/lib/safrano/multipart.rb
CHANGED
@@ -4,7 +4,7 @@ CRLF = "\r\n"
|
|
4
4
|
LF = "\n"
|
5
5
|
|
6
6
|
require 'securerandom'
|
7
|
-
require '
|
7
|
+
require 'rack/utils'
|
8
8
|
|
9
9
|
# Simple multipart support for OData $batch purpose
|
10
10
|
module MIME
|
@@ -110,11 +110,11 @@ module MIME
|
|
110
110
|
@target.ct = @target_ct
|
111
111
|
@state = :bmp
|
112
112
|
end
|
113
|
-
MPS = 'multipart/'
|
113
|
+
MPS = 'multipart/'
|
114
114
|
MP_RGX1 = %r{^(digest|mixed);\s*boundary="(.*)"}.freeze
|
115
115
|
MP_RGX2 = %r{^(digest|mixed);\s*boundary=(.*)}.freeze
|
116
116
|
# APP_HTTP_RGX = %r{^application/http}.freeze
|
117
|
-
APP_HTTP = 'application/http'
|
117
|
+
APP_HTTP = 'application/http'
|
118
118
|
def new_content
|
119
119
|
@target =
|
120
120
|
if @target_ct.start_with?(MPS) &&
|
@@ -457,7 +457,7 @@ module MIME
|
|
457
457
|
"Content-Transfer-Encoding: binary#{CRLF}",
|
458
458
|
'HTTP/1.1 '].join(CRLF).freeze
|
459
459
|
|
460
|
-
StatusMessage = ::
|
460
|
+
StatusMessage = ::Rack::Utils::HTTP_STATUS_CODES.freeze
|
461
461
|
|
462
462
|
def initialize
|
463
463
|
@hd = {}
|
data/lib/safrano/rack_app.rb
CHANGED
@@ -56,7 +56,7 @@ module Safrano
|
|
56
56
|
NOCACHE_HDRS = { 'Cache-Control' => 'no-cache',
|
57
57
|
'Expires' => '-1',
|
58
58
|
'Pragma' => 'no-cache' }.freeze
|
59
|
-
DATASERVICEVERSION = 'DataServiceVersion'
|
59
|
+
DATASERVICEVERSION = 'DataServiceVersion'
|
60
60
|
include MethodHandlers
|
61
61
|
|
62
62
|
def before
|
data/lib/safrano/request.rb
CHANGED
@@ -9,7 +9,7 @@ module Safrano
|
|
9
9
|
# is not passed
|
10
10
|
class Request < Rack::Request
|
11
11
|
HEADER_PARAM = /\s*[\w.]+=(?:[\w.]+|"(?:[^"\\]|\\.)*")?\s*/.freeze
|
12
|
-
HEADER_VAL_RAW = '(?:\w+|\*)\/(?:\w+(?:\.|\-|\+)?|\*)*'
|
12
|
+
HEADER_VAL_RAW = '(?:\w+|\*)\/(?:\w+(?:\.|\-|\+)?|\*)*'
|
13
13
|
HEADER_VAL_WITH_PAR = /(?:#{HEADER_VAL_RAW})\s*(?:;#{HEADER_PARAM})*/.freeze
|
14
14
|
ON_CGST_ERROR = (proc { |r| raise(Sequel::Rollback) if r.in_changeset })
|
15
15
|
|
@@ -99,6 +99,7 @@ module Safrano
|
|
99
99
|
def create_odata_walker
|
100
100
|
@env['safrano.walker'] = @walker = Walker.new(@service,
|
101
101
|
path_info,
|
102
|
+
self,
|
102
103
|
@content_id_references)
|
103
104
|
end
|
104
105
|
|
@@ -194,7 +195,7 @@ module Safrano
|
|
194
195
|
if (rqv = env['HTTP_DATASERVICEVERSION'])
|
195
196
|
if (m = DATASERVICEVERSION_RGX.match(rqv))
|
196
197
|
# client request an too new version --> 501
|
197
|
-
if ((v = m[1]) > Safrano::MAX_DATASERVICE_VERSION)
|
198
|
+
if ((v = m[1]) > Safrano::MAX_DATASERVICE_VERSION) ||
|
198
199
|
(v < Safrano::MIN_DATASERVICE_VERSION)
|
199
200
|
Safrano::VersionNotImplementedError
|
200
201
|
else
|
data/lib/safrano/service.rb
CHANGED
@@ -15,8 +15,8 @@ module Safrano
|
|
15
15
|
# and will be included in Service class
|
16
16
|
module ExpandHandler
|
17
17
|
PATH_SPLITTER = %r{\A(\w+)/?(.*)\z}.freeze
|
18
|
-
DEFERRED = '__deferred'
|
19
|
-
URI = 'uri'
|
18
|
+
DEFERRED = '__deferred'
|
19
|
+
URI = 'uri'
|
20
20
|
|
21
21
|
def get_deferred_odata_h(entity_uri:, attrib:)
|
22
22
|
{ DEFERRED => { URI => "#{entity_uri}/#{attrib}" } }
|
@@ -24,8 +24,8 @@ module Safrano
|
|
24
24
|
|
25
25
|
# default v2
|
26
26
|
# overriden in ServiceV1
|
27
|
-
RESULTS_K = 'results'
|
28
|
-
COUNT_K = '__count'
|
27
|
+
RESULTS_K = 'results'
|
28
|
+
COUNT_K = '__count'
|
29
29
|
def get_coll_odata_h(array:, template:, icount: nil)
|
30
30
|
array.map! do |w|
|
31
31
|
get_entity_odata_h(entity: w, template: template)
|
@@ -40,7 +40,7 @@ module Safrano
|
|
40
40
|
end
|
41
41
|
|
42
42
|
EMPTYH = {}.freeze
|
43
|
-
METADATA_K = '__metadata'
|
43
|
+
METADATA_K = '__metadata'
|
44
44
|
def get_entity_odata_h(entity:, template:)
|
45
45
|
# start with metadata
|
46
46
|
hres = { METADATA_K => entity.metadata_h }
|
@@ -90,21 +90,20 @@ module Safrano
|
|
90
90
|
# xml namespace constants needed for the output of XML service and
|
91
91
|
# and metadata
|
92
92
|
module XMLNS
|
93
|
-
MSFT_ADO = 'http://schemas.microsoft.com/ado'
|
94
|
-
MSFT_ADO_2009_EDM = "#{MSFT_ADO}/2009/11/edm"
|
95
|
-
MSFT_ADO_2007_EDMX = "#{MSFT_ADO}/2007/06/edmx"
|
96
|
-
MSFT_ADO_2007_META = MSFT_ADO
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
W3_2007_APP = 'http://www.w3.org/2007/app'.freeze
|
93
|
+
MSFT_ADO = 'http://schemas.microsoft.com/ado'
|
94
|
+
MSFT_ADO_2009_EDM = "#{MSFT_ADO}/2009/11/edm"
|
95
|
+
MSFT_ADO_2007_EDMX = "#{MSFT_ADO}/2007/06/edmx"
|
96
|
+
MSFT_ADO_2007_META = "#{MSFT_ADO}/2007/08/dataservices/metadata"
|
97
|
+
|
98
|
+
W3_2005_ATOM = 'http://www.w3.org/2005/Atom'
|
99
|
+
W3_2007_APP = 'http://www.w3.org/2007/app'
|
101
100
|
end
|
102
101
|
end
|
103
102
|
|
104
103
|
# Link to Model
|
105
104
|
module Safrano
|
106
|
-
MAX_DATASERVICE_VERSION = '2'
|
107
|
-
MIN_DATASERVICE_VERSION = '1'
|
105
|
+
MAX_DATASERVICE_VERSION = '2'
|
106
|
+
MIN_DATASERVICE_VERSION = '1'
|
108
107
|
CV_MAX_DATASERVICE_VERSION = Contract.valid(MAX_DATASERVICE_VERSION).freeze
|
109
108
|
CV_MIN_DATASERVICE_VERSION = Contract.valid(MIN_DATASERVICE_VERSION).freeze
|
110
109
|
include XMLNS
|
@@ -113,7 +112,7 @@ module Safrano
|
|
113
112
|
include Safrano
|
114
113
|
include ExpandHandler
|
115
114
|
|
116
|
-
XML_PREAMBLE = %
|
115
|
+
XML_PREAMBLE = %(<?xml version="1.0" encoding="utf-8" standalone="yes"?>\r\n)
|
117
116
|
|
118
117
|
# This is just a hash of entity Set Names to the corresponding Class
|
119
118
|
# Example
|
@@ -138,6 +137,7 @@ module Safrano
|
|
138
137
|
attr_accessor :relman
|
139
138
|
attr_accessor :complex_types
|
140
139
|
attr_accessor :function_imports
|
140
|
+
attr_accessor :function_import_keys
|
141
141
|
|
142
142
|
# Instance attributes for specialized Version specific Instances
|
143
143
|
attr_accessor :v1
|
@@ -156,13 +156,14 @@ module Safrano
|
|
156
156
|
@relman = Safrano::RelationManager.new
|
157
157
|
@complex_types = Set.new
|
158
158
|
@function_imports = {}
|
159
|
+
@function_import_keys = []
|
159
160
|
@cmap = {}
|
160
161
|
instance_eval(&block) if block_given?
|
161
162
|
end
|
162
163
|
|
163
164
|
TRAILING_SLASH = %r{/\z}.freeze
|
164
|
-
DEFAULT_PATH_PREFIX = '/'
|
165
|
-
DEFAULT_SERVER_URL = 'http://localhost:9494'
|
165
|
+
DEFAULT_PATH_PREFIX = '/'
|
166
|
+
DEFAULT_SERVER_URL = 'http://localhost:9494'
|
166
167
|
|
167
168
|
def enable_batch
|
168
169
|
@batch_handler = Safrano::Batch::EnabledHandler.new
|
@@ -205,6 +206,12 @@ module Safrano
|
|
205
206
|
(@v2.xserver_url = @xserver_url) if @v2
|
206
207
|
end
|
207
208
|
|
209
|
+
# keep the bug active for now, but allow to activate the fix,
|
210
|
+
# later we will change the default to be fixed
|
211
|
+
def bugfix_create_response(bool = false)
|
212
|
+
@bugfix_create_response = bool
|
213
|
+
end
|
214
|
+
|
208
215
|
# end public API
|
209
216
|
|
210
217
|
def set_uribase
|
@@ -234,6 +241,7 @@ module Safrano
|
|
234
241
|
other.batch_handler = @batch_handler
|
235
242
|
other.complex_types = @complex_types
|
236
243
|
other.function_imports = @function_imports
|
244
|
+
other.function_import_keys = @function_import_keys
|
237
245
|
other
|
238
246
|
end
|
239
247
|
|
@@ -317,6 +325,8 @@ module Safrano
|
|
317
325
|
def function_import(name)
|
318
326
|
funcimp = Safrano::FunctionImport(name)
|
319
327
|
@function_imports[name] = funcimp
|
328
|
+
@function_import_keys << name
|
329
|
+
set_funcimports_sorted
|
320
330
|
funcimp
|
321
331
|
end
|
322
332
|
|
@@ -333,7 +343,11 @@ module Safrano
|
|
333
343
|
@collections.sort_by! { |klass| klass.entity_set_name.size }.reverse! if @collections
|
334
344
|
@collections
|
335
345
|
end
|
336
|
-
|
346
|
+
|
347
|
+
# need to be sorted by size too
|
348
|
+
def set_funcimports_sorted
|
349
|
+
@function_import_keys.sort_by!{|k| k.size}.reverse!
|
350
|
+
end
|
337
351
|
# to be called at end of publishing block to ensure we get the right names
|
338
352
|
# and additionally build the list of valid attribute path's used
|
339
353
|
# for validation of $orderby or $filter params
|
@@ -362,6 +376,9 @@ module Safrano
|
|
362
376
|
@collections.each do |klass|
|
363
377
|
klass.build_uri(@uribase)
|
364
378
|
klass.include(klass.time_cols.empty? ? Safrano::NoMappingBeforeOutput : Safrano::MappingBeforeOutput)
|
379
|
+
|
380
|
+
# Output create (POST) as single entity (Standard) or as array (non-standard buggy)
|
381
|
+
klass.include ( @bugfix_create_response ? Safrano::EntityCreateStandardOutput : Safrano::EntityCreateArrayOutput)
|
365
382
|
end
|
366
383
|
|
367
384
|
# build allowed transitions (requires that @collections are filled and sorted for having a
|
@@ -393,7 +410,7 @@ module Safrano
|
|
393
410
|
end
|
394
411
|
|
395
412
|
def base_url_func_regexp
|
396
|
-
@
|
413
|
+
@function_import_keys.join('|')
|
397
414
|
end
|
398
415
|
|
399
416
|
def service
|
@@ -530,7 +547,7 @@ module Safrano
|
|
530
547
|
|
531
548
|
# methods related to transitions to next state (cf. walker)
|
532
549
|
module Transitions
|
533
|
-
DOLLAR_ID_REGEXP = Regexp.new('\A\/\$')
|
550
|
+
DOLLAR_ID_REGEXP = Regexp.new('\A\/\$')
|
534
551
|
ALLOWED_TRANSITIONS_FIXED = [
|
535
552
|
Safrano::TransitionEnd,
|
536
553
|
Safrano::TransitionMetadata,
|
data/lib/safrano/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: safrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- oz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: rfc2047
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
61
|
+
version: '0.3'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
68
|
+
version: '0.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,7 +108,7 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0.51'
|
111
|
-
description: Safrano is an OData server library based on Ruby
|
111
|
+
description: Safrano is an OData server library based on Ruby Sequel and Rack.
|
112
112
|
email: dev@aithscel.eu
|
113
113
|
executables: []
|
114
114
|
extensions: []
|
@@ -189,8 +189,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
189
|
- !ruby/object:Gem::Version
|
190
190
|
version: '0'
|
191
191
|
requirements: []
|
192
|
-
rubygems_version: 3.
|
192
|
+
rubygems_version: 3.2.5
|
193
193
|
signing_key:
|
194
194
|
specification_version: 4
|
195
|
-
summary: Safrano is
|
195
|
+
summary: Safrano is an OData server library based on Ruby Sequel and Rack
|
196
196
|
test_files: []
|