safrano 0.5.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/core_ext/Date/format.rb +47 -0
- data/lib/core_ext/DateTime/format.rb +54 -0
- data/lib/core_ext/Dir/iter.rb +7 -5
- data/lib/core_ext/Hash/transform.rb +14 -6
- data/lib/core_ext/Numeric/convert.rb +25 -0
- data/lib/core_ext/Time/format.rb +71 -0
- data/lib/core_ext/date.rb +5 -0
- data/lib/core_ext/datetime.rb +5 -0
- data/lib/core_ext/numeric.rb +3 -0
- data/lib/core_ext/time.rb +5 -0
- data/lib/odata/attribute.rb +8 -6
- data/lib/odata/batch.rb +3 -3
- data/lib/odata/collection.rb +9 -9
- data/lib/odata/collection_filter.rb +3 -1
- data/lib/odata/collection_media.rb +4 -27
- data/lib/odata/collection_order.rb +1 -1
- data/lib/odata/common_logger.rb +5 -27
- data/lib/odata/complex_type.rb +61 -67
- data/lib/odata/edm/primitive_types.rb +110 -42
- data/lib/odata/entity.rb +14 -47
- data/lib/odata/error.rb +7 -7
- data/lib/odata/expand.rb +2 -2
- data/lib/odata/filter/base.rb +10 -1
- data/lib/odata/filter/error.rb +2 -2
- data/lib/odata/filter/parse.rb +16 -2
- data/lib/odata/filter/sequel.rb +31 -4
- data/lib/odata/filter/sequel_datetime_adapter.rb +21 -0
- data/lib/odata/filter/token.rb +18 -5
- data/lib/odata/filter/tree.rb +83 -9
- data/lib/odata/function_import.rb +19 -18
- data/lib/odata/model_ext.rb +96 -38
- data/lib/odata/request/json.rb +171 -0
- data/lib/odata/transition.rb +13 -9
- data/lib/odata/url_parameters.rb +3 -3
- data/lib/odata/walker.rb +9 -9
- data/lib/safrano/multipart.rb +1 -3
- data/lib/safrano/rack_app.rb +2 -14
- data/lib/safrano/rack_builder.rb +0 -15
- data/lib/safrano/request.rb +3 -3
- data/lib/safrano/response.rb +3 -3
- data/lib/safrano/service.rb +43 -12
- data/lib/safrano/type_mapping.rb +149 -0
- data/lib/safrano/version.rb +1 -2
- data/lib/safrano.rb +3 -0
- metadata +54 -15
data/lib/safrano/service.rb
CHANGED
@@ -5,6 +5,7 @@ require 'odata/relations'
|
|
5
5
|
require 'odata/batch'
|
6
6
|
require 'odata/complex_type'
|
7
7
|
require 'odata/function_import'
|
8
|
+
require 'safrano/type_mapping'
|
8
9
|
require 'odata/error'
|
9
10
|
require 'odata/filter/sequel'
|
10
11
|
require 'set'
|
@@ -138,6 +139,7 @@ module Safrano
|
|
138
139
|
attr_accessor :complex_types
|
139
140
|
attr_accessor :function_imports
|
140
141
|
attr_accessor :function_import_keys
|
142
|
+
attr_accessor :type_mappings
|
141
143
|
|
142
144
|
# Instance attributes for specialized Version specific Instances
|
143
145
|
attr_accessor :v1
|
@@ -158,6 +160,9 @@ module Safrano
|
|
158
160
|
@function_imports = {}
|
159
161
|
@function_import_keys = []
|
160
162
|
@cmap = {}
|
163
|
+
@type_mappings = {}
|
164
|
+
# enabled per default starting from 0.6
|
165
|
+
@bugfix_create_response = true
|
161
166
|
instance_eval(&block) if block_given?
|
162
167
|
end
|
163
168
|
|
@@ -206,9 +211,8 @@ module Safrano
|
|
206
211
|
(@v2.xserver_url = @xserver_url) if @v2
|
207
212
|
end
|
208
213
|
|
209
|
-
# keep the bug active for now, but allow to activate the fix
|
210
|
-
|
211
|
-
def bugfix_create_response(bool = false)
|
214
|
+
# keep the bug active for now, but allow to de-activate the fix
|
215
|
+
def bugfix_create_response(bool)
|
212
216
|
@bugfix_create_response = bool
|
213
217
|
end
|
214
218
|
|
@@ -242,6 +246,8 @@ module Safrano
|
|
242
246
|
other.complex_types = @complex_types
|
243
247
|
other.function_imports = @function_imports
|
244
248
|
other.function_import_keys = @function_import_keys
|
249
|
+
other.type_mappings = @type_mappings
|
250
|
+
other.bugfix_create_response(@bugfix_create_response)
|
245
251
|
other
|
246
252
|
end
|
247
253
|
|
@@ -330,6 +336,11 @@ module Safrano
|
|
330
336
|
funcimp
|
331
337
|
end
|
332
338
|
|
339
|
+
def with_db_type(*dbtypnams, &proc)
|
340
|
+
m = TypeMapping.builder(*dbtypnams, &proc)
|
341
|
+
@type_mappings[m.db_types_rgx] = m
|
342
|
+
end
|
343
|
+
|
333
344
|
def cmap=(imap)
|
334
345
|
@cmap = imap
|
335
346
|
set_collections_sorted(@cmap.values)
|
@@ -343,10 +354,10 @@ module Safrano
|
|
343
354
|
@collections.sort_by! { |klass| klass.entity_set_name.size }.reverse! if @collections
|
344
355
|
@collections
|
345
356
|
end
|
346
|
-
|
357
|
+
|
347
358
|
# need to be sorted by size too
|
348
359
|
def set_funcimports_sorted
|
349
|
-
@function_import_keys.sort_by!{|k| k.size}.reverse!
|
360
|
+
@function_import_keys.sort_by! { |k| k.size }.reverse!
|
350
361
|
end
|
351
362
|
# to be called at end of publishing block to ensure we get the right names
|
352
363
|
# and additionally build the list of valid attribute path's used
|
@@ -370,16 +381,30 @@ module Safrano
|
|
370
381
|
|
371
382
|
set_uribase
|
372
383
|
|
373
|
-
@collections.each(&:finalize_publishing)
|
374
|
-
|
375
384
|
# finalize the uri's and include NoMappingBeforeOutput or MappingBeforeOutput as needed
|
376
385
|
@collections.each do |klass|
|
386
|
+
klass.finalize_publishing(self)
|
387
|
+
|
377
388
|
klass.build_uri(@uribase)
|
378
|
-
# TODO perf
|
379
|
-
klass.include( (klass.time_cols.empty? && klass.decimal_cols.empty?) ? Safrano::NoMappingBeforeOutput : Safrano::MappingBeforeOutput)
|
380
389
|
|
381
390
|
# Output create (POST) as single entity (Standard) or as array (non-standard buggy)
|
382
|
-
klass.include
|
391
|
+
klass.include(@bugfix_create_response ? Safrano::EntityCreateStandardOutput : Safrano::EntityCreateArrayOutput)
|
392
|
+
|
393
|
+
# define the most optimal casted_values method for the given model(klass)
|
394
|
+
if klass.casted_cols.empty?
|
395
|
+
klass.send(:define_method, :casted_values) do |cols = nil|
|
396
|
+
cols ? selected_values_for_odata(cols) : values_for_odata
|
397
|
+
end
|
398
|
+
else
|
399
|
+
klass.send(:define_method, :casted_values) do |cols = nil|
|
400
|
+
# we need to dup the model values as we need to change it before passing to_json,
|
401
|
+
# but we dont want to interfere with Sequel's owned data
|
402
|
+
# (eg because then in worst case it could happen that we write back changed values to DB)
|
403
|
+
vals = cols ? selected_values_for_odata(cols) : values_for_odata.dup
|
404
|
+
self.class.casted_cols.each { |cc, lambda| vals[cc] = lambda.call(vals[cc]) if vals.key?(cc) }
|
405
|
+
vals
|
406
|
+
end
|
407
|
+
end
|
383
408
|
end
|
384
409
|
|
385
410
|
# build allowed transitions (requires that @collections are filled and sorted for having a
|
@@ -390,10 +415,16 @@ module Safrano
|
|
390
415
|
case Sequel::Model.db.adapter_scheme
|
391
416
|
when :postgres
|
392
417
|
Safrano::Filter::FuncTree.include Safrano::Filter::FuncTreePostgres
|
418
|
+
Safrano::Filter::DateTimeLit.include Safrano::Filter::DateTimeDefault
|
419
|
+
Safrano::Filter::DateTimeOffsetLit.include Safrano::Filter::DateTimeDefault
|
393
420
|
when :sqlite
|
394
421
|
Safrano::Filter::FuncTree.include Safrano::Filter::FuncTreeSqlite
|
422
|
+
Safrano::Filter::DateTimeLit.include Safrano::Filter::DateTimeSqlite
|
423
|
+
Safrano::Filter::DateTimeOffsetLit.include Safrano::Filter::DateTimeSqlite
|
395
424
|
else
|
396
425
|
Safrano::Filter::FuncTree.include Safrano::Filter::FuncTreeDefault
|
426
|
+
Safrano::Filter::DateTimeLit.include Safrano::Filter::DateTimeDefault
|
427
|
+
Safrano::Filter::DateTimeOffsetLit.include Safrano::Filter::DateTimeDefault
|
397
428
|
end
|
398
429
|
end
|
399
430
|
|
@@ -505,8 +536,8 @@ module Safrano
|
|
505
536
|
doc.add_element('edmx:Edmx', 'Version' => '1.0')
|
506
537
|
doc.root.add_namespace('xmlns:edmx', XMLNS::MSFT_ADO_2007_EDMX)
|
507
538
|
serv = doc.root.add_element('edmx:DataServices',
|
508
|
-
|
509
|
-
|
539
|
+
# TODO: export the real version (result from version negotions)
|
540
|
+
# but currently we support only v1 and v2, and most users will use v2
|
510
541
|
'm:DataServiceVersion' => '2.0')
|
511
542
|
# 'm:DataServiceVersion' => "#{self.dataServiceVersion}" )
|
512
543
|
# DataServiceVersion: This attribute MUST be in the data service
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Note: Safrano has hardcoded mapping rules for most of types.
|
4
|
+
# But
|
5
|
+
# it might not be 100% complete
|
6
|
+
# it might not always do what is expected
|
7
|
+
# The type mapping functionality here allows Safrano users to design type mapping themselves
|
8
|
+
# and fill or fix the two above issues
|
9
|
+
module Safrano
|
10
|
+
# Base class
|
11
|
+
class TypeMapping
|
12
|
+
attr_reader :castfunc
|
13
|
+
attr_reader :db_types_rgx
|
14
|
+
attr_reader :edm_type
|
15
|
+
|
16
|
+
# wrapper to handle API
|
17
|
+
class Builder
|
18
|
+
attr_reader :xedm_type
|
19
|
+
attr_reader :castfunc
|
20
|
+
attr_reader :db_types_rgx
|
21
|
+
attr_reader :bui1
|
22
|
+
attr_reader :bui2
|
23
|
+
|
24
|
+
def initialize(*dbtyps)
|
25
|
+
@db_types_rgx = dbtyps.join('|')
|
26
|
+
@rgx = /\A\s*(?:#{@db_types_rgx})\s*\z/i
|
27
|
+
end
|
28
|
+
|
29
|
+
def edm_type(input)
|
30
|
+
@xedm_type = input
|
31
|
+
end
|
32
|
+
|
33
|
+
def with_one_param(lambda = nil, &proc)
|
34
|
+
proc1 = block_given? ? proc : lambda
|
35
|
+
@bui1 = Builder1Par.new(@db_types_rgx, proc1)
|
36
|
+
end
|
37
|
+
|
38
|
+
def with_two_params(lambda = nil, &proc)
|
39
|
+
proc2 = block_given? ? proc : lambda
|
40
|
+
@bui2 = Builder2Par.new(@db_types_rgx, proc2)
|
41
|
+
end
|
42
|
+
|
43
|
+
def json_value(lambda = nil, &proc)
|
44
|
+
@castfunc = block_given? ? proc : lambda
|
45
|
+
end
|
46
|
+
|
47
|
+
def match(curtyp)
|
48
|
+
if @bui2 && (m = @bui2.match(curtyp))
|
49
|
+
m
|
50
|
+
elsif @bui1 && (m = @bui1.match(curtyp))
|
51
|
+
m
|
52
|
+
elsif @rgx.match(curtyp)
|
53
|
+
type_mapping
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def type_mapping
|
58
|
+
# TODO: perf; return always same object when called multiple times
|
59
|
+
FixedTypeMapping.new(self)
|
60
|
+
end
|
61
|
+
end # Builder
|
62
|
+
|
63
|
+
def self.builder(*dbtypnams, &proc)
|
64
|
+
builder = Builder.new(*dbtypnams)
|
65
|
+
builder.instance_eval(&proc)
|
66
|
+
builder
|
67
|
+
end
|
68
|
+
|
69
|
+
class Builder1Par < Builder
|
70
|
+
def initialize(db_ty_rgx, proc)
|
71
|
+
@db_types_rgx = db_ty_rgx
|
72
|
+
@proc = proc
|
73
|
+
@rgx = /\A\s*(?:#{@db_types_rgx})\s*\(\s*(\d+)\s*\)\z/i
|
74
|
+
end
|
75
|
+
|
76
|
+
def match(curtyp)
|
77
|
+
(@md = @rgx.match(curtyp)) ? type_mapping : nil
|
78
|
+
end
|
79
|
+
|
80
|
+
def json_value(lambda = nil, &proc)
|
81
|
+
@castfunc = block_given? ? proc : lambda
|
82
|
+
end
|
83
|
+
|
84
|
+
# this is a bit advanced/obscure programming
|
85
|
+
# the intance_exec here is required to produce correct results
|
86
|
+
# ie. it produces concrete instances of edm_type and json_val lambda
|
87
|
+
# for the later, it is kind of currying but with the *implicit* parameters
|
88
|
+
# from the calling context eg par1
|
89
|
+
|
90
|
+
# probably this is not best-practice programing as we
|
91
|
+
# have a mutating object (the builder) that
|
92
|
+
# produces different lambdas after each type_mapping(mutation) calls
|
93
|
+
def type_mapping
|
94
|
+
p1val = @md[1]
|
95
|
+
instance_exec p1val, &@proc
|
96
|
+
|
97
|
+
TypeMapping1Par.new(self)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
class Builder2Par < Builder
|
101
|
+
def initialize(db_ty_rgx, proc)
|
102
|
+
@db_types_rgx = db_ty_rgx
|
103
|
+
@proc = proc
|
104
|
+
@rgx = /\A\s*(?:#{@db_types_rgx})\s*\(\s*(\d+)\s*,\s*(\d+)\s*\)\s*\z/i
|
105
|
+
end
|
106
|
+
|
107
|
+
def match(curtyp)
|
108
|
+
(@md = @rgx.match(curtyp)) ? type_mapping : nil
|
109
|
+
end
|
110
|
+
|
111
|
+
# this is a bit advanced/obscure programming
|
112
|
+
# the intance_exec here is required to produce correct results
|
113
|
+
# ie. it produces concrete instances of edm_type and json_val lambda
|
114
|
+
# for the later, it is kind of currying but with the *implicit* parameters
|
115
|
+
# from the calling context eg par1 and par2
|
116
|
+
|
117
|
+
# probably this is not best-practice programing as we
|
118
|
+
# have a mutating object (the builder) that
|
119
|
+
# produces different lambdas after each type_mapping(mutation) calls
|
120
|
+
def type_mapping
|
121
|
+
p1val = @md[1]
|
122
|
+
p2val = @md[2]
|
123
|
+
instance_exec p1val, p2val, &@proc
|
124
|
+
TypeMapping2Par.new(self)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Fixed type (ie. without variable parts)
|
130
|
+
class FixedTypeMapping < TypeMapping
|
131
|
+
def initialize(builder)
|
132
|
+
@edm_type = builder.xedm_type
|
133
|
+
@castfunc = builder.castfunc
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class TypeMapping1Par < TypeMapping
|
138
|
+
def initialize(builder)
|
139
|
+
@edm_type = builder.xedm_type
|
140
|
+
@castfunc = builder.castfunc
|
141
|
+
end
|
142
|
+
end
|
143
|
+
class TypeMapping2Par < TypeMapping
|
144
|
+
def initialize(builder)
|
145
|
+
@edm_type = builder.xedm_type
|
146
|
+
@castfunc = builder.castfunc
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
data/lib/safrano/version.rb
CHANGED
data/lib/safrano.rb
CHANGED
@@ -14,9 +14,12 @@ require_relative 'odata/entity'
|
|
14
14
|
require_relative 'odata/attribute'
|
15
15
|
require_relative 'odata/navigation_attribute'
|
16
16
|
require_relative 'odata/model_ext'
|
17
|
+
require_relative 'odata/request/json'
|
17
18
|
require_relative 'safrano/service'
|
18
19
|
require_relative 'odata/walker'
|
19
20
|
require 'sequel'
|
20
21
|
require_relative 'safrano/sequel_join_by_paths'
|
21
22
|
require_relative 'safrano/rack_app'
|
22
23
|
require_relative 'safrano/rack_builder'
|
24
|
+
|
25
|
+
Sequel.extension :named_timezones
|
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.6.0
|
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: 2022-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rfc2047
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.3'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.3'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: sequel
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,33 +67,33 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '5.15'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: tzinfo
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - "
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
75
|
+
version: '0'
|
62
76
|
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - "
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: tzinfo-data
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
76
|
-
type: :
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rack-test
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +108,20 @@ dependencies:
|
|
94
108
|
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '12.3'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '12.3'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: rubocop
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,23 +136,31 @@ dependencies:
|
|
108
136
|
- - "~>"
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0.51'
|
111
|
-
description: Safrano is an OData server library
|
139
|
+
description: 'Safrano is an OData server library '
|
112
140
|
email: dev@aithscel.eu
|
113
141
|
executables: []
|
114
142
|
extensions: []
|
115
143
|
extra_rdoc_files: []
|
116
144
|
files:
|
145
|
+
- lib/core_ext/Date/format.rb
|
146
|
+
- lib/core_ext/DateTime/format.rb
|
117
147
|
- lib/core_ext/Dir/iter.rb
|
118
148
|
- lib/core_ext/Hash/transform.rb
|
119
149
|
- lib/core_ext/Integer/edm.rb
|
150
|
+
- lib/core_ext/Numeric/convert.rb
|
120
151
|
- lib/core_ext/REXML/Document/output.rb
|
121
152
|
- lib/core_ext/String/convert.rb
|
122
153
|
- lib/core_ext/String/edm.rb
|
154
|
+
- lib/core_ext/Time/format.rb
|
155
|
+
- lib/core_ext/date.rb
|
156
|
+
- lib/core_ext/datetime.rb
|
123
157
|
- lib/core_ext/dir.rb
|
124
158
|
- lib/core_ext/hash.rb
|
125
159
|
- lib/core_ext/integer.rb
|
160
|
+
- lib/core_ext/numeric.rb
|
126
161
|
- lib/core_ext/rexml.rb
|
127
162
|
- lib/core_ext/string.rb
|
163
|
+
- lib/core_ext/time.rb
|
128
164
|
- lib/odata/attribute.rb
|
129
165
|
- lib/odata/batch.rb
|
130
166
|
- lib/odata/collection.rb
|
@@ -141,6 +177,7 @@ files:
|
|
141
177
|
- lib/odata/filter/error.rb
|
142
178
|
- lib/odata/filter/parse.rb
|
143
179
|
- lib/odata/filter/sequel.rb
|
180
|
+
- lib/odata/filter/sequel_datetime_adapter.rb
|
144
181
|
- lib/odata/filter/sequel_function_adapter.rb
|
145
182
|
- lib/odata/filter/token.rb
|
146
183
|
- lib/odata/filter/tree.rb
|
@@ -148,6 +185,7 @@ files:
|
|
148
185
|
- lib/odata/model_ext.rb
|
149
186
|
- lib/odata/navigation_attribute.rb
|
150
187
|
- lib/odata/relations.rb
|
188
|
+
- lib/odata/request/json.rb
|
151
189
|
- lib/odata/select.rb
|
152
190
|
- lib/odata/transition.rb
|
153
191
|
- lib/odata/url_parameters.rb
|
@@ -164,6 +202,7 @@ files:
|
|
164
202
|
- lib/safrano/response.rb
|
165
203
|
- lib/safrano/sequel_join_by_paths.rb
|
166
204
|
- lib/safrano/service.rb
|
205
|
+
- lib/safrano/type_mapping.rb
|
167
206
|
- lib/safrano/version.rb
|
168
207
|
- lib/sequel/plugins/join_by_paths.rb
|
169
208
|
homepage: https://gitlab.com/dm0da/safrano
|
@@ -192,5 +231,5 @@ requirements: []
|
|
192
231
|
rubygems_version: 3.2.5
|
193
232
|
signing_key:
|
194
233
|
specification_version: 4
|
195
|
-
summary: Safrano is an OData server library
|
234
|
+
summary: Safrano is an OData server library
|
196
235
|
test_files: []
|