Module: Curator::Repository::ClassMethods

Defined in:
lib/curator/repository.rb

Instance Method Summary collapse

Instance Method Details

#_build_finder_methods(attribute) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/curator/repository.rb', line 96

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



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

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



108
109
110
111
112
113
114
# File 'lib/curator/repository.rb', line 108

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



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

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

#_indexed_fieldsObject



131
132
133
# File 'lib/curator/repository.rb', line 131

def _indexed_fields
  @indexed_fields || []
end

#_indexes(object) ⇒ Object



135
136
137
138
139
140
141
142
143
# File 'lib/curator/repository.rb', line 135

def _indexes(object)
  index_values = _indexed_fields.map { |field| [field, object.send(field)] }
  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



145
146
147
# File 'lib/curator/repository.rb', line 145

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

#_update_timestamps(object) ⇒ Object



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

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

#collection(explicit_collection_name) ⇒ Object



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

def collection(explicit_collection_name)
  @collection_name = explicit_collection_name
end

#collection_nameObject



15
16
17
# File 'lib/curator/repository.rb', line 15

def collection_name
  @collection_name ||= default_collection_name
end

#data_storeObject



23
24
25
# File 'lib/curator/repository.rb', line 23

def data_store
  @data_store ||= Curator.data_store
end

#data_store=(store) ⇒ Object



27
28
29
# File 'lib/curator/repository.rb', line 27

def data_store=(store)
  @data_store = store
end

#default_collection_nameObject



19
20
21
# File 'lib/curator/repository.rb', line 19

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

#delete(object) ⇒ Object



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

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

#deserialize(attributes) ⇒ Object



116
117
118
# File 'lib/curator/repository.rb', line 116

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

#find_by_created_at(start_time, end_time) ⇒ Object



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

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



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

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



40
41
42
# File 'lib/curator/repository.rb', line 40

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



44
45
46
# File 'lib/curator/repository.rb', line 44

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

#indexed_fields(*fields) ⇒ Object



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

def indexed_fields(*fields)
  @indexed_fields = fields

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

#klassObject



62
63
64
# File 'lib/curator/repository.rb', line 62

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

#migratorObject



66
67
68
# File 'lib/curator/repository.rb', line 66

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

#save(object) ⇒ Object



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

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

#save_without_timestamps(object) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/curator/repository.rb', line 75

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



92
93
94
# File 'lib/curator/repository.rb', line 92

def serialize(object)
  object.instance_values
end