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 +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
|
+
|