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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a16c6b649ec630fbada504c11039b017b4055c7038c2aa126e7c6b55dd768ff
4
- data.tar.gz: 03b387f824a5f2e4d53c3e16dd9b013ca8d3c308bc06e13cc0bf09bf54f4f3eb
3
+ metadata.gz: cc504918971031d5c89c44a26e970a65da7e2cbd3da865e65138e95f90a2460d
4
+ data.tar.gz: dd418e35d807619d101b385434ab4f886e7a0b9d10267471a09418e50d14db49
5
5
  SHA512:
6
- metadata.gz: d40563e3e2ad2db813954318aaf5d0f3097f71d9210af9434524cc7e8e25ba81b37694e0fe5fb7d7f9c662679a3b5c8425d11e771d8ba0fe42162598d4f81f65
7
- data.tar.gz: 8dc6cfea884a95c2841e0646d0051dcf4926c3fad85734978e8ee2bc98ea7dbae5fd3718cf6a3a8b49f66c2a3566c33c70c64fd8babde8c4c66a1cbe2eb46929
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
- Dir.glob('*').each { |oldf| File.delete(oldf) }
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
- Dir.glob('*').each { |oldf| File.delete(oldf) if File.file?(oldf) }
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, *args)
178
- @media_handler = klass.new(*args)
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
@@ -188,22 +188,23 @@ module OData
188
188
 
189
189
  # TODO: differentiate between POST/PUT/PATCH/MERGE
190
190
  def odata_post(req)
191
- data = JSON.parse(req.body.read)
192
- @uribase = req.uribase
193
-
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)
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: media_src(uribase),
391
+ edit_media: edit_media(uribase),
391
392
  content_type: @values[:content_type] }
392
393
  end
393
394
 
394
- def media_src(urbase)
395
- "#{uri(urbase)}/$value"
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
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'json'
4
2
  require 'rexml/document'
5
3
  require 'safrano.rb'
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'json'
4
2
  require 'rexml/document'
5
3
  require 'safrano.rb'
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'rexml/document'
4
2
  require 'odata/relations.rb'
5
3
  require 'odata/batch.rb'
@@ -1,3 +1,3 @@
1
1
  module Safrano
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
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.0
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-04-26 00:00:00.000000000 Z
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 framework based on Ruby, Rack and Sequel.
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
- rubyforge_project:
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 provider based on Sequel and Rack
172
+ summary: Safrano is a Ruby OData server based on Sequel and Rack
174
173
  test_files: []