attachie 1.1.1 → 1.2.0

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: f21f7eb60467e9fb640626ad3633013e73166d975565afad29a761c8847bb83c
4
- data.tar.gz: fb06c69f95ecd1264f13c7d162ab415c94e356deb2b771e7d766852da86de83d
3
+ metadata.gz: 2eb19de73f237ed0298861ef6b69bd4fdb0ca87b6fb4e30fdd26a3e594f25954
4
+ data.tar.gz: 3b2f115036c310943864d0732d369f9e796c784aa125a23ec85136c1e0956fdc
5
5
  SHA512:
6
- metadata.gz: 0f5cd5094aad872ccda17615f1aa2e0c6f582937a0be6f54b45e1ff986f04fad148224d4415ecefcdee4a04a6638ec44031b7dd5167eac6c4f13c21ed7ca317c
7
- data.tar.gz: 54ea0ef551453b1335a5267f04c9b43c0fa34d624a1923c10dc946385e6cba09554f4d628cb5b7fe5110c54aad730d4dc9d08c2673caf68d8ffdd0a0c520e7ce
6
+ metadata.gz: 3094cc9dbf755c8c942ee0e8903a99e364180415f16b7fb69e959d01d8f4c34110722f77acc5f2585e5686b58c0a9553505a7843fd7bbe244ef2cc68cbfc861d
7
+ data.tar.gz: a976071b69c6a5429d53dc9b3f7427ab1fd3a2f5df665058f2325ae873478b3eb86a86aff71d24bdcd5c4b03cf6439f4954291f0496106f6483200cf3fd948ec
@@ -5,7 +5,7 @@ jobs:
5
5
  runs-on: ubuntu-latest
6
6
  strategy:
7
7
  matrix:
8
- ruby: ['2.5', '2.6', '2.7']
8
+ ruby: ['2.6', '2.7', '3.0']
9
9
  services:
10
10
  fake-s3:
11
11
  image: lphoward/fake-s3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.2.0
4
+ ### Added
5
+ * Return proper `last_modified` in `FakeDriver#info`
6
+
7
+ ## 1.1.2
8
+ ### Fixed
9
+ * Make `FakeDriver` thread-safe
10
+ * Sort objects in `FakeDriver#list` by key
11
+
3
12
  ## 1.1.1
4
13
  ### Fixed
5
14
  * Use `mkdir_p` in `FileDriver#download`
data/attachie.gemspec CHANGED
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "rake"
28
28
  spec.add_development_dependency "rspec"
29
29
  spec.add_development_dependency "fakes3"
30
+ spec.add_development_dependency "timecop"
30
31
  end
@@ -32,22 +32,28 @@ module Attachie
32
32
  end
33
33
 
34
34
  class FakeDriver
35
+ include MonitorMixin
36
+
35
37
  class ItemNotFound < StandardError; end
36
38
 
37
39
  def list(bucket, prefix: nil)
38
40
  return enum_for(:list, bucket, prefix: prefix) unless block_given?
39
41
 
40
- objects(bucket).dup.each do |key, _|
41
- yield key if prefix.nil? || key.start_with?(prefix)
42
+ synchronize do
43
+ objects(bucket).sort { |a, b| a[0] <=> b[0] }.each do |key, _|
44
+ yield key if prefix.nil? || key.start_with?(prefix)
45
+ end
42
46
  end
43
47
  end
44
48
 
45
49
  def info(name, bucket)
46
- {
47
- last_modified: nil,
48
- content_length: objects(bucket)[name].size,
49
- content_type: MIME::Types.of(name).first&.to_s
50
- }
50
+ synchronize do
51
+ {
52
+ last_modified: objects(bucket)[name][:last_modified],
53
+ content_length: objects(bucket)[name][:data].size,
54
+ content_type: MIME::Types.of(name).first&.to_s
55
+ }
56
+ end
51
57
  end
52
58
 
53
59
  def presigned_post(name, bucket, options = {})
@@ -55,25 +61,35 @@ module Attachie
55
61
  end
56
62
 
57
63
  def store(name, data_or_io, bucket, options = {})
58
- objects(bucket)[name] = data_or_io.respond_to?(:read) ? data_or_io.read : data_or_io
64
+ synchronize do
65
+ objects(bucket)[name] = { data: data_or_io.respond_to?(:read) ? data_or_io.read : data_or_io, last_modified: Time.now.utc }
66
+ end
59
67
  end
60
68
 
