Class: AssetCloud::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/asset_cloud/base.rb

Constant Summary collapse

VALID_PATHS =
/\A
(
  (\w)                #Filename can be a single letter or underscore
  |                     #OR it is many and follows the below rules
  (
    (\.?[\w\[\]\(\)\-\@])       #It can start with a dot but it must have a following character
    (
      [\w\[\]\(\)\-\@]          #You can have a letter without any following conditions
      |
      [\ ][\w\[\]\(\)\-\@\.]      #If there is a space you need to have a normal letter afterward or a dot
      |
      [\/][\w\[\]\(\)\-\@]      #If there is a slash you need to have a normal letter afterward
      |
      [\/][\.][\w\[\]\(\)\-\@]  #Though a slash could be followed by a dot so long as there is a normal letter afterward
      |
      [\.]+[\w\[\]\(\)\-\@]+     #One or more dots must be followed by one (or more) normal letters
    )*                  #Zero to many of these combinations.
  )
)\z/x
MATCH_BUCKET =
/^(\w+)(\/|$)/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root, url = '/') ⇒ Base

Returns a new instance of Base.



92
93
94
# File 'lib/asset_cloud/base.rb', line 92

def initialize(root, url = '/')
  @root, @url = root, url
end

Instance Attribute Details

#root ⇒ Object

Returns the value of attribute root.



33
34
35
# File 'lib/asset_cloud/base.rb', line 33

def root
  @root
end

#url ⇒ Object

Returns the value of attribute url.



33
34
35
# File 'lib/asset_cloud/base.rb', line 33

def url
  @url
end

Class Method Details

.asset_extensions(*args) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/asset_cloud/base.rb', line 70

def self.asset_extensions(*args)
  opts = args.last.is_a?(Hash) ? args.pop.slice(:only, :except) : {}
  opts.each do |k,v|
    opts[k] = [v].flatten.map(&:to_sym)
  end

  args.each do |klass|
    klass = convert_to_class_name_if_possible(klass)
    self.asset_extension_classes[klass] = opts
  end
end

.bucket(*args) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/asset_cloud/base.rb', line 47

def self.bucket(*args)
  asset_class = if args.last.is_a? Hash
    convert_to_class_name_if_possible(args.pop[:asset_class])
  end

  bucket_class = if args.last.is_a? Class
    convert_to_class_name_if_possible(args.pop)
  else
    raise ArgumentError, 'requires a bucket class'
  end

  if bucket_name = args.first
    self.bucket_classes[bucket_name.to_sym] = bucket_class
    self.asset_classes[bucket_name.to_sym]  = asset_class if asset_class
  else
    self.root_bucket_class = bucket_class
    if asset_class
      raise ArgumentError, 'asset_class on the root bucket cannot be a proc' if asset_class.is_a?(Proc)
      self.root_asset_class  = asset_class
    end
  end
end

Instance Method Details

#[](key) ⇒ Object



200
201
202
# File 'lib/asset_cloud/base.rb', line 200

def [](key)
  asset_at!(key)
end

#[]=(key, value) ⇒ Object



194
195
196
197
198
# File 'lib/asset_cloud/base.rb', line 194

def []=(key, value)
  asset = self[key]
  asset.value = value
  asset.store
end

#asset_at(*args) ⇒ Object



114
115
116
# File 'lib/asset_cloud/base.rb', line 114

def asset_at(*args)
  asset_class_for(args.first).at(self, *args)
end

#asset_at!(*args) ⇒ Object



118
119
120
121
# File 'lib/asset_cloud/base.rb', line 118

def asset_at!(*args)
  check_key_for_errors(args.first)
  asset_at(*args)
end

#asset_class_for(key) ⇒ Object



221
222
223
224
225
226
227
# File 'lib/asset_cloud/base.rb', line 221

def asset_class_for(key)
  klass = self.class.asset_classes[bucket_symbol_for_key(key)]
  klass = klass.call(key) if klass.is_a?(Proc)
  klass ||= self.class.root_asset_class

  constantize_if_necessary(klass)
end

#asset_extension_classes_for_bucket(bucket) ⇒ Object



229
230
231
232
233
234
235
236
237
238
# File 'lib/asset_cloud/base.rb', line 229

def asset_extension_classes_for_bucket(bucket)
  bucket = bucket.to_sym
  extensions = self.class.asset_extension_classes
  klasses = extensions.keys.select do |ext|
    opts = extensions[ext]
    (opts.key?(:only) ? opts[:only].include?(bucket) : true) &&
    (opts.key?(:except) ? !opts[:except].include?(bucket) : true)
  end
  klasses.map {|klass| constantize_if_necessary(klass)}
end

#bucket_for(key) ⇒ Object



189
190
191
192
# File 'lib/asset_cloud/base.rb', line 189

def bucket_for(key)
  bucket = buckets[bucket_symbol_for_key(key)]
  bucket ? bucket : root_bucket
end

#buckets ⇒ Object



82
83
84
85
86
87
88
89
90
# File 'lib/asset_cloud/base.rb', line 82

def buckets
  @buckets ||= Hash.new do |hash, key|
    if klass = self.class.bucket_classes[key]
      hash[key] = constantize_if_necessary(klass).new(self, key)
    else
      hash[key] = nil
    end
  end
end

#build(key, value = nil, &block) ⇒ Object



141
142
143
144
# File 'lib/asset_cloud/base.rb', line 141

def build(key, value = nil, &block)
  logger.info { "  [#{self.class.name}] Building asset #{key}" } if logger
  asset_class_for(key).new(self, key, value, Metadata.non_existing, &block)
end

#copy(source, destination) ⇒ Object



133
134
135
136
137
138
139
# File 'lib/asset_cloud/base.rb', line 133

def copy(source, destination)
  return if source == destination

  object = build(destination, read(source))
  object.store
  object
end

#delete(key) ⇒ Object



183
184
185
186
187
# File 'lib/asset_cloud/base.rb', line 183

def delete(key)
  logger.info { "  [#{self.class.name}] Deleting #{key}" } if logger

  bucket_for(key).delete(key)
end

#exist?(key) ⇒ Boolean

Returns:

  • (Boolean)


171
172
173
174
175
176
177
# File 'lib/asset_cloud/base.rb', line 171

def exist?(key)
  if fp = stat(key)
    fp.exist?
  else
    false
  end
end

#find(key) ⇒ Object



108
109
110
111
112
# File 'lib/asset_cloud/base.rb', line 108

def find(key)
  asset = asset_at(key)
  asset.value
  asset
end

#ls(key) ⇒ Object



165
166
167
168
169
# File 'lib/asset_cloud/base.rb', line 165

def ls(key)
  logger.info { "  [#{self.class.name}] Listing objects in #{key}" } if logger

  bucket_for(key).ls(key)
end

#move(source, destination) ⇒ Object



123
124
125
126
127
128
129
130
131
# File 'lib/asset_cloud/base.rb', line 123

def move(source, destination)
  return if source == destination

  object = copy(source, destination)
  if object.errors.none?
    asset_at(source).delete
  end
  object
end

#path ⇒ Object



104
105
106
# File 'lib/asset_cloud/base.rb', line 104

def path
  root
end

#path_for(key) ⇒ Object



100
101
102
# File 'lib/asset_cloud/base.rb', line 100

def path_for(key)
  File.join(path, key)
end

#read(key) ⇒ Object



153
154
155
156
157
# File 'lib/asset_cloud/base.rb', line 153

def read(key)
  logger.info { "  [#{self.class.name}] Reading from #{key}" } if logger

  bucket_for(key).read(key)
end

#read_version(key, version) ⇒ Object

versioning



206
207
208
209
# File 'lib/asset_cloud/base.rb', line 206

def read_version(key, version)
  logger.info { "  [#{self.class.name}] Reading from #{key} at version #{version}" } if logger
  bucket_for(key).read_version(key, version)
end

#stat(key) ⇒ Object



159
160
161
162
163
# File 'lib/asset_cloud/base.rb', line 159

def stat(key)
  logger.info { "  [#{self.class.name}] Statting #{key}" } if logger

  bucket_for(key).stat(key)
end

#supports?(key) ⇒ Boolean

Returns:

  • (Boolean)


179
180
181
# File 'lib/asset_cloud/base.rb', line 179

def supports?(key)
  key =~ VALID_PATHS
end

#url_for(key, options = {}) ⇒ Object



96
97
98
# File 'lib/asset_cloud/base.rb', line 96

def url_for(key, options={})
  File.join(@url, URI.encode(key))
end

#version_details(key) ⇒ Object



216
217
218
219
# File 'lib/asset_cloud/base.rb', line 216

def version_details(key)
  logger.info { "  [#{self.class.name}] Getting all version details for #{key}" } if logger
  bucket_for(key).version_details(key)
end

#versions(key) ⇒ Object



211
212
213
214
# File 'lib/asset_cloud/base.rb', line 211

def versions(key)
  logger.info { "  [#{self.class.name}] Getting all versions for #{key}" } if logger
  bucket_for(key).versions(key)
end

#write(key, value) ⇒ Object



146
147
148
149
150
151
# File 'lib/asset_cloud/base.rb', line 146

def write(key, value)
  check_key_for_errors(key)
  logger.info { "  [#{self.class.name}] Writing #{value.size} bytes to #{key}" } if logger

  bucket_for(key).write(key, value)
end