attachie 1.1.1 → 1.2.0

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: 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: