expansion 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +0 -0
- data/README +0 -0
- data/expansion.gemspec +23 -0
- data/lib/activerecord/extensions.rb +50 -0
- data/lib/expansion.rb +3 -0
- data/lib/expansion/attribute.rb +17 -0
- data/lib/expansion/value.rb +19 -0
- data/lib/generators/expansion/install_generator.rb +24 -0
- data/lib/generators/expansion/templates/create_expansion_attributes.rb +16 -0
- data/lib/generators/expansion/templates/create_expansion_values.rb +24 -0
- data/lib/version.rb +7 -0
- metadata +103 -0
data/LICENSE
ADDED
File without changes
|
data/README
ADDED
File without changes
|
data/expansion.gemspec
ADDED
@@ -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 )
|
data/lib/expansion.rb
ADDED
@@ -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
|
data/lib/version.rb
ADDED
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
|
+
|