preferable 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/preferable.rb CHANGED
@@ -3,6 +3,7 @@ require "active_record"
3
3
 
4
4
  module Preferable
5
5
  autoload :Model, "preferable/model"
6
+ autoload :Coder, "preferable/coder"
6
7
  autoload :Schema, "preferable/schema"
7
8
  autoload :Field, "preferable/field"
8
9
  autoload :Set, "preferable/set"
@@ -0,0 +1,29 @@
1
+ class Preferable::Coder
2
+
3
+ def dump(obj)
4
+ ActiveSupport::JSON.encode(obj) if obj.is_a?(Hash) && obj.present?
5
+ end
6
+
7
+ def load(string)
8
+ return {} if string.blank?
9
+ return string if string.is_a?(Hash)
10
+ return legacy_load(string) if string.is_a?(String) && string =~ /^---/
11
+
12
+ begin
13
+ obj = ActiveSupport::JSON.decode(string) || {}
14
+ raise ActiveRecord::SerializationTypeMismatch, "Attribute was supposed to be a Hash, but was a #{obj.class}" unless obj.is_a?(Hash)
15
+ obj
16
+ rescue MultiJson::DecodeError
17
+ {}
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def legacy_load(yaml)
24
+ lines = yaml.lines.to_a
25
+ lines.shift
26
+ YAML.load ["---", *lines].join("\n")
27
+ end
28
+
29
+ end
@@ -26,7 +26,7 @@ class Preferable::Field
26
26
  def initialize(name, type, options = {})
27
27
  raise ArgumentError, "Unknown type '#{type}', available types are: #{TYPES.map(&:to_s).join(', ')}" unless TYPES.include?(type.to_sym)
28
28
 
29
- @name = name.to_sym
29
+ @name = name.to_s
30
30
  @type = type.to_sym
31
31
  @options = options.dup
32
32
  @default = type_cast @options.delete(:default)
@@ -21,13 +21,12 @@ module Preferable::Model
21
21
  # end
22
22
  #
23
23
  def preferable(&block)
24
- unless _preferable
25
- self._preferable = Preferable::Schema.new
26
- serialize :preferences
27
- include PreferableMethods
28
- end
29
- self._preferable.instance_eval(&block) if block
30
- self._preferable
24
+ serialize :preferences, Preferable::Coder.new
25
+ include PreferableMethods
26
+
27
+ self._preferable = self._preferable.dup if self._preferable
28
+ self._preferable ||= Preferable::Schema.new
29
+ self._preferable.instance_eval(&block)
31
30
  end
32
31
 
33
32
  end
@@ -41,8 +40,7 @@ module Preferable::Model
41
40
  # user.preferences[:theme_id] = 3
42
41
  #
43
42
  def preferences
44
- value = read_attribute(:preferences)
45
- value.is_a?(Preferable::Set) ? value : write_attribute(:preferences, Preferable::Set.new(self.class.name))
43
+ @preferences ||= Preferable::Set.wrap(self, super)
46
44
  end
47
45
 
48
46
  # Preferences writer. Updates existing preferences (doesn't replace them!)
@@ -1,5 +1,4 @@
1
1
  class Preferable::Set < Hash
2
- MODEL_KEY = "_".freeze
3
2
  PRIVATE = [:rehash, :fetch, :store, :shift, :delete, :delete_if, :keep_if].to_set.freeze
4
3
 
5
4
  # Make destructive methods private
@@ -7,13 +6,15 @@ class Preferable::Set < Hash
7
6
  PRIVATE.include?(m.to_sym) || m.to_s.ends_with?('!')
8
7
  end
9
8
 
10
- def initialize(model_name)
11
- super()
12
- store MODEL_KEY, "::#{model_name}"
9
+ def self.wrap(owner, value)
10
+ new(owner).set(value || {})
13
11
  end
14
12
 
15
- def model
16
- @model ||= fetch(MODEL_KEY).constantize
13
+ attr_reader :owner
14
+
15
+ def initialize(owner)
16
+ super()
17
+ @owner = owner
17
18
  end
18
19
 
19
20
  def [](name)
@@ -30,6 +31,7 @@ class Preferable::Set < Hash
30
31
  else
31
32
  super field.name, value
32
33
  end
34
+ owner.send :write_attribute, :preferences, to_hash
33
35
  end
34
36
 
35
37
  def set(pairs)
@@ -37,10 +39,14 @@ class Preferable::Set < Hash
37
39
  self
38
40
  end
39
41
 
42
+ def to_hash
43
+ {}.update(self)
44
+ end
45
+
40
46
  private
41
47
 
42
48
  def find_field(name)
43
- model.preferable[name.to_sym]
49
+ owner.class._preferable[name.to_s] if owner
44
50
  end
45
51
 
46
52
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: preferable
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 2
8
+ - 4
9
9
  - 0
10
- version: 0.2.0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dimitrij Denissenko
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-09-01 00:00:00 Z
19
+ date: 2011-09-30 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: abstract
@@ -38,22 +38,14 @@ dependencies:
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
- - - ">="
41
+ - - ~>
42
42
  - !ruby/object:Gem::Version
43
- hash: 7
44
- segments:
45
- - 3
46
- - 0
47
- - 0
48
- version: 3.0.0
49
- - - <
50
- - !ruby/object:Gem::Version
51
- hash: 15
43
+ hash: 3
52
44
  segments:
53
45
  - 3
54
- - 2
46
+ - 1
55
47
  - 0
56
- version: 3.2.0
48
+ version: 3.1.0
57
49
  type: :runtime
58
50
  version_requirements: *id002
59
51
  description: Great for storing user preferences
@@ -71,6 +63,7 @@ files:
71
63
  - lib/preferable/model.rb
72
64
  - lib/preferable/set.rb
73
65
  - lib/preferable/schema.rb
66
+ - lib/preferable/coder.rb
74
67
  homepage: https://github.com/bsm/preferable
75
68
  licenses: []
76
69