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+)(\/|$)/
URI_PARSER =
URI::RFC2396_Parser.new

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Base.



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

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

Instance Attribute Details

#rootObject

Returns the value of attribute root.



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

def root
  @root
end

#urlObject

Returns the value of attribute url.



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

def url
  @url
end

Class Method Details

.asset_extensions(*args) ⇒ Object



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

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 = asset_extension_classes.merge(klass => opts).freeze
  end
end

.bucket(*args) ⇒ Object



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

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_classes.merge(bucket_name.to_sym => bucket_class).freeze
    self.asset_classes = asset_classes.merge(bucket_name.to_sym => asset_class).freeze 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



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

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

#[]=(key, value) ⇒ Object



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

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

#asset_at(*args) ⇒ Object



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

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

#asset_at!(*args) ⇒ Object



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

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

#asset_class_for(key) ⇒ Object



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

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



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

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



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

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

#bucketsObject



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

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



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

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



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

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

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

#delete(key) ⇒ Object



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

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

  bucket_for(key).delete(key)
end

#exist?(key) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#find(key) ⇒ Object



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

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

#ls(key) ⇒ Object



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

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

  bucket_for(key).ls(key)
end

#move(source, destination) ⇒ Object



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

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

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

#pathObject



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

def path
  root
end

#path_for(key) ⇒ Object



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

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

#read(key) ⇒ Object



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

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



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

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



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

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

  bucket_for(key).stat(key)
end

#supports?(key) ⇒ Boolean

Returns:

  • (Boolean)


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

def supports?(key)
  key =~ VALID_PATHS
end

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



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

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

#version_details(key) ⇒ Object



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

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



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

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



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

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