tracks-attributes 1.0.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/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2013 YOURNAME
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.
data/README.md ADDED
@@ -0,0 +1,60 @@
1
+
2
+ [![Build Status](https://travis-ci.org/leopoldodonnell/tracks-attributes.png?branch=master)](https://travis-ci.org/leopoldodonnell/tracks-attributes)
3
+ [![Dependency Status](https://gemnasium.com/leopoldodonnell/tracks-attributes.png)](https://gemnasium.com/leopoldodonnell/tracks-attributes)
4
+ [![Code Climate](https://codeclimate.com/github/leopoldodonnell/tracks-attributes.png)](https://codeclimate.com/github/leopoldodonnell/tracks-attributes)
5
+ # TracksAttributes
6
+
7
+ TracksAttributes adds the ability to track ActiveRecord and Object level attributes.
8
+
9
+ Sometimes you just need to know what your accessors are at runtime, like when you're writing a controller that
10
+ needs to return JSON or XML. This module extends ActiveRecord::Base with the *tracks_attributes* class method. Once this has
11
+ been called the class is extended with the ability to track attributes through *attr_accessor*, *attr_reader*, and *attr_writer*.
12
+ Plain old Ruby classes may also use *TracksAttributes* by including it as a module first.
13
+
14
+ ## Enhanced JSON and XML processing
15
+
16
+ Beyond the ability to track your attributes, this gem simplifies your use of converting your objects to an from JSON or XML.
17
+ Once a class has been extended, it can convert to and from JSON or XML without having to explicitly include attributes.
18
+
19
+ Example:
20
+ ```ruby
21
+ class Person < ActiveRecordBase
22
+ tracks_attributes
23
+
24
+ attr_accessible :name, :email
25
+ attr_accessor :favorite_food
26
+ end
27
+
28
+ fred = Person.find_by_name("Fred")
29
+ fred.favorite_food = 'Brontosaurus Burgers'
30
+
31
+ fred_json = fred.to_json
32
+ puts fred_json
33
+ # => {"id":1,"name":"Fred","email":"fred@bedrock.com","favorite_food":"Brontosaurus Burgers"}
34
+
35
+ fred2 = Person.new
36
+ fred2.from_json(fred_json)
37
+ puts "#{fred2.name} loves #{fred2.favorite_food}"
38
+ # => Fred loves Brontosaurus Burgers
39
+ ```
40
+ Both the JSON and XML take the same options as their Hash and ActiveRecord counterparts so you can still
41
+ use *:only* and *:includes* in your code as needed.
42
+
43
+ ## Add Validations To Non Active Record Attributes
44
+
45
+ To add ActiveModel::Validations to your class just initialize your class with *tracks_attributes* as
46
+
47
+ ```ruby
48
+ tracks_attributes :validates => true
49
+ ```
50
+ ## Installation
51
+
52
+ Add the following to your Gemfile
53
+
54
+ gem 'tracks-attributes', :git => "git://github.com/leopoldodonnell/tracks-attributes"
55
+
56
+ Then call bundle to install it.
57
+
58
+ > bundle
59
+
60
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env rake
2
+ require 'rspec/core/rake_task'
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+ begin
9
+ require 'rdoc/task'
10
+ rescue LoadError
11
+ require 'rdoc/rdoc'
12
+ require 'rake/rdoctask'
13
+ RDoc::Task = Rake::RDocTask
14
+ end
15
+
16
+ RDoc::Task.new(:rdoc) do |rdoc|
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = 'TracksAttributes'
19
+ rdoc.options << '--line-numbers'
20
+ rdoc.rdoc_files.include('README.rdoc')
21
+ rdoc.rdoc_files.include('lib/**/*.rb')
22
+ end
23
+
24
+ Bundler::GemHelper.install_tasks
25
+
26
+ desc "Run all specs"
27
+ RSpec::Core::RakeTask.new(:spec)
28
+
29
+ task :default => :spec
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :tracks_attributes do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,10 @@
1
+ require 'active_record/railtie'
2
+ require 'active_support/core_ext'
3
+
4
+ module TracksAttributes
5
+ class Railtie < Rails::Railtie
6
+ if defined?(ActiveRecord::Base)
7
+ ActiveRecord::Base.send :include, TracksAttributes
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module TracksAttributes
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,127 @@
1
+ # @author Leo O'Donnell
2
+
3
+ ##
4
+ # A Module that can be used to extend ActiveRecord or Plain Old Ruby Objects
5
+ # with the ability to track all attributes. It also simplifies streaming to and
6
+ # from JSON or XML since it will automatically consider all attributes in the
7
+ # conversion.
8
+ #
9
+ # This module can also be used as building block for other classes that need to
10
+ # be dynamically aware of their attributes.
11
+ #
12
+ module TracksAttributes
13
+ extend ActiveSupport::Concern
14
+
15
+ module ClassMethods
16
+ ##
17
+ # Call this class method to begin tracking attributes on a class.
18
+ #
19
+ # @param [Hash] options With values:
20
+ # * :validates => true will enable attribute validation
21
+ #
22
+ # Note:
23
+ # Classes that include TracksAttributes will not be extended unless
24
+ # until this method is called.
25
+ #
26
+ # @see TracksAttributesInternal TracksAttributesInternal for full method list
27
+ def tracks_attributes(options={})
28
+ include TracksAttributesInternal
29
+ include ActiveModel::Validations if options[:validates]
30
+ self
31
+ end
32
+ end
33
+
34
+ module TracksAttributesInternal
35
+ extend ActiveSupport::Concern
36
+
37
+ included do
38
+ @tracked_attrs ||= []
39
+ end
40
+
41
+ module ClassMethods
42
+ # override attr_accessor to track accessors for an TracksAttributes
43
+ def attr_accessor(*vars)
44
+ @tracked_attrs.concat vars
45
+ super
46
+ end
47
+
48
+ # override attr_reader to track accessors for an TracksAttributes
49
+ def attr_reader(*vars)
50
+ @tracked_attrs.concat vars
51
+ super
52
+ end
53
+
54
+ # override attr_writer to track accessors for an TracksAttributes
55
+ def attr_writer(*vars)
56
+ # avoid tracking attributes that are added by the class_attribute
57
+ # as these are class attributes and not instance attributes.
58
+ @tracked_attrs.concat vars.reject {|var| respond_to? var }
59
+ super
60
+ end
61
+
62
+ # return an array of all of the attributes that are not in active record
63
+ def accessors
64
+ @tracked_attrs ||= []
65
+ end
66
+
67
+ end
68
+
69
+ # Return the array of accessor symbols for instances of this
70
+ # class.
71
+ def accessors
72
+ self.class.accessors
73
+ end
74
+
75
+ # Return a hash all of the accessor symbols and their values
76
+ def all_attributes
77
+ attributes.merge Hash[accessors.collect {|v| [v, send(v.to_s)] if respond_to? "#{v}".to_sym}]
78
+ end
79
+
80
+ # Set all attributes with hash of symbols and their values and returns instance
81
+ def all_attributes=(hash = {})
82
+ hash.each {|k, v| send("#{k.to_s}=", v) if respond_to? "#{k.to_s}=".to_sym}
83
+ self
84
+ end
85
+
86
+ # Convert an TracksAttributes instance to JSON by delegating conversion to Hash.to_json
87
+ #
88
+ # @param [Hash] options
89
+ # * Without any options, the returned JSON string will include all of the attributes.
90
+ # * :only => one, or an array of Hash Keys that define which keys to process
91
+ # * :except => one, or an array of Hash Keys that define which keys not to process
92
+ #
93
+ def to_json(options = nil)
94
+ all_attributes.to_json(options)
95
+ end
96
+
97
+ # Returns an instance of TracksAttributes from a JSON string
98
+ def from_json(json, include_root=false)
99
+ hash = ActiveSupport::JSON.decode(json)
100
+ hash = hash.values.first if include_root
101
+ self.all_attributes = hash
102
+ end
103
+
104
+ # Convert an TracksAttributes instance to XML by delegating conversion to Hash.to_xml
105
+ #
106
+ # @param [Hash] options
107
+ # * Without any options, the returned XML string will include all of the attributes.
108
+ # * :only => one, or an array of Hash Keys that define which keys to process
109
+ # * :except => one, or an array of Hash Keys that define which keys not to process
110
+ #
111
+ # The :builder option uses key as the :root for the XML
112
+ # result
113
+ #
114
+ def to_xml(options = nil)
115
+ all_attributes.to_xml(options || {})
116
+ end
117
+
118
+ # Returns an instance of TracksAttributes from an XML string
119
+ def from_xml(xml)
120
+ hash = Hash.from_xml(xml).values.first
121
+ self.all_attributes = hash
122
+ end
123
+
124
+ end
125
+ end
126
+
127
+ require 'tracks_attributes/railtie'
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tracks-attributes
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Leo O'Donnell
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.2'
30
+ - !ruby/object:Gem::Dependency
31
+ name: sqlite3
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: ! "Sometimes you just need to know what your accessors are at runtime,
47
+ like when you're writing a controller that\n needs to return JSON or XML..."
48
+ email:
49
+ - leopold.odonnell@gmail.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - lib/tasks/tracks_attributes_tasks.rake
55
+ - lib/tracks_attributes/railtie.rb
56
+ - lib/tracks_attributes/version.rb
57
+ - lib/tracks_attributes.rb
58
+ - MIT-LICENSE
59
+ - Rakefile
60
+ - README.md
61
+ homepage: https://github.com/leopoldodonnell/tracks-attributes
62
+ licenses: []
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ requirements: []
80
+ rubyforge_project:
81
+ rubygems_version: 1.8.24
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: TracksAttributes adds the ability to track ActiveRecord and Object level
85
+ attributes.
86
+ test_files: []
87
+ has_rdoc: