expansion 0.0.1

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/LICENSE ADDED
File without changes
data/README ADDED
File without changes
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require './lib/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "expansion"
9
+ s.version = Expansion::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.authors = ["Christian Blais"]
12
+ s.email = ["christ.blais@gmail.com"]
13
+ s.homepage = "http://github.com/christianblais/expansion"
14
+ s.summary = "Dynamic model attributes"
15
+ s.description = "Dynamic model attributes"
16
+
17
+ s.add_dependency 'haml', '>=3.1.0'
18
+ s.add_dependency 'inherited_resources'
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+
22
+ s.require_paths = ['lib', 'app']
23
+ end
@@ -0,0 +1,50 @@
1
+ module Expansion
2
+ module ActiveRecord
3
+ def self.included base
4
+ base.extend( ClassMethods )
5
+ end
6
+
7
+ module ClassMethods
8
+ def expandable
9
+ include InstanceMethods
10
+
11
+ class << self
12
+ def expansion_attributes
13
+ Expansion::Attribute.where( :model_name => self.model_name )
14
+ end
15
+ end
16
+
17
+ expandables << self
18
+ end
19
+
20
+ def expandables
21
+ @expandables ||= []
22
+ end
23
+ end
24
+
25
+ module InstanceMethods
26
+ def expansion_attributes
27
+ self.class.expansion_attributes.each_with_object({}) do |attribute, hash|
28
+ hash[attribute.name] = attribute.values_for( self )
29
+ end
30
+ end
31
+
32
+ def expansion_value attribute, value=nil, options={}
33
+ if value
34
+ Expansion::Value.new do |v|
35
+ v.owner = self
36
+ v.attribute = attribute
37
+ v.value = value
38
+ v.note = options[:note]
39
+ v.date = options[:date]
40
+ end.save!
41
+ else
42
+ attribute.values_for( self )
43
+ end
44
+ end
45
+ alias_method :expansion_values, :expansion_value
46
+ end
47
+ end
48
+ end
49
+
50
+ ActiveRecord::Base.send( :include, Expansion::ActiveRecord )
@@ -0,0 +1,3 @@
1
+ require 'activerecord/extensions'
2
+ require 'expansion/attribute'
3
+ require 'expansion/value'
@@ -0,0 +1,17 @@
1
+ class Expansion::Attribute < ActiveRecord::Base
2
+
3
+ set_table_name 'expansion_attributes'
4
+
5
+ VALUE_TYPES = %w(boolean date float integer string text timestamp)
6
+
7
+ has_many :values, :class_name => "Expansion::Value", :order => "created_at"
8
+
9
+ validates :value_type, :presence => true, :inclusion => { :in => VALUE_TYPES }
10
+
11
+ def values_for model
12
+ v = self.values.owned_by( model )
13
+ v = v.last unless self.is_multiple?
14
+ v
15
+ end
16
+
17
+ end
@@ -0,0 +1,19 @@
1
+ class Expansion::Value < ActiveRecord::Base
2
+
3
+ set_table_name 'expansion_values'
4
+
5
+ belongs_to :attribute, :class_name => "Expansion::Attribute"
6
+ belongs_to :owner, :polymorphic => true
7
+
8
+ scope :owned_by, lambda{ |owner| where( :owner_type => owner.class.name, :owner_id => owner.id ) }
9
+ scope :for_attribute, lambda{ |attribute| where( :attribute_id => attribute.id ) }
10
+
11
+ def value
12
+ self.send("value_#{self.attribute.value_type}")
13
+ end
14
+
15
+ def value= x
16
+ self.send("value_#{self.attribute.value_type}=", x)
17
+ end
18
+
19
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+
4
+ module Expansion
5
+ class InstallGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+
8
+ source_root File.expand_path('../templates', __FILE__)
9
+
10
+ desc "Expansion migrations Install"
11
+
12
+ def self.next_migration_number dirname
13
+ migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
14
+ migration_number += 1
15
+ migration_number.to_s
16
+ end
17
+
18
+ def create_migration_file
19
+ migration_template 'create_expansion_attributes.rb', 'db/migrate/create_expansion_attributes.rb'
20
+ sleep 1
21
+ migration_template 'create_expansion_values.rb', 'db/migrate/create_expansion_values.rb'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ class CreateExpansionAttributes < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :expansion_attributes do |t|
4
+ t.string :model_name
5
+ t.string :name
6
+ t.string :value_type
7
+ t.boolean :is_multiple
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :expansion_attributes
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ class CreateExpansionValues < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :expansion_values do |t|
4
+ t.references :attribute
5
+ t.references :owner, :polymorphic => true
6
+ t.text :note
7
+ t.date :date
8
+
9
+ t.string :value_string
10
+ t.integer :value_integer
11
+ t.float :value_float
12
+ t.date :value_date
13
+ t.timestamp :value_timestamp
14
+ t.text :value_text
15
+ t.boolean :value_boolean
16
+
17
+ t.timestamps
18
+ end
19
+ end
20
+
21
+ def self.down
22
+ drop_table :expansion_values
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ module Expansion
2
+ MAJOR = 0
3
+ MINOR = 0
4
+ BUILD = 1
5
+
6
+ VERSION = "#{MAJOR}.#{MINOR}.#{BUILD}"
7
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: expansion
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Christian Blais
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-06-17 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: haml
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 1
31
+ - 0
32
+ version: 3.1.0
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: inherited_resources
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ description: Dynamic model attributes
49
+ email:
50
+ - christ.blais@gmail.com
51
+ executables: []
52
+
53
+ extensions: []
54
+
55
+ extra_rdoc_files: []
56
+
57
+ files:
58
+ - LICENSE
59
+ - README
60
+ - expansion.gemspec
61
+ - lib/activerecord/extensions.rb
62
+ - lib/expansion.rb
63
+ - lib/expansion/attribute.rb
64
+ - lib/expansion/value.rb
65
+ - lib/generators/expansion/install_generator.rb
66
+ - lib/generators/expansion/templates/create_expansion_attributes.rb
67
+ - lib/generators/expansion/templates/create_expansion_values.rb
68
+ - lib/version.rb
69
+ has_rdoc: true
70
+ homepage: http://github.com/christianblais/expansion
71
+ licenses: []
72
+
73
+ post_install_message:
74
+ rdoc_options: []
75
+
76
+ require_paths:
77
+ - lib
78
+ - app
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ segments:
93
+ - 0
94
+ version: "0"
95
+ requirements: []
96
+
97
+ rubyforge_project:
98
+ rubygems_version: 1.3.7
99
+ signing_key:
100
+ specification_version: 3
101
+ summary: Dynamic model attributes
102
+ test_files: []
103
+