/
mls.rb
163 lines (125 loc) · 3.76 KB
/
mls.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
require 'phony'
require 'sunstone'
require 'arel/extensions'
require 'bcrypt'
module MLS
API_VERSION = '0.1.0'
def request_headers
super
super.merge({
'Api-Version' => API_VERSION
})
end
def self.asset_host
config['asset_host']
end
def self.image_host
config['image_host']
end
def self.config
@config ||= MLS::Model.connection.server_config
end
# Set a cookie jar to use during request sent during the
def self.with_cookie_store(store, &block)
Thread.current[:sunstone_cookie_store] = store
yield
ensure
Thread.current[:sunstone_cookie_store] = nil
end
def self.with_api_key(key, &block)
Thread.current[:sunstone_api_key] = key
yield
ensure
Thread.current[:sunstone_api_key] = nil
end
end
class MLS::Model < ActiveRecord::Base
self.abstract_class = true
end
module MLS::Slugger
extend ActiveSupport::Concern
included do
class_attribute :slugger
send :include, MLS::Slugger::ActiveRecordBaseSluggerExtension
relation.class.send :include, MLS::Slugger::ActiveRecordRelationSluggerExtension
end
module ActiveRecordBaseSluggerExtension
extend ActiveSupport::Concern
# TODO: Test
def to_param
slug? ? slug : super
end
def set_slug
generated_slug = if self.slugger[:proc].is_a?(Proc)
if (self.slugger[:proc].arity == 1)
self.slugger[:proc].call(self)
else
self.slugger[:proc].call
end
else
send(self.slugger[:proc])
end
generated_slug = generated_slug ? generated_slug.split('/').map(&:parameterize).join('/') : nil
if self.slugger[:options][:history]
self.slugger[:slug_was] = self.slug
end
if [:before_validation, :after_validation, :before_save, :before_create].include?(self.slugger[:options][:trigger])
self.slug = generated_slug
else
update_column(:slug, generated_slug) if slug != generated_slug
end
end
module ClassMethods
def slug(method, options={}, &block)
options = options.with_indifferent_access
options[:trigger] ||= :after_save
self.slugger = { :proc => method || block, :options => options }
self.send(options[:trigger], :set_slug)
self.send(:include, Slugger::History) if options[:history]
end
def find(*ids)
friendly = -> (id) { id.respond_to?(:to_i) && id.to_i.to_s != id.to_s }
return super if ids.size > 1 || !ids.all? { |x| friendly.call(x) }
if ids.first.include?("@")
self.filter(email_addresses: {address: ids.first}).first
else
find_by_slug!(ids.first)
end
end
end
end
module ActiveRecordRelationSluggerExtension
def find_one(id)
friendly = id.respond_to?(:to_i) && id.to_i.to_s != id.to_s
friendly ? find_by_slug!(id) : super
end
def find_some(ids)
friendly = -> (id) { id.respond_to?(:to_i) && id.to_i.to_s != id.to_s }
return super if !ids.all? { |x| friendly.call(x) }
result = where(table['slug'].in(ids)).to_a
expected_size =
if limit_value && ids.size > limit_value
limit_value
else
ids.size
end
# 11 ids with limit 3, offset 9 should give 2 results.
if offset_value && (ids.size - offset_value < expected_size)
expected_size = ids.size - offset_value
end
if result.size == expected_size
result
else
raise_record_not_found_exception!(ids, result.size, expected_size)
end
end
end
end
module MLS::Avatar
extend ActiveSupport::Concern
included do
belongs_to :avatar, :class_name => 'Image'
end
end
Dir.glob(File.join(File.dirname(__FILE__), 'mls', '*.rb'), &method(:require))
require 'mls/railtie' if defined?(Rails)