Module: Pickle::Session

Defined in:
lib/pickle/session.rb,
lib/pickle/session/parser.rb

Defined Under Namespace

Modules: Parser Classes: ModelNotKnownError

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(world_object) ⇒ Object



22
23
24
# File 'lib/pickle/session.rb', line 22

def extended(world_object)
  proxy_to_pickle_parser(class << world_object; self; end) # metaclass is not 2.1 compatible
end

.included(world_class) ⇒ Object



18
19
20
# File 'lib/pickle/session.rb', line 18

def included(world_class)
  proxy_to_pickle_parser(world_class)
end

Instance Method Details

#create_model(pickle_ref, fields = nil) ⇒ Object

Raises:

  • (ArgumentError)


37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/pickle/session.rb', line 37

def create_model(pickle_ref, fields = nil)
  factory, label = *parse_model(pickle_ref)
  raise ArgumentError, "Can't create with an ordinal (e.g. 1st user)" if label.is_a?(Integer)
  fields = fields.is_a?(Hash) ? parse_hash(fields) : parse_fields(fields)
  fields = fields.inject({}) do |hash, (key, value)|
    value = value.is_a?(Array) ? value.reject(&:empty?).map{ |name| model(name) }  : value
    hash.merge({ key => value })
  end
  record = pickle_config.factories[factory].create(fields)
  store_model(factory, label, record)
  record
end

#create_models_from_table(plural_factory, table) ⇒ Object

if a column exists in the table which matches the singular factory name, this is used as the pickle ref



51
52
53
54
55
56
57
# File 'lib/pickle/session.rb', line 51

def create_models_from_table(plural_factory, table)
  factory = plural_factory.singularize
  table.hashes.map do |hash|
    pickle_ref = factory + (hash[factory] ? " \"#{hash.delete(factory)}\"" : "")
    create_model(pickle_ref, hash)
  end
end

#created_model(name) ⇒ Object

return the original model stored by create_model or find_model



100
101
102
103
104
105
106
107
108
109
110
# File 'lib/pickle/session.rb', line 100

def created_model(name)
  factory, name_or_index = *parse_model(name)

  if name_or_index.blank?
    models_by_index(factory).last
  elsif name_or_index.is_a?(Integer)
    models_by_index(factory)[name_or_index]
  else
    models_by_name(factory)[name_or_index] or raise ModelNotKnownError, name
  end
end

#created_model!(name) ⇒ Object

like created_model, but raise an error if it can’t be found



135
136
137
# File 'lib/pickle/session.rb', line 135

def created_model!(name)
  created_model(name) or raise ModelNotKnownError, name
end

#created_model?(name) ⇒ Boolean

predicate version which raises no errors

Returns:

  • (Boolean)


113
114
115
# File 'lib/pickle/session.rb', line 113

def created_model?(name)
  (created_model(name) rescue nil) ? true : false
end

#created_models(factory) ⇒ Object

return all original models of specified type



140
141
142
# File 'lib/pickle/session.rb', line 140

def created_models(factory)
  models_by_index(factory)
end

#find_model(a_model_name, fields = nil) ⇒ Object

Raises:

  • (ArgumentError)


59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/pickle/session.rb', line 59

def find_model(a_model_name, fields = nil)
  factory, name = *parse_model(a_model_name)

  raise ArgumentError, "Can't find a model with an ordinal (e.g. 1st user)" if name.is_a?(Integer)

  model_class = pickle_config.factories[factory].klass
  fields      = fields.is_a?(Hash) ? parse_hash(fields) : parse_fields(fields)
  conditions  = convert_models_to_attributes(model_class, fields)
  record      = Pickle::Adapter.find_first_model(model_class, conditions)

  store_model(factory, name, record) if record

  record
end

#find_model!(name, fields = nil) ⇒ Object



74
75
76
# File 'lib/pickle/session.rb', line 74

def find_model!(name, fields = nil)
  find_model(name, fields) or raise ModelNotKnownError, name
end

#find_models(factory, fields = nil) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/pickle/session.rb', line 78

def find_models(factory, fields = nil)
  factory = pickle_parser.canonical(factory)
  
  models_by_index(factory).clear

  model_class = pickle_config.factories[factory].klass
  conditions  = convert_models_to_attributes(model_class, parse_fields(fields))
  records     = Pickle::Adapter.find_all_models(model_class, conditions)

  records.each {|record| store_model(factory, nil, record)}
end

#find_models_from_table(plural_factory, table) ⇒ Object

if a column exists in the table which matches the singular factory name, this is used as the pickle ref



91
92
93
94
95
96
97
# File 'lib/pickle/session.rb', line 91

def find_models_from_table(plural_factory, table)
  factory = plural_factory.singularize
  table.hashes.map do |hash|
    pickle_ref = factory + (hash[factory] ? " \"#{hash.delete(factory)}\"" : "")
    find_model(pickle_ref, hash)
  end
end

#model(name) ⇒ Object

return a newly selected model



118
119
120
121
122
# File 'lib/pickle/session.rb', line 118

def model(name)
  model = created_model(name)
  return nil unless model
  Pickle::Adapter.get_model(model.class, model.id)
end

#model!(name) ⇒ Object

like model, but raise an error if it can’t be found



130
131
132
# File 'lib/pickle/session.rb', line 130

def model!(name)
  model(name) or raise ModelNotKnownError, name
end

#model?(name) ⇒ Boolean

predicate version which raises no errors

Returns:

  • (Boolean)


125
126
127
# File 'lib/pickle/session.rb', line 125

def model?(name)
  (model(name) rescue nil) ? true : false
end

#models(factory) ⇒ Object

return all models of specified type (freshly selected from the database)



145
146
147
148
149
# File 'lib/pickle/session.rb', line 145

def models(factory)
  created_models(factory).map do |model|
    Pickle::Adapter.get_model(model.class, model.id)
  end
end

#respond_to_with_pickle_parser?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


151
152
153
# File 'lib/pickle/session.rb', line 151

def respond_to_with_pickle_parser?(method, include_private = false)
  respond_to_without_pickle_parser?(method, include_private) || pickle_parser.respond_to?(method, include_private)
end