61
69
  def store_multipart(name, bucket, options = {}, &block)
62
- objects(bucket)[name] = FakeMultipartUpload.new(name, bucket, options, &block).data
70
+ synchronize do
71
+ objects(bucket)[name] = { data: FakeMultipartUpload.new(name, bucket, options, &block).data, last_modified: Time.now.utc }
72
+ end
63
73
  end
64
74
 
65
75
  def exists?(name, bucket)
66
- objects(bucket).key?(name)
76
+ synchronize do
77
+ objects(bucket).key?(name)
78
+ end
67
79
  end
68
80
 
69
81
  def delete(name, bucket)
70
- objects(bucket).delete(name)
82
+ synchronize do
83
+ objects(bucket).delete(name)
84
+ end
71
85
  end
72
86
 
73
87
  def value(name, bucket)
74
- raise(ItemNotFound) unless objects(bucket).key?(name)
88
+ synchronize do
89
+ raise(ItemNotFound, "Object #{ name } does not exist in bucket #{ bucket }") unless objects(bucket).key?(name)
75
90
 
76
- objects(bucket)[name]
91
+ objects(bucket)[name][:data]
92
+ end
77
93
  end
78
94
 
79
95
  def download(name, bucket, path)
@@ -87,14 +103,18 @@ module Attachie
87
103
  end
88
104
 
89
105
  def flush
90
- @objects = {}
106
+ synchronize do
107
+ @objects = {}
108
+ end
91
109
  end
92
110
 
93
111
  private
94
112
 
95
113
  def objects(bucket)
96
- @objects ||= {}
97
- @objects[bucket] ||= {}
114
+ synchronize do
115
+ @objects ||= {}
116
+ @objects[bucket] ||= {}
117
+ end
98
118
  end
99
119
  end
100
120
  end
@@ -1,3 +1,3 @@
1
1
  module Attachie
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -21,6 +21,14 @@ RSpec.describe Attachie::FakeDriver do
21
21
 
22
22
  expect(driver.list("bucket1", prefix: "object").to_a).to eq(["object1", "object2"])
23
23
  end
24
+
25
+ it "sorts the objects by key" do
26
+ driver.store("object2", "blob", "bucket")
27
+ driver.store("object1", "blob", "bucket")
28
+ driver.store("object3", "blob", "bucket")
29
+
30
+ expect(driver.list("bucket").to_a).to eq(["object1", "object2", "object3"])
31
+ end
24
32
  end
25
33
 
26
34
  describe "#store" do
@@ -77,12 +85,16 @@ RSpec.describe Attachie::FakeDriver do
77
85
 
78
86
  describe "#info" do
79
87
  it "returns info about the object" do
80
- driver.store("name.txt", "blob", "bucket")
88
+ timestamp = Time.now.utc
89
+
90
+ Timecop.freeze timestamp do
91
+ driver.store("name.txt", "blob", "bucket")
92
+ end
81
93
 
82
94
  expect(driver.info("name.txt", "bucket")).to eq(
83
95
  content_length: 4,
84
96
  content_type: "text/plain",
85
- last_modified: nil
97
+ last_modified: timestamp
86
98
  )
87
99
  end
88
100
  end
data/spec/spec_helper.rb CHANGED
@@ -4,6 +4,7 @@ require File.expand_path("../../lib/attachie", __FILE__)
4
4
  require "attachie/file_driver"
5
5
  require "attachie/fake_driver"
6
6
  require "attachie/s3_driver"
7
+ require "timecop"
7
8
 
8
9
  class Product
9
10
  include Attachie
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attachie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Vetter
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-01 00:00:00.000000000 Z
11
+ date: 2022-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-s3
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: timecop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  description: Declarative and flexible attachments
126
140
  email:
127
141
  - vetter@plainpicture.de
@@ -154,7 +168,7 @@ homepage: ''
154
168
  licenses:
155
169
  - MIT
156
170
  metadata: {}
157
- post_install_message:
171
+ post_install_message:
158
172
  rdoc_options: []
159
173
  require_paths:
160
174
  - lib
@@ -169,8 +183,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
183
  - !ruby/object:Gem::Version
170
184
  version: '0'
171
185
  requirements: []
172
- rubygems_version: 3.0.3
173
- signing_key:
186
+ rubygems_version: 3.3.3
187
+ signing_key:
174
188
  specification_version: 4
175
189
  summary: Declarative and flexible attachments
176
190
  test_files: