Module: Curator::Repository::ClassMethods

Defined in:
lib/curator/repository.rb

Instance Method Summary collapse

Instance Method Details

#_build_finder_methods(attribute) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
# File 'lib/curator/repository.rb', line 102

def _build_finder_methods(attribute)
  eigenclass = class << self; self; end
  eigenclass.class_eval do
    define_method("find_by_#{attribute}") do |value|
      _find_by_attribute(attribute, value)
    end
    define_method("find_first_by_#{attribute}") do |value|
      _find_by_attribute(attribute, value).first
    end
  end
end

#_deserialize(id, data) ⇒ Object



126
127
128
129
130
131
# File 'lib/curator/repository.rb', line 126

def _deserialize(id, data)
  attributes = data.with_indifferent_access
  migrated_attributes = migrator.migrate(attributes)
  migrated_attributes[:id] = id
  deserialize(migrated_attributes)
end

#_find_by_attribute(attribute, value) ⇒ Object



114
115
116
117
118
119
120
# File 'lib/curator/repository.rb', line 114

def _find_by_attribute(attribute, value)
  if results = data_store.find_by_attribute(collection_name, attribute, value)
    results.map do |hash|
      _deserialize(hash[:key], hash[:data])
    end
  end
end

#_format_time_for_index(time) ⇒ Object



133
134
135
# File 'lib/curator/repository.rb', line 133

def _format_time_for_index(time)
  time.to_json.gsub('"', '')
end

#_indexed_fieldsObject



137
138
139
# File 'lib/curator/repository.rb', line 137

def _indexed_fields
  @indexed_fields || []
end

#_indexes(object) ⇒ Object



141
142
143
144
145
146
147
148
149
# File 'lib/curator/repository.rb', line 141

def _indexes(object)
  index_values = _indexed_fields.map { |field| [field, serialize(object)[field.to_sym]] }
  index_values += [
    [:created_at, _format_time_for_index(object.send(:created_at))],
    [:updated_at, _format_time_for_index(object.send(:updated_at))],
    [:version, object.version]
  ]
  Hash[index_values]
end

#_serialize(object) ⇒ Object



151
152
153
# File 'lib/curator/repository.rb', line 151

def _serialize(object)
  serialize(object).reject { |key, val| val.nil? }.merge(:version => object.version)
end

#_update_timestamps(object) ⇒ Object



155
156
157
158
# File 'lib/curator/repository.rb', line 155

def _update_timestamps(object)
  object.updated_at = Time.now.utc
  object.created_at ||= object.updated_at
end

#allObject



11
12
13
14
15
# File 'lib/curator/repository.rb', line 11

def all
  data_store.find_all(collection_name).map do |result|
    _deserialize(result[:key], result[:data])
  end
end

#collection(explicit_collection_name) ⇒ Object



17
18
19
# File 'lib/curator/repository.rb', line 17

def collection(explicit_collection_name)
  @collection_name = explicit_collection_name
end

#collection_nameObject



21
22
23
# File 'lib/curator/repository.rb', line 21

def collection_name
  @collection_name ||= default_collection_name
end

#data_storeObject



29
30
31
# File 'lib/curator/repository.rb', line 29

def data_store
  @data_store ||= Curator.data_store
end

#data_store=(store) ⇒ Object



33
34
35
# File 'lib/curator/repository.rb', line 33

def data_store=(store)
  @data_store = store
end

#default_collection_nameObject



25
26
27
# File 'lib/curator/repository.rb', line 25

def default_collection_name
  ActiveSupport::Inflector.tableize(klass)
end

#delete(object) ⇒ Object



37
38
39
40
# File 'lib/curator/repository.rb', line 37

def delete(object)
  data_store.delete(collection_name, object.id)
  nil
end

#deserialize(attributes) ⇒ Object



122
123
124
# File 'lib/curator/repository.rb', line 122

def deserialize(attributes)
  klass.new(attributes)
end

#find_by_created_at(start_time, end_time) ⇒ Object



42
43
44
# File 'lib/curator/repository.rb', line 42

def find_by_created_at(start_time, end_time)
  _find_by_attribute(:created_at, _format_time_for_index(start_time).._format_time_for_index(end_time))
end

#find_by_id(id) ⇒ Object



54
55
56
57
58
# File 'lib/curator/repository.rb', line 54

def find_by_id(id)
  if hash = data_store.find_by_key(collection_name, id)
    _deserialize(hash[:key], hash[:data])
  end
end

#find_by_updated_at(start_time, end_time) ⇒ Object



46
47
48
# File 'lib/curator/repository.rb', line 46

def find_by_updated_at(start_time, end_time)
  _find_by_attribute(:updated_at, _format_time_for_index(start_time).._format_time_for_index(end_time))
end

#find_by_version(version) ⇒ Object



50
51
52
# File 'lib/curator/repository.rb', line 50

def find_by_version(version)
  _find_by_attribute(:version, version)
end

#indexed_fields(*fields) ⇒ Object



60
61
62
63
64
65
66
# File 'lib/curator/repository.rb', line 60

def indexed_fields(*fields)
  @indexed_fields = fields

  @indexed_fields.each do |field_name|
    _build_finder_methods(field_name)
  end
end

#klassObject



68
69
70
# File 'lib/curator/repository.rb', line 68

def klass
  name.to_s.gsub("Repository", "").constantize
end

#migratorObject



72
73
74
# File 'lib/curator/repository.rb', line 72

def migrator
  @migrator ||= Curator::Migrator.new(collection_name)
end

#save(object) ⇒ Object



76
77
78
79
# File 'lib/curator/repository.rb', line 76

def save(object)
  object.touch
  save_without_timestamps(object)
end

#save_without_timestamps(object) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/curator/repository.rb', line 81

def save_without_timestamps(object)
  hash = {
    :collection_name => collection_name,
    :value => _serialize(object),
    :index => _indexes(object)
  }

  if object.id
    hash[:key] = object.id
    data_store.save(hash)
  else
    object.instance_variable_set("@id", data_store.save(hash))
  end

  object
end

#serialize(object) ⇒ Object



98
99
100
# File 'lib/curator/repository.rb', line 98

def serialize(object)
  HashWithIndifferentAccess.new(object.instance_values)
end