s3_index 0.1.1 → 0.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
  SHA1:
3
- metadata.gz: 09f47a01e5c9ac5c44b32f5e006f787d0ee82cc0
4
- data.tar.gz: d9560340c7ee47c509baed7c1090a70a804b6a57
3
+ metadata.gz: 4ebc8919d29a2d7a697050a9c17a1255899ce551
4
+ data.tar.gz: 852120e458e1bfd9a651df91a70ce27c032e400d
5
5
  SHA512:
6
- metadata.gz: 4d6a66d686c99bf983d99e48bbd79640b2e77da61d73f5a6aaf65ce5158f4533a53c31f3fd88a3845558750114bb039309ac026079a171b068456a0d3861dd33
7
- data.tar.gz: 04903a0efada0f696aae4b76b68f6ede82de5726af56e779df37265f67f081c962c5b8d8760cc5c8dac62d60e2291e17b239e4adec2fd42e2d3a309f13806020
6
+ metadata.gz: 5605f6707ce1c1a962df8ce94ead265036de6b2317dbf5905e7c49c0159cbe63977fabe3138f6d10e33558802be1d2dc2955dac0e5ee7a53aafb98fca273f124
7
+ data.tar.gz: a3ce408ccea48e347970e5ddccc495eb47cfe273a63ac4b0362dfda5fba2b1499bc97d96c99ad1d18cad71f452244dd128008bb5eabdfbaae7a103fcaa2f7ad2
@@ -6,6 +6,7 @@ module S3Index
6
6
  extend ActiveSupport::Autoload
7
7
 
8
8
  autoload :Index
9
+ autoload :Accessor
9
10
 
10
11
  module_function
11
12
 
@@ -98,6 +99,12 @@ module S3Index
98
99
  def default_client=(client)
99
100
  @s3_client = client
100
101
  end
102
+
103
+ # Let the model handle everything else
104
+ def method_missing(meth, *args, &block)
105
+ super unless Index.respond_to?(meth)
106
+ Index.public_send(meth, *args, &block)
107
+ end
101
108
  end
102
109
 
103
110
  S3Index.eager_load!
@@ -0,0 +1,120 @@
1
+ # module
2
+ module S3Index
3
+ # Adds S3 backed data accessors to any ActiveRecord model
4
+ #
5
+ # ## Example:
6
+ # ```
7
+ # class Foo < ActiveRecord::Base
8
+ # include S3Index::Accessor
9
+ #
10
+ # s3_index_accessor :s3_data,
11
+ # cache_dir: '/tmp'
12
+ # bucket: 'foo',
13
+ # s3_resource: Aws::S3::Resource.new
14
+ # end
15
+ # ```
16
+ module Accessor
17
+ extend ActiveSupport::Concern
18
+
19
+ included do
20
+ class_attribute :_s3_index_config
21
+ end
22
+
23
+ class_methods do
24
+ def s3_index_accessor(name, cache_dir:, bucket: nil, s3_resource: nil)
25
+ # IMPORTANT never move this line unless you want everything to break.
26
+ # This ensures lowest descendent has its own hash instance.
27
+ self._s3_index_config ||= {}
28
+
29
+ # do the assignment
30
+ self._s3_index_config[name] = {
31
+ name: name,
32
+ cache_dir: cache_dir,
33
+ bucket: bucket || name.to_s,
34
+ s3_resource: s3_resource || Aws::S3::Resource.new
35
+ }
36
+
37
+ class_eval <<-RUBY, __FILE__, __LINE__
38
+ after_save do |row|
39
+ handle_s3_index_after_save(:#{name}, _s3_index_config[:#{name}], row)
40
+ end
41
+ RUBY
42
+
43
+ class_eval(<<-RUBY.strip_heredoc, __FILE__, __LINE__)
44
+ def #{name}=(value)
45
+ handle_s3_index_write(:#{name}, _s3_index_config[:#{name}], value)
46
+ end
47
+ RUBY
48
+
49
+ class_eval(<<-RUBY.strip_heredoc, __FILE__, __LINE__)
50
+ def #{name}(force: false)
51
+ handle_s3_index_read(:#{name}, _s3_index_config[:#{name}], force: force)
52
+ end
53
+ RUBY
54
+
55
+ class_eval(<<-RUBY.strip_heredoc, __FILE__, __LINE__)
56
+ def #{name}!
57
+ #{name}(force: true)
58
+ end
59
+ RUBY
60
+
61
+ class_eval(<<-RUBY.strip_heredoc, __FILE__, __LINE__)
62
+ def #{name}_index
63
+ handle_s3_index_record(:#{name}, _s3_index_config[:#{name}])
64
+ end
65
+ RUBY
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def handle_s3_index_write(name, config, value)
72
+ File.open(full_cache_path(config), 'wb') { |f| f << value } if self.id
73
+ instance_variable_set("@_#{name}", value)
74
+ end
75
+
76
+ def handle_s3_index_read(name, config, force:)
77
+ if force
78
+ var_name = "@_#{name}".to_sym
79
+ instance_variable_set(var_name, nil)
80
+ end
81
+ instance_var_set_if_needed(name) do
82
+ unless File.file?(full_cache_path(config))
83
+ index = handle_s3_index_record(name, config)
84
+ index.download!(s3: config[:s3_resource])
85
+ end
86
+ File.read(full_cache_path(config))
87
+ end
88
+ end
89
+
90
+ def handle_s3_index_record(name, config)
91
+ instance_var_set_if_needed("#{name}_index") do
92
+ Index.find_by(origin_url: full_cache_path(config), s3_bucket: config[:bucket])
93
+ end
94
+ end
95
+
96
+ def handle_s3_index_after_save(name, config, row)
97
+ value = instance_variable_get("@_#{name}")
98
+ handle_s3_index_write(name, config, value)
99
+ S3Index.upload!(
100
+ s3: config[:s3_resource],
101
+ bucket: config[:bucket],
102
+ src: full_cache_path(config)
103
+ )
104
+ end
105
+
106
+ def full_cache_path(config)
107
+ File.join(config[:cache_dir], "#{config[:name]}-#{self.id}")
108
+ end
109
+
110
+ def instance_var_set_if_needed(name, &block)
111
+ var_name = "@_#{name}".to_sym
112
+ result = instance_variable_get(var_name)
113
+ unless result
114
+ result = block.call
115
+ instance_variable_set(var_name, result)
116
+ end
117
+ result
118
+ end
119
+ end
120
+ end
@@ -1,3 +1,3 @@
1
1
  module S3Index
2
- VERSION = "0.1.1"
2
+ VERSION = '0.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: s3_index
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Pierce
@@ -157,6 +157,7 @@ files:
157
157
  - db/schema.rb
158
158
  - lib/environment.rb
159
159
  - lib/s3_index.rb
160
+ - lib/s3_index/accessor.rb
160
161
  - lib/s3_index/index.rb
161
162
  - lib/s3_index/version.rb
162
163
  - lib/tasks/db.rake