soft_attributes 0.0.2

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.
@@ -0,0 +1,53 @@
1
+ .rvmrc
2
+ *.gem
3
+ db/*.sqlite3
4
+
5
+ # rcov generated
6
+ coverage
7
+
8
+ # rdoc generated
9
+ rdoc
10
+
11
+ # yard generated
12
+ doc
13
+ .yardoc
14
+
15
+ # bundler
16
+ .bundle
17
+
18
+ # jeweler generated
19
+ pkg
20
+
21
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
22
+ #
23
+ # * Create a file at ~/.gitignore
24
+ # * Include files you want ignored
25
+ # * Run: git config --global core.excludesfile ~/.gitignore
26
+ #
27
+ # After doing this, these files will be ignored in all your git projects,
28
+ # saving you from having to 'pollute' every project you touch with them
29
+ #
30
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
31
+ #
32
+ # For MacOS:
33
+ #
34
+ #.DS_Store
35
+
36
+ # For TextMate
37
+ #*.tmproj
38
+ #tmtags
39
+
40
+ # For emacs:
41
+ #*~
42
+ #\#*
43
+ #.\#*
44
+
45
+ # For vim:
46
+ #*.swp
47
+
48
+ # For redcar:
49
+ #.redcar
50
+
51
+ # For rubinius:
52
+ #*.rbc
53
+ .rvmrc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in soft_attributes.gemspec
4
+ gemspec
@@ -0,0 +1,62 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ soft_attributes (0.0.1)
5
+ activerecord (>= 2.1.0, < 3.1.0)
6
+ activeresource (>= 2.1.0, < 3.1.0)
7
+ activesupport (>= 2.1.0, < 3.1.0)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ activemodel (3.0.10)
13
+ activesupport (= 3.0.10)
14
+ builder (~> 2.1.2)
15
+ i18n (~> 0.5.0)
16
+ activerecord (3.0.10)
17
+ activemodel (= 3.0.10)
18
+ activesupport (= 3.0.10)
19
+ arel (~> 2.0.10)
20
+ tzinfo (~> 0.3.23)
21
+ activeresource (3.0.10)
22
+ activemodel (= 3.0.10)
23
+ activesupport (= 3.0.10)
24
+ activesupport (3.0.10)
25
+ arel (2.0.10)
26
+ builder (2.1.2)
27
+ diff-lcs (1.1.3)
28
+ i18n (0.5.0)
29
+ metaclass (0.0.1)
30
+ mocha (0.10.0)
31
+ metaclass (~> 0.0.1)
32
+ nokogiri (1.5.0)
33
+ rack (1.2.3)
34
+ rack-test (0.5.7)
35
+ rack (>= 1.0)
36
+ rspec (2.6.0)
37
+ rspec-core (~> 2.6.0)
38
+ rspec-expectations (~> 2.6.0)
39
+ rspec-mocks (~> 2.6.0)
40
+ rspec-core (2.6.4)
41
+ rspec-expectations (2.6.0)
42
+ diff-lcs (~> 1.1.2)
43
+ rspec-mocks (2.6.0)
44
+ sqlite3 (1.3.4)
45
+ sqlite3-ruby (1.3.3)
46
+ sqlite3 (>= 1.3.3)
47
+ tzinfo (0.3.29)
48
+ webrat (0.7.3)
49
+ nokogiri (>= 1.2.0)
50
+ rack (>= 1.0)
51
+ rack-test (>= 0.5.3)
52
+
53
+ PLATFORMS
54
+ ruby
55
+
56
+ DEPENDENCIES
57
+ mocha
58
+ nokogiri
59
+ rspec (~> 2.6.0)
60
+ soft_attributes!
61
+ sqlite3-ruby (~> 1.3.3)
62
+ webrat
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Vijay Aravamudhan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,55 @@
1
+ = SoftAttributes
2
+
3
+ Calculated fields are usually not stored in the database. But, in many cases, you would want to
4
+ treat them just like attributes - serializing them into the xml/json representation, discarding them
5
+ if they appear on the incoming xml/json payloads, lazily initializing them (in case you are loading
6
+ them from an expensive ActiveResource call), etc. You will also want to access them by either methods
7
+ or [] notation.
8
+
9
+ == GOALS
10
+
11
+ The major distinguishing features of SoftAttributes are:
12
+
13
+ * To not pollute the attributes hash by putting non-persisted variables in them.
14
+ * But at the same time, to maintain a list of attributes that can get accessed.
15
+ * These attributes could be lazily loaded (and cached in the instance, once they
16
+ are retrieved - to avoid multiple ActiveResource calls)
17
+ * To provide an easy way to inject them into the xml/json payload as needed.
18
+
19
+ == EXAMPLE
20
+
21
+ class Foo
22
+ #will define a setter method that ignores the param
23
+ noop_setter :bar
24
+ end
25
+
26
+ == API DOCUMENTATION
27
+
28
+ == CONTRIBUTORS
29
+
30
+ * {Vijay Aravamudhan}[http://github.com/vraravam]
31
+
32
+ == LICENSE
33
+
34
+ (The MIT License)
35
+
36
+ Copyright (c) 2010 Vijay Aravamudhan
37
+
38
+ Permission is hereby granted, free of charge, to any person obtaining
39
+ a copy of this software and associated documentation files (the
40
+ 'Software'), to deal in the Software without restriction, including
41
+ without limitation the rights to use, copy, modify, merge, publish,
42
+ distribute, sublicense, and/or sell copies of the Software, and to
43
+ permit persons to whom the Software is furnished to do so, subject to
44
+ the following conditions:
45
+
46
+ The above copyright notice and this permission notice shall be
47
+ included in all copies or substantial portions of the Software.
48
+
49
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
50
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
51
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
52
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
53
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
54
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
55
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
File without changes
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'soft_attributes'
@@ -0,0 +1,6 @@
1
+ require 'soft_attributes/base'
2
+ require 'soft_attributes/noop_setter'
3
+ require 'soft_attributes/serialization'
4
+
5
+ module SoftAttributes
6
+ end
@@ -0,0 +1,85 @@
1
+ module SoftAttributes
2
+ module Base
3
+ def self.included(base)
4
+ base.class_eval do
5
+ def to_xml_with_soft_attributes(opts={})
6
+ attributes_to_include = self.soft_attributes.clone.with_indifferent_access.collect do |k, v|
7
+ include_in_xml = v[:include_in_xml]
8
+ if include_in_xml.present?
9
+ k if (include_in_xml.is_a?(Proc) ? include_in_xml.call(self) : include_in_xml == true)
10
+ end
11
+ end.compact
12
+ to_xml_without_soft_attributes(opts) do |xml|
13
+ attributes_to_include.each do |attr|
14
+ xml.tag!(attr, self.send(attr))
15
+ end
16
+ end
17
+ end
18
+ alias_method_chain :to_xml, :soft_attributes
19
+
20
+ # TODO: Should we support to_json here?
21
+
22
+ extend SoftAttributes::Base::ClassMethods
23
+ include SoftAttributes::Base::InstanceMethods
24
+ end
25
+ end
26
+
27
+ module ClassMethods
28
+ def soft_attribute(*args)
29
+ options = args.extract_options!
30
+ attr = args.first
31
+ options.assert_valid_keys(:include_in_xml, :value)
32
+
33
+ __send__(:noop_setter, attr)
34
+ soft_attributes[attr.to_s] = options.slice(:include_in_xml, :value)
35
+ end
36
+
37
+ def soft_attributes
38
+ read_inheritable_attribute(:soft_attributes) || write_inheritable_hash(:soft_attributes, {})
39
+ end
40
+ end
41
+
42
+ module InstanceMethods
43
+ def soft_attributes
44
+ @soft_attributes ||= self.class.soft_attributes.clone
45
+ @soft_attributes.stringify_keys!
46
+ @soft_attributes
47
+ end
48
+
49
+ def soft_attributes=(new_value)
50
+ soft_attributes.merge!(new_value)
51
+ soft_attributes # return the merged hash
52
+ end
53
+
54
+ def respond_to?(method_symbol, include_private = false) #:nodoc:
55
+ attr_name = extract_attr_name_without_equals(method_symbol)
56
+ self.soft_attributes.has_key?(attr_name) || super
57
+ end
58
+
59
+ private
60
+ def method_missing(method_symbol, *parameters) #:nodoc:
61
+ if respond_to?(method_symbol) && !method_symbol.to_s.end_with?("=") #getter
62
+ attr_name = extract_attr_name_without_equals(method_symbol)
63
+ if self.soft_attributes.has_key?(attr_name)
64
+ value = self.soft_attributes[attr_name][:value]
65
+ return value.is_a?(Proc) ? value.call(self) : value
66
+ end
67
+ end
68
+ super
69
+ end
70
+
71
+ def extract_attr_name_without_equals(method_symbol) #:nodoc:
72
+ str = method_symbol.to_s
73
+ attr_name = str.end_with?("=") ? str.chop : str
74
+ attr_name.slice!(0) if attr_name.start_with?("_") # Rails 3 compatibility
75
+ attr_name
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ # TODO: maybe we could send this on ActiveModel?
82
+ require 'active_record'
83
+ require 'active_resource'
84
+ ActiveRecord::Base.send(:include, SoftAttributes::Base)
85
+ ActiveResource::Base.send(:include, SoftAttributes::Base)
@@ -0,0 +1,21 @@
1
+ module SoftAttributes
2
+ module NoopSetter
3
+ def self.included(mod)
4
+ mod.module_eval do
5
+ class << self
6
+ def noop_setter(*attrs)
7
+ attrs.flatten.each do |attr|
8
+ send(:define_method, "#{attr}=") {|ignore|}
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ # TODO: maybe we could send this on ActiveSupport
18
+ require 'active_record'
19
+ require 'active_resource'
20
+ ActiveRecord::Base.send(:include, SoftAttributes::NoopSetter)
21
+ ActiveResource::Base.send(:include, SoftAttributes::NoopSetter)
@@ -0,0 +1,28 @@
1
+ module SoftAttributes
2
+ module Serialization
3
+ def self.included(base)
4
+ base.class_eval do
5
+ def serializable_hash_with_soft_attributes(opts={}) #:nodoc:
6
+ attributes_to_include = self.soft_attributes.clone.with_indifferent_access.collect do |k, v|
7
+ include_in_xml = v[:include_in_xml]
8
+ if include_in_xml.present?
9
+ k if (include_in_xml.is_a?(Proc) ? include_in_xml.call(self) : include_in_xml == true)
10
+ end
11
+ end.compact
12
+ hash = attributes_to_include.inject({}) do |hash, attr|
13
+ hash[attr] = self.send(attr)
14
+ hash
15
+ end
16
+ serializable_hash_without_soft_attributes.merge(hash)
17
+ end
18
+ alias_method_chain :serializable_hash, :soft_attributes
19
+ end
20
+ end
21
+ end
22
+ end
23
+
24
+ if defined?(Rails) && Rails::VERSION::MAJOR >= 3
25
+ require 'active_model/serialization'
26
+
27
+ ActiveModel::Serialization.send(:include, SoftAttributes::Serialization)
28
+ end
@@ -0,0 +1,3 @@
1
+ module SoftAttributes
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "soft_attributes/version"
4
+
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = 'soft_attributes'
8
+ s.summary = 'A library for ensuring that calculated attributes are initialized lazily and serialized/de-serialized correctly.'
9
+ s.version = SoftAttributes::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.description = <<-EOS
12
+ SoftAttributes provides a consistent way to define "soft" attributes on ActiveSupport.
13
+ Typically calculated (non-persisted) attributes would be termed soft attributes.
14
+ These will be included in the xml/json payload for serialization, but will need to be discarded
15
+ if they appear in the incoming request.
16
+ EOS
17
+
18
+ s.authors = ['Vijay Aravamudhan']
19
+ s.email = ['avijayr@gmail.com']
20
+ s.homepage = 'http://github.com/vraravam/soft_attributes'
21
+ s.rubyforge_project = "soft_attributes"
22
+ s.has_rdoc = true
23
+
24
+ s.files = `git ls-files`.split("\n")
25
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
26
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
27
+ s.require_paths = ["lib"]
28
+
29
+ s.add_runtime_dependency 'activesupport', '>= 2.1.0', '< 3.1.0'
30
+ s.add_runtime_dependency 'activerecord', '>= 2.1.0', '< 3.1.0'
31
+ s.add_runtime_dependency 'activeresource', '>= 2.1.0', '< 3.1.0'
32
+
33
+ s.add_development_dependency 'sqlite3-ruby', '~> 1.3.3'
34
+ s.add_development_dependency 'rspec', '~>2.6.0'
35
+ # s.add_development_dependency 'rspec-rails', '~>2.6.0'
36
+ s.add_development_dependency 'mocha'
37
+ s.add_development_dependency 'webrat'
38
+ s.add_development_dependency 'nokogiri'
39
+ end
@@ -0,0 +1,123 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ class Foo < ActiveRecord::Base
4
+ soft_attribute :vijay, :include_in_xml => Proc.new{ |r| r.application =~ /vij/i }, :value => Proc.new{ |r| "#{r.name} : #{r.application}" }
5
+ soft_attribute :sujay, :include_in_xml => Proc.new{ |r| r.application =~ /jay/i }, :value => Proc.new{ |r| "#{r.application} : #{r.name}" }
6
+ soft_attribute :mythili, :include_in_xml => false, :value => Proc.new{ |r| "blah" } # eg of non-Proc - evaluating always to false for xml
7
+ soft_attribute :aravamudhan, :include_in_xml => true, :value => Proc.new{ |r| "kannan" } # eg of non-Proc - evaluating always to true for xml
8
+ soft_attribute :rakshita, :value => "child"
9
+
10
+ def to_xml(opts={})
11
+ super(opts) do |xml|
12
+ xml.tag!(:krishna, "some other random stuff to test when blocks are present")
13
+ end
14
+ end
15
+ end
16
+
17
+ class Ping < ActiveRecord::Base
18
+ soft_attribute :krishna, :value => "sis"
19
+ end
20
+
21
+ describe SoftAttributes::Base do
22
+ before(:all) do
23
+ connection = ActiveRecord::Base.connection
24
+ begin
25
+ connection.create_table(:foos) do |t|
26
+ t.string :name
27
+ t.string :application
28
+ end
29
+
30
+ connection.create_table(:pings) do |t|
31
+ t.string :name
32
+ end
33
+ rescue Exception => e
34
+ RAILS_DEFAULT_LOGGER.warn "Error in before(:each): #{e}" if defined?(RAILS_DEFAULT_LOGGER)
35
+ end
36
+ end
37
+
38
+ after(:all) do
39
+ begin
40
+ connection = ActiveRecord::Base.connection
41
+ connection.drop_table(Foo.table_name)
42
+ connection.drop_table(Ping.table_name)
43
+ rescue Exception => e
44
+ RAILS_DEFAULT_LOGGER.warn "Error in after(:each): #{e}" if defined?(RAILS_DEFAULT_LOGGER)
45
+ end
46
+ end
47
+
48
+ it "should define noop setters for a single attribute" do
49
+ foo = Foo.new
50
+ foo.respond_to?("vijay=").should be_true
51
+ end
52
+
53
+ it "should raise an error if unknown attributes are passed" do
54
+ lambda {
55
+ Foo.send(:soft_attribute, :john, :invalid_key1 => "some value 1", :invalid_key2 => "some value 2")
56
+ }.should raise_error(ArgumentError) do |e|
57
+ e.message.should match(/^Unknown key(s): /)
58
+ e.message.should include("invalid_key1")
59
+ e.message.should include("invalid_key2")
60
+ end
61
+ end
62
+
63
+ it "should invoke the provided getter method" do
64
+ foo = Foo.new
65
+ foo.name = "my name"
66
+ foo.application = 'testing soft_attributes'
67
+ foo.vijay.should == "my name : testing soft_attributes"
68
+ end
69
+
70
+ it "should discard the value from the setter and re-evaluate the getter" do
71
+ foo = Foo.new
72
+ foo.name = "my name"
73
+ foo.application = 'testing soft_attributes'
74
+ foo.vijay = "discarded value"
75
+ foo.vijay.should == "my name : testing soft_attributes"
76
+ end
77
+
78
+ it "should not need a Proc for the value" do
79
+ foo = Foo.new
80
+ foo.rakshita.should == "child"
81
+ end
82
+
83
+ it "should not pollute the attributes from one instance with another" do
84
+ f1 = Foo.new
85
+ f2 = Foo.new
86
+ f1.soft_attributes.object_id.should_not == f2.soft_attributes.object_id
87
+ f1.soft_attributes.merge!({:a => "b"})
88
+ f3 = Foo.new
89
+ f3.soft_attributes.should_not have_key(:a)
90
+ end
91
+
92
+ it "should not pollute the attributes from a different class" do
93
+ Foo.soft_attributes.should_not == Ping.soft_attributes
94
+ Foo.new.soft_attributes.should_not == Ping.new.soft_attributes
95
+ end
96
+
97
+ describe "to_xml" do
98
+ it "should include all attributes that evaluate to true with both attributes using Procs evaluating to true" do
99
+ foo = Foo.new(:name => "rakshita", :application => "vijay's demo")
100
+ xml = foo.to_xml
101
+ xml.should have_tag("name", :content => foo.name)
102
+ xml.should have_tag("vijay", :content => "#{foo.name} : #{foo.application}")
103
+ xml.should have_tag("sujay", :content => "#{foo.application} : #{foo.name}")
104
+ xml.should_not have_tag("mythili")
105
+ xml.should have_tag("aravamudhan", :content => "kannan")
106
+ end
107
+
108
+ it "should include all attributes (including the ones which do not use Procs)" do
109
+ foo = Foo.new(:name => "rakshita", :application => "vijay's demo")
110
+ xml = foo.to_xml
111
+ xml.should have_tag("aravamudhan", :content => "kannan")
112
+ end
113
+
114
+ it "should never include any attributes that evaluate to false" do
115
+ foo = Foo.new(:name => "rakshita", :application => "vij's demo")
116
+ xml = foo.to_xml
117
+ xml.should have_tag("name", :content => foo.name)
118
+ xml.should have_tag("vijay", :content => "#{foo.name} : #{foo.application}")
119
+ xml.should_not have_tag("sujay")
120
+ xml.should_not have_tag("mythili")
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ class Bar
4
+ include SoftAttributes::NoopSetter
5
+
6
+ noop_setter :foo
7
+ noop_setter :bar, :baz
8
+ end
9
+
10
+ describe SoftAttributes::NoopSetter do
11
+ it "should define noop setters for a single attribute" do
12
+ ["foo=", "bar=", "baz="].each do |method|
13
+ Bar.public_instance_methods.include?(method.to_sym).should be_true
14
+ end
15
+ end
16
+
17
+ it "should accept parameters for the generated setter methods" do
18
+ f = Bar.new
19
+ lambda {
20
+ f.foo = "qwerty"
21
+ f.bar = "asdfg"
22
+ f.baz = "zxcvb"
23
+ }.should_not raise_error
24
+ end
25
+ end
@@ -0,0 +1,57 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ load 'soft_attributes/serialization.rb'
3
+
4
+ class Pong < ActiveRecord::Base
5
+ soft_attribute :krishna, :value => "sis"
6
+ soft_attribute :anand, :value => "bil", :include_in_xml => true
7
+ soft_attribute :dittu, :value => "nep", :include_in_xml => Proc.new{ |r| r.name.nil? }
8
+ end
9
+
10
+ describe SoftAttributes::Serialization do
11
+ before(:all) do
12
+ require 'active_model/serialization'
13
+
14
+ ActiveModel::Serialization.send(:include, SoftAttributes::Serialization)
15
+
16
+ connection = ActiveRecord::Base.connection
17
+ begin
18
+ connection.create_table(:pongs) do |t|
19
+ t.string :name
20
+ t.string :application
21
+ end
22
+ rescue Exception => e
23
+ RAILS_DEFAULT_LOGGER.warn "Error in before(:each): #{e}" if defined?(RAILS_DEFAULT_LOGGER)
24
+ end
25
+ end
26
+
27
+ after(:all) do
28
+ begin
29
+ connection = ActiveRecord::Base.connection
30
+ connection.drop_table(Pong.table_name)
31
+ rescue Exception => e
32
+ RAILS_DEFAULT_LOGGER.warn "Error in after(:each): #{e}" if defined?(RAILS_DEFAULT_LOGGER)
33
+ end
34
+ end
35
+
36
+ it "should define a method called serializable_hash_with_soft_attributes" do
37
+ Pong.new.public_methods.include?(:serializable_hash_with_soft_attributes).should be_true
38
+ end
39
+
40
+ it "should not include a soft attribute that does not have the 'include_in_xml' key" do
41
+ record = Pong.new
42
+ record.serializable_hash.should_not have_key("krishna")
43
+ end
44
+
45
+ it "should include a soft attribute that does have the 'include_in_xml' key with a value of true" do
46
+ record = Pong.new
47
+ record.serializable_hash.should have_key("anand")
48
+ end
49
+
50
+ it "should include a soft attribute that does have the 'include_in_xml' key that evaluates to true from a Proc" do
51
+ record = Pong.new
52
+ record.serializable_hash.should have_key("dittu")
53
+
54
+ record = Pong.new(:name => "some non nil")
55
+ record.serializable_hash.should_not have_key("dittu")
56
+ end
57
+ end
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --backtrace
@@ -0,0 +1,49 @@
1
+ # This file is copied to ~/spec when you run 'ruby script/generate rspec'
2
+ # from the project root directory.
3
+ ENV["RAILS_ENV"] = "test"
4
+
5
+ require 'rubygems'
6
+ require 'bundler/setup'
7
+ require 'mocha'
8
+ require "nokogiri"
9
+ require "webrat/core/matchers/have_tag"
10
+ require 'soft_attributes'
11
+
12
+ RSpec.configure do |config|
13
+ config.mock_with :mocha
14
+ config.include(Webrat::Matchers)
15
+ config.include(Webrat::HaveTagMatcher)
16
+ include Webrat::HaveTagMatcher
17
+
18
+ config.before(:all) do
19
+ `touch db/test.sqlite3`
20
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :encoding => "utf8", :database => "db/test.sqlite3")
21
+
22
+ ActiveRecord::Base.connection.create_table :soft_attributes_items, :force => true do |t|
23
+ t.string :name
24
+ t.timestamps
25
+ end
26
+ end
27
+
28
+ config.after(:all) do
29
+ ActiveRecord::Base.connection.drop_table :soft_attributes_items
30
+ `rm -f db/test.sqlite3`
31
+ end
32
+
33
+ config.before(:each) do
34
+ class SoftAttributesItem < ActiveRecord::Base
35
+ end
36
+ end
37
+
38
+ config.after(:each) do
39
+ Object.send(:remove_const, :SoftAttributesItem)
40
+ end
41
+ end
42
+
43
+ def putsh(stuff)
44
+ puts "#{ERB::Util.h(stuff)}<br/>"
45
+ end
46
+
47
+ def ph(stuff)
48
+ putsh stuff.inspect
49
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: soft_attributes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Vijay Aravamudhan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-10 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &2165585100 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.1.0
22
+ - - <
23
+ - !ruby/object:Gem::Version
24
+ version: 3.1.0
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: *2165585100
28
+ - !ruby/object:Gem::Dependency
29
+ name: activerecord
30
+ requirement: &2165584100 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: 2.1.0
36
+ - - <
37
+ - !ruby/object:Gem::Version
38
+ version: 3.1.0
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: *2165584100
42
+ - !ruby/object:Gem::Dependency
43
+ name: activeresource
44
+ requirement: &2165580340 !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: 2.1.0
50
+ - - <
51
+ - !ruby/object:Gem::Version
52
+ version: 3.1.0
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: *2165580340
56
+ - !ruby/object:Gem::Dependency
57
+ name: sqlite3-ruby
58
+ requirement: &2165579460 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: 1.3.3
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: *2165579460
67
+ - !ruby/object:Gem::Dependency
68
+ name: rspec
69
+ requirement: &2165578900 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ version: 2.6.0
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: *2165578900
78
+ - !ruby/object:Gem::Dependency
79
+ name: mocha
80
+ requirement: &2165578300 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: *2165578300
89
+ - !ruby/object:Gem::Dependency
90
+ name: webrat
91
+ requirement: &2165577320 !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: *2165577320
100
+ - !ruby/object:Gem::Dependency
101
+ name: nokogiri
102
+ requirement: &2165576900 !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: *2165576900
111
+ description: ! " SoftAttributes provides a consistent way to define \"soft\" attributes
112
+ on ActiveSupport.\n Typically calculated (non-persisted) attributes would be
113
+ termed soft attributes.\n These will be included in the xml/json payload for
114
+ serialization, but will need to be discarded\n if they appear in the incoming
115
+ request.\n"
116
+ email:
117
+ - avijayr@gmail.com
118
+ executables: []
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - .gitignore
123
+ - Gemfile
124
+ - Gemfile.lock
125
+ - MIT-LICENSE
126
+ - README.rdoc
127
+ - Rakefile
128
+ - db/.gitkeep
129
+ - init.rb
130
+ - lib/soft_attributes.rb
131
+ - lib/soft_attributes/base.rb
132
+ - lib/soft_attributes/noop_setter.rb
133
+ - lib/soft_attributes/serialization.rb
134
+ - lib/soft_attributes/version.rb
135
+ - soft_attributes.gemspec
136
+ - spec/soft_attributes/base_spec.rb
137
+ - spec/soft_attributes/noop_setter_spec.rb
138
+ - spec/soft_attributes/serialization_spec.rb
139
+ - spec/spec.opts
140
+ - spec/spec_helper.rb
141
+ homepage: http://github.com/vraravam/soft_attributes
142
+ licenses: []
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ none: false
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubyforge_project: soft_attributes
161
+ rubygems_version: 1.8.10
162
+ signing_key:
163
+ specification_version: 3
164
+ summary: A library for ensuring that calculated attributes are initialized lazily
165
+ and serialized/de-serialized correctly.
166
+ test_files:
167
+ - spec/soft_attributes/base_spec.rb
168
+ - spec/soft_attributes/noop_setter_spec.rb
169
+ - spec/soft_attributes/serialization_spec.rb
170
+ - spec/spec.opts
171
+ - spec/spec_helper.rb