dis 1.1.3 → 1.1.8

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: e288aeab069c9e9d3e65daeb330c4a28cd639d9d83a70cad85b91fbcc156d91c
4
- data.tar.gz: c9b4fd556e84eb7e3ade9155f62fdc0e7220b1fdbf1fef601255ece90b8df530
3
+ metadata.gz: 852a63ca2fc89b07329a0fab7b304292e677c2f9613160200835c993b36d4d4a
4
+ data.tar.gz: 6c9bf26338b97bfe039295df77d2fdb238218898fd375b3589e3ebe41635676e
5
5
  SHA512:
6
- metadata.gz: 7d61a6b68917905cd896300e7413e8676d7562cdd96599c6331928da12ef6f8a6bdc7ad2c7cfaccc3fff5d42bed45f6f123a1bf1f0138689dd2c26070f9c7ebe
7
- data.tar.gz: b75616ead369930d1a52b2778afd50af9f252d75bad020836762b5247289cd4fe805fc2791b19158fdc1926d22313eb2240e5c441e8d0ac04589d966e2209a2b
6
+ metadata.gz: 9238a9c59120eb645293e5bfdc43dc14a7fd62aa59040748c6b4c89464c066e0b2fe69d6c9bbe8b536b015e5256b41f1b2c1f942b2cb75e563c46f9aee6d97db
7
+ data.tar.gz: 5e9824d5c4058e0fd4ebe6c727f3ea30b670c5a32f5999ef059a8eb7c52b1a859e8f333def120875851cd84c1f10ec4b3806b12b3057c040dfc3eeae81fe4214
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  [![Version](https://img.shields.io/gem/v/dis.svg?style=flat)](https://rubygems.org/gems/dis)
2
- [![Build Status](https://travis-ci.org/elektronaut/dis.svg?branch=master)](https://travis-ci.org/elektronaut/dis)
2
+ ![Build](https://github.com/elektronaut/dis/workflows/Build/badge.svg)
3
3
  [![Code Climate](https://codeclimate.com/github/elektronaut/dis/badges/gpa.svg)](https://codeclimate.com/github/elektronaut/dis)
4
4
  [![Code Climate](https://codeclimate.com/github/elektronaut/dis/badges/coverage.svg)](https://codeclimate.com/github/elektronaut/dis)
5
5
  [![Inline docs](http://inch-ci.org/github/elektronaut/dis.svg)](http://inch-ci.org/github/elektronaut/dis)
@@ -17,7 +17,7 @@ your own on. If you're looking to handle image uploads, check out
17
17
  [DynamicImage](https://github.com/elektronaut/dynamic_image). It's
18
18
  built on top of Dis and handles resizing, cropping and more on demand.
19
19
 
20
- Requires Rails 4.2+.
20
+ Requires Rails 5+
21
21
 
22
22
  ## Layers
23
23
 
data/lib/dis.rb CHANGED
@@ -1,18 +1,18 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'digest/sha1'
4
- require 'fog/core'
5
- require 'fog/local'
6
- require 'active_job'
7
- require 'pmap'
8
- require 'dis/engine'
9
- require 'dis/errors'
10
- require 'dis/jobs'
11
- require 'dis/layer'
12
- require 'dis/layers'
13
- require 'dis/model'
14
- require 'dis/storage'
15
- require 'dis/validations'
3
+ require "digest/sha1"
4
+ require "fog/core"
5
+ require "fog/local"
6
+ require "active_job"
7
+ require "pmap"
8
+ require "dis/engine"
9
+ require "dis/errors"
10
+ require "dis/jobs"
11
+ require "dis/layer"
12
+ require "dis/layers"
13
+ require "dis/model"
14
+ require "dis/storage"
15
+ require "dis/validations"
16
16
 
17
17
  module Dis
18
18
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  class Engine < ::Rails::Engine
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  module Errors
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'dis/jobs/delete'
4
- require 'dis/jobs/store'
5
- require 'dis/jobs/change_type'
3
+ require "dis/jobs/delete"
4
+ require "dis/jobs/store"
5
+ require "dis/jobs/change_type"
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  module Jobs
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  module Jobs
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  module Jobs
@@ -12,6 +12,10 @@ module Dis
12
12
 
13
13
  def perform(type, key)
14
14
  Dis::Storage.delayed_store(type, key)
15
+ rescue Dis::Errors::NotFoundError
16
+ Rails.logger.warn(
17
+ "Delayed store failed, object not found: #{[type, key].inspect}"
18
+ )
15
19
  end
16
20
  end
17
21
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  # = Dis Layer
@@ -94,15 +94,29 @@ module Dis
94
94
  # is readonly.
95
95
  def store(type, key, file)
96
96
  raise Dis::Errors::ReadOnlyError if readonly?
97
+
97
98
  store!(type, key, file)
98
99
  end
99
100
 
101
+ # Returns all the given keys that exist in the layer.
102
+ #
103
+ # layer.existing("documents", keys)
104
+ def existing(type, keys)
105
+ return [] if keys.empty?
106
+
107
+ list = []
108
+ directory(type, keys.first).files.each do |file|
109
+ list << file.key
110
+ end
111
+
112
+ keys.select { |key| list.include?(key_component(type, key)) }
113
+ end
114
+
100
115
  # Returns true if a object with the given key exists.
101
116
  #
102
117
  # layer.exists?("documents", key)
103
118
  def exists?(type, key)
104
- if directory(type, key) &&
105
- directory(type, key).files.head(key_component(type, key))
119
+ if directory(type, key)&.files&.head(key_component(type, key))
106
120
  true
107
121
  else
108
122
  false
@@ -115,6 +129,7 @@ module Dis
115
129
  def get(type, key)
116
130
  dir = directory(type, key)
117
131
  return unless dir
132
+
118
133
  dir.files.get(key_component(type, key))
119
134
  end
120
135
 
@@ -126,6 +141,7 @@ module Dis
126
141
  # Raises an error if the layer is readonly.
127
142
  def delete(type, key)
128
143
  raise Dis::Errors::ReadOnlyError if readonly?
144
+
129
145
  delete!(type, key)
130
146
  end
131
147
 
@@ -143,15 +159,16 @@ module Dis
143
159
  end
144
160
 
145
161
  def directory_component(_type, _key)
146
- path || ''
162
+ path || ""
147
163
  end
148
164
 
149
165
  def key_component(type, key)
150
- [type, key[0...2], key[2..key.length]].compact.join('/')
166
+ [type, key[0...2], key[2..key.length]].compact.join("/")
151
167
  end
152
168
 
153
169
  def delete!(type, key)
154
170
  return false unless exists?(type, key)
171
+
155
172
  get(type, key).destroy
156
173
  end
157
174
 
@@ -162,7 +179,7 @@ module Dis
162
179
  def directory!(type, key)
163
180
  dir = directory(type, key)
164
181
  dir ||= connection.directories.create(
165
- key: directory_component(type, key),
182
+ key: directory_component(type, key),
166
183
  public: public?
167
184
  )
168
185
  dir
@@ -170,16 +187,17 @@ module Dis
170
187
 
171
188
  def store!(type, key, file)
172
189
  return get(type, key) if exists?(type, key)
190
+
173
191
  file.rewind if file.respond_to?(:rewind)
174
192
  directory!(type, key).files.create(
175
- key: key_component(type, key),
176
- body: (file.is_a?(Fog::Model) ? file.body : file),
193
+ key: key_component(type, key),
194
+ body: (file.is_a?(Fog::Model) ? file.body : file),
177
195
  public: public?
178
196
  )
179
197
  end
180
198
 
181
199
  def path
182
- @path && !@path.empty? ? @path : nil
200
+ @path.presence
183
201
  end
184
202
  end
185
203
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  # = Dis Layers
@@ -22,8 +22,8 @@ module Dis
22
22
  end
23
23
 
24
24
  # Iterates over the layers.
25
- def each
26
- @layers.each { |layer| yield layer }
25
+ def each(&block)
26
+ @layers.each { |layer| block.call(layer) }
27
27
  end
28
28
 
29
29
  # Returns a new instance containing only the delayed layers.
@@ -1,7 +1,7 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'dis/model/class_methods'
4
- require 'dis/model/data'
3
+ require "dis/model/class_methods"
4
+ require "dis/model/data"
5
5
 
6
6
  module Dis
7
7
  # = Dis Model
@@ -103,7 +103,7 @@ module Dis
103
103
  # <tt>content_hash</tt> to nil.
104
104
  def data=(raw_data)
105
105
  new_data = Dis::Model::Data.new(self, raw_data)
106
- attribute_will_change!('data') unless new_data == dis_data
106
+ attribute_will_change!("data") unless new_data == dis_data
107
107
  @dis_data = new_data
108
108
  dis_set :content_hash, if raw_data.nil?
109
109
  nil
@@ -115,7 +115,7 @@ module Dis
115
115
 
116
116
  # Returns true if the data has been changed since the object was last saved.
117
117
  def data_changed?
118
- changes.include?('data')
118
+ changes.include?("data")
119
119
  end
120
120
 
121
121
  def dis_stored?
@@ -135,6 +135,7 @@ module Dis
135
135
 
136
136
  def cleanup_data
137
137
  return if @previous_content_hash.blank?
138
+
138
139
  dis_data.expire(@previous_content_hash)
139
140
  @previous_content_hash = nil
140
141
  end
@@ -167,7 +168,7 @@ module Dis
167
168
 
168
169
  # We don't want the data column when doing a partial write.
169
170
  def keys_for_partial_write
170
- super.reject { |a| a == 'data' }
171
+ super.reject { |a| a == "data" }
171
172
  end
172
173
  end
173
174
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  module Model
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  module Model
@@ -26,7 +26,7 @@ module Dis
26
26
 
27
27
  # Returns the data as a binary string.
28
28
  def read
29
- @cached ||= read_from(closest)
29
+ @read ||= read_from(closest)
30
30
  end
31
31
 
32
32
  # Will be true if data has been explicitely set.
@@ -60,6 +60,7 @@ module Dis
60
60
  # Stores the data. Returns a hash of the content for reference.
61
61
  def store!
62
62
  raise Dis::Errors::NoDataError unless raw?
63
+
63
64
  Dis::Storage.store(storage_type, raw)
64
65
  end
65
66
 
@@ -83,6 +84,7 @@ module Dis
83
84
 
84
85
  def read_from(object)
85
86
  return nil unless object
87
+
86
88
  if object.respond_to?(:body)
87
89
  object.body
88
90
  elsif object.respond_to?(:read)
@@ -104,7 +106,7 @@ module Dis
104
106
  end
105
107
 
106
108
  def stored?
107
- @record.dis_stored? && !content_hash.blank?
109
+ @record.dis_stored? && content_hash.present?
108
110
  end
109
111
 
110
112
  def stored
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  # = Dis Storage
@@ -107,9 +107,7 @@ module Dis
107
107
  fetch_count += 1
108
108
  layer.get(type, key)
109
109
  end.call
110
- end
111
-
112
- raise Dis::Errors::NotFoundError unless result
110
+ end || raise(Dis::Errors::NotFoundError)
113
111
 
114
112
  store_immediately!(type, result) if fetch_count > 1
115
113
  result
@@ -1,3 +1,3 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'dis/validations/data_presence'
3
+ require "dis/validations/data_presence"
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
4
  module Validations
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Dis
4
- VERSION = '1.1.3'.freeze
4
+ VERSION = "1.1.8"
5
5
  end
@@ -1,16 +1,16 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/rails/model/model_generator'
3
+ require "rails/generators"
4
+ require "rails/generators/rails/model/model_generator"
5
5
 
6
6
  module Dis
7
7
  module Generators
8
8
  class InstallGenerator < Rails::Generators::Base
9
- desc 'Creates the Dis initializer'
10
- source_root File.expand_path('../templates', __FILE__)
9
+ desc "Creates the Dis initializer"
10
+ source_root File.expand_path("templates", __dir__)
11
11
 
12
12
  def create_initializer
13
- template 'initializer.rb', File.join('config', 'initializers', 'dis.rb')
13
+ template "initializer.rb", File.join("config", "initializers", "dis.rb")
14
14
  end
15
15
  end
16
16
  end
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Be sure to restart your server when you modify this file.
2
4
 
3
5
  # Creates a local storage layer in db/dis:
4
6
 
5
7
  Dis::Storage.layers << Dis::Layer.new(
6
- Fog::Storage.new(provider: 'Local', local_root: Rails.root.join('db', 'dis')),
8
+ Fog::Storage.new(provider: "Local", local_root: Rails.root.join("db", "dis")),
7
9
  path: Rails.env
8
10
  )
9
11
 
@@ -1,12 +1,12 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require 'rails/generators'
4
- require 'rails/generators/rails/model/model_generator'
3
+ require "rails/generators"
4
+ require "rails/generators/rails/model/model_generator"
5
5
 
6
6
  module Dis
7
7
  module Generators
8
8
  class ModelGenerator < Rails::Generators::ModelGenerator
9
- desc 'Creates a Dis model'
9
+ desc "Creates a Dis model"
10
10
 
11
11
  def initialize(args, *options)
12
12
  super(inject_dis_attributes(args), *options)
@@ -14,7 +14,7 @@ module Dis
14
14
 
15
15
  def add_model_extension
16
16
  inject_into_file(
17
- File.join('app/models', class_path, "#{file_name}.rb"),
17
+ File.join("app/models", class_path, "#{file_name}.rb"),
18
18
  after: "ActiveRecord::Base\n"
19
19
  ) do
20
20
  " include Dis::Model\n"
@@ -32,12 +32,12 @@ module Dis
32
32
  end
33
33
 
34
34
  def dis_attributes
35
- %w(
35
+ %w[
36
36
  content_hash:string
37
37
  content_type:string
38
38
  content_length:integer
39
39
  filename:string
40
- )
40
+ ]
41
41
  end
42
42
  end
43
43
  end
@@ -1,15 +1,15 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  namespace :dis do
4
- desc 'Check stuff'
4
+ desc "Check stuff"
5
5
  task consistency_check: :environment do
6
- unless ENV['MODELS']
6
+ unless ENV["MODELS"]
7
7
  puts "Usage: #{$PROGRAM_NAME} dis:consistency_check " \
8
- 'MODELS=Avatar,Document'
8
+ "MODELS=Avatar,Document"
9
9
  exit
10
10
  end
11
11
 
12
- models = ENV['MODELS'].split(',').map(&:strip).map(&:constantize)
12
+ models = ENV["MODELS"].split(",").map(&:strip).map(&:constantize)
13
13
 
14
14
  jobs = Set.new
15
15
 
@@ -17,28 +17,24 @@ namespace :dis do
17
17
  puts "-- #{model.name} --"
18
18
 
19
19
  content_hash_attr = model.dis_attributes[:content_hash]
20
- objects = model
21
- .select(content_hash_attr)
22
- .uniq
23
- .map { |r| r.send(content_hash_attr) }
20
+ objects = model.pluck(content_hash_attr).uniq
24
21
  global_missing = objects.dup
25
22
 
26
23
  puts "Unique objects: #{objects.length}"
27
24
 
28
25
  Dis::Storage.layers.each do |layer|
29
26
  print "Checking #{layer.name}... "
30
- existing = objects
31
- .pmap { |hash| [hash, layer.exists?(model.dis_type, hash)] }
32
- .select(&:last)
33
- .map(&:first)
27
+
28
+ existing = layer.existing(model.dis_type, objects)
34
29
  missing = objects - existing
35
30
  global_missing -= existing
36
- puts "#{existing.length} existing, #{missing.length} missing"
31
+ puts "#{existing.length} existing, #{missing.length} missing" +
32
+ (layer.readonly? ? " (read-only)" : "")
37
33
 
38
- next unless layer.delayed? #&& layer.writeable?
34
+ next unless layer.delayed? && !layer.readonly?
39
35
 
40
- jobs += missing.pmap do |hash|
41
- [model.dis_type, hash] if Dis::Storage.exists?(model.dis_type, hash)
36
+ jobs += (missing - global_missing).pmap do |hash|
37
+ [model.dis_type, hash]
42
38
  end.compact
43
39
  end
44
40
 
@@ -53,8 +49,8 @@ namespace :dis do
53
49
  if jobs.any?
54
50
  print "#{jobs.length} objects can be transferred to delayed layers, " \
55
51
  "queue now? (y/n) "
56
- response = STDIN.gets.chomp
57
- if response =~ /^y/i
52
+ response = $stdin.gets.chomp
53
+ if /^y/i.match?(response)
58
54
  puts "Queueing jobs..."
59
55
  jobs.each { |type, hash| Dis::Jobs::Store.perform_later(type, hash) }
60
56
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dis
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-13 00:00:00.000000000 Z
11
+ date: 2020-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rails
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '5.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '5.0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: fog-core
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -67,19 +53,19 @@ dependencies:
67
53
  - !ruby/object:Gem::Version
68
54
  version: 1.1.0
69
55
  - !ruby/object:Gem::Dependency
70
- name: sqlite3
56
+ name: rails
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - ">="
59
+ - - ">"
74
60
  - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
61
+ version: '5.0'
62
+ type: :runtime
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
- - - ">="
66
+ - - ">"
81
67
  - !ruby/object:Gem::Version
82
- version: '0'
68
+ version: '5.0'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: rspec-rails
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +80,34 @@ dependencies:
94
80
  - - "~>"
95
81
  - !ruby/object:Gem::Version
96
82
  version: '3.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.17.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.17.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: Dis is a Rails plugin that stores your file uploads and other binary
98
112
  blobs.
99
113
  email:
@@ -127,7 +141,7 @@ homepage: https://github.com/elektronaut/dis
127
141
  licenses:
128
142
  - MIT
129
143
  metadata: {}
130
- post_install_message:
144
+ post_install_message:
131
145
  rdoc_options: []
132
146
  require_paths:
133
147
  - lib
@@ -135,15 +149,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
- version: 1.9.2
152
+ version: 2.4.0
139
153
  required_rubygems_version: !ruby/object:Gem::Requirement
140
154
  requirements:
141
155
  - - ">="
142
156
  - !ruby/object:Gem::Version
143
157
  version: '0'
144
158
  requirements: []
145
- rubygems_version: 3.0.1
146
- signing_key:
159
+ rubygems_version: 3.1.2
160
+ signing_key:
147
161
  specification_version: 4
148
162
  summary: A file store for your Rails app
149
163
  test_files: []