safrano 0.4.0 → 0.4.1
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/collection_media.rb +36 -7
- data/lib/odata/entity.rb +25 -19
- data/lib/odata/error.rb +0 -2
- data/lib/odata/walker.rb +0 -2
- data/lib/safrano/service.rb +0 -2
- data/lib/safrano/version.rb +1 -1
- metadata +5 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc504918971031d5c89c44a26e970a65da7e2cbd3da865e65138e95f90a2460d
|
4
|
+
data.tar.gz: dd418e35d807619d101b385434ab4f886e7a0b9d10267471a09418e50d14db49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af6cdb6492826c77f0d43846492e53bb5fdaf023de23f0a73496fec5076818291300d248f7d82874886cef99ac864b5632e928061ff8dfe3bf2dafb29cd0593e
|
7
|
+
data.tar.gz: 86893ddd4605f7d7eaa063c2cf869923db1c17acb42d69e880ab9fc92523743abaab205b18147452b5f55050a65676b2786458b6fcca560c65c4160bf069357d
|
@@ -29,7 +29,12 @@ module OData
|
|
29
29
|
def odata_get(request:, entity:)
|
30
30
|
media_env = request.env.dup
|
31
31
|
media_env['PATH_INFO'] = filename(entity)
|
32
|
-
@file_server.call(media_env)
|
32
|
+
fsret = @file_server.call(media_env)
|
33
|
+
if fsret.first == 200
|
34
|
+
# provide own content type as we keep it in the media entity
|
35
|
+
fsret[1]['Content-Type'] = entity.content_type
|
36
|
+
end
|
37
|
+
fsret
|
33
38
|
end
|
34
39
|
|
35
40
|
# TODO perf: this can be precalculated and cached on MediaModelKlass level
|
@@ -88,16 +93,30 @@ module OData
|
|
88
93
|
def save_file(data:, filename:, entity:)
|
89
94
|
Dir.chdir(abs_klass_dir(entity)) do
|
90
95
|
in_media_directory(entity) do
|
96
|
+
filename = '1'
|
91
97
|
File.open(filename, 'wb') { |f| IO.copy_stream(data, f) }
|
92
98
|
end
|
93
99
|
end
|
94
100
|
end
|
95
101
|
|
102
|
+
# needed for having a changing media ressource "source" metadata
|
103
|
+
# after each upload, so that clients get informed about new versions
|
104
|
+
# of the same media ressource
|
105
|
+
def ressource_version(entity)
|
106
|
+
Dir.chdir(abs_klass_dir(entity)) do
|
107
|
+
in_media_directory(entity) do
|
108
|
+
Dir.glob('*').last
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
96
113
|
# Here as well, MVP implementation
|
97
114
|
def replace_file(data:, filename:, entity:)
|
98
115
|
Dir.chdir(abs_klass_dir(entity)) do
|
99
116
|
in_media_directory(entity) do
|
100
|
-
|
117
|
+
version = nil
|
118
|
+
Dir.glob('*').each { |oldf| version = oldf; File.delete(oldf) }
|
119
|
+
filename = (version.to_i + 1).to_s
|
101
120
|
File.open(filename, 'wb') { |f| IO.copy_stream(data, f) }
|
102
121
|
end
|
103
122
|
end
|
@@ -112,7 +131,7 @@ module OData
|
|
112
131
|
SEP = '/00/'
|
113
132
|
|
114
133
|
def StaticTree.path_builder(ids)
|
115
|
-
ids.map{|id| id.to_s.chars.join('/')}.join(SEP)
|
134
|
+
ids.map{|id| id.to_s.chars.join('/')}.join(SEP) + '/v'
|
116
135
|
end
|
117
136
|
|
118
137
|
# this is relative to abs_klass_dir(entity) eg to /@root/Photo
|
@@ -145,16 +164,26 @@ module OData
|
|
145
164
|
end
|
146
165
|
|
147
166
|
# Here as well, MVP implementation
|
167
|
+
# def replace_file(data:, filename:, entity:)
|
168
|
+
# Dir.chdir(abs_klass_dir(entity)) do
|
169
|
+
# in_media_directory(entity) do
|
170
|
+
# Dir.glob('*').each { |oldf| File.delete(oldf) if File.file?(oldf) }
|
171
|
+
# File.open(filename, 'wb') { |f| IO.copy_stream(data, f) }
|
172
|
+
# end
|
173
|
+
# end
|
174
|
+
# end
|
175
|
+
# Here as well, MVP implementation
|
148
176
|
def replace_file(data:, filename:, entity:)
|
149
177
|
Dir.chdir(abs_klass_dir(entity)) do
|
150
178
|
in_media_directory(entity) do
|
151
|
-
|
179
|
+
version = nil
|
180
|
+
Dir.glob('*').each { |oldf| version = oldf; File.delete(oldf) }
|
181
|
+
filename = (version.to_i + 1).to_s
|
152
182
|
File.open(filename, 'wb') { |f| IO.copy_stream(data, f) }
|
153
183
|
end
|
154
184
|
end
|
155
185
|
end
|
156
186
|
|
157
|
-
|
158
187
|
end
|
159
188
|
|
160
189
|
end
|
@@ -174,8 +203,8 @@ module OData
|
|
174
203
|
@media_handler = OData::Media::Static.new
|
175
204
|
end
|
176
205
|
|
177
|
-
def use(klass,
|
178
|
-
@media_handler = klass.new(
|
206
|
+
def use(klass, args)
|
207
|
+
@media_handler = klass.new(**args)
|
179
208
|
end
|
180
209
|
|
181
210
|
# API method for setting the model field mapped to SLUG on upload
|
data/lib/odata/entity.rb
CHANGED
@@ -188,22 +188,23 @@ module OData
|
|
188
188
|
|
189
189
|
# TODO: differentiate between POST/PUT/PATCH/MERGE
|
190
190
|
def odata_post(req)
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
191
|
+
if req.walker.media_value
|
192
|
+
odata_media_value_put(req)
|
193
|
+
else
|
194
|
+
if req.accept?(APPJSON)
|
195
|
+
data.delete('__metadata')
|
196
|
+
|
197
|
+
if req.in_changeset
|
198
|
+
set_fields(data, self.class.data_fields, missing: :skip)
|
199
|
+
save(transaction: false)
|
200
|
+
else
|
201
|
+
update_fields(data, self.class.data_fields, missing: :skip)
|
202
|
+
end
|
203
|
+
|
204
|
+
[202, {}, to_odata_post_json(service: req.service)]
|
205
|
+
else # TODO: other formats
|
206
|
+
415
|
202
207
|
end
|
203
|
-
|
204
|
-
[202, {}, to_odata_post_json(service: req.service)]
|
205
|
-
else # TODO: other formats
|
206
|
-
415
|
207
208
|
end
|
208
209
|
end
|
209
210
|
|
@@ -387,14 +388,19 @@ module OData
|
|
387
388
|
{ uri: uri(uribase),
|
388
389
|
type: type_name,
|
389
390
|
media_src: media_src(uribase),
|
390
|
-
edit_media:
|
391
|
+
edit_media: edit_media(uribase),
|
391
392
|
content_type: @values[:content_type] }
|
392
393
|
end
|
393
394
|
|
394
|
-
def media_src(
|
395
|
-
|
395
|
+
def media_src(uribase)
|
396
|
+
version = self.class.media_handler.ressource_version(self)
|
397
|
+
"#{uri(uribase)}/$value?version=#{version}"
|
396
398
|
end
|
397
|
-
|
399
|
+
|
400
|
+
def edit_media(uribase)
|
401
|
+
"#{uri(uribase)}/$value"
|
402
|
+
end
|
403
|
+
|
398
404
|
# directory where to put/find the media files for this entity-type
|
399
405
|
def klass_dir
|
400
406
|
type_name
|
data/lib/odata/error.rb
CHANGED
data/lib/odata/walker.rb
CHANGED
data/lib/safrano/service.rb
CHANGED
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.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- D.M.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -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
|
111
|
+
description: Safrano is an OData server library based on Ruby, Rack and Sequel.
|
112
112
|
email: dev@aithscel.eu
|
113
113
|
executables: []
|
114
114
|
extensions: []
|
@@ -166,9 +166,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
166
|
- !ruby/object:Gem::Version
|
167
167
|
version: '0'
|
168
168
|
requirements: []
|
169
|
-
|
170
|
-
rubygems_version: 2.7.6.2
|
169
|
+
rubygems_version: 3.1.2
|
171
170
|
signing_key:
|
172
171
|
specification_version: 4
|
173
|
-
summary: Safrano is a Ruby OData
|
172
|
+
summary: Safrano is a Ruby OData server based on Sequel and Rack
|
174
173
|
test_files: []
|