safrano 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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: []