customize 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.rspec +1 -0
  2. data/.watchr +42 -0
  3. data/Gemfile +22 -0
  4. data/Gemfile.lock +157 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.markdown +3 -0
  7. data/README.rdoc +26 -0
  8. data/Rakefile +44 -0
  9. data/VERSION +1 -0
  10. data/customize.gemspec +126 -0
  11. data/lib/customize/character.rb +5 -0
  12. data/lib/customize/characterize.rb +25 -0
  13. data/lib/customize/engine.rb +7 -0
  14. data/lib/customize/inherit_node.rb +11 -0
  15. data/lib/customize/inherited.rb +48 -0
  16. data/lib/customize.rb +9 -0
  17. data/lib/generators/customize/USAGE +8 -0
  18. data/lib/generators/customize/customize_generator.rb +17 -0
  19. data/lib/generators/customize/templates/migration.rb +24 -0
  20. data/spec/customize/characterize_spec.rb +66 -0
  21. data/spec/customize/inherited_spec.rb +70 -0
  22. data/spec/customize_spec.rb +7 -0
  23. data/spec/dummy/Rakefile +7 -0
  24. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  27. data/spec/dummy/config/application.rb +45 -0
  28. data/spec/dummy/config/boot.rb +10 -0
  29. data/spec/dummy/config/database.yml +22 -0
  30. data/spec/dummy/config/environment.rb +5 -0
  31. data/spec/dummy/config/environments/development.rb +26 -0
  32. data/spec/dummy/config/environments/production.rb +49 -0
  33. data/spec/dummy/config/environments/test.rb +35 -0
  34. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  35. data/spec/dummy/config/initializers/inflections.rb +10 -0
  36. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  37. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  38. data/spec/dummy/config/initializers/session_store.rb +8 -0
  39. data/spec/dummy/config/locales/en.yml +5 -0
  40. data/spec/dummy/config/routes.rb +58 -0
  41. data/spec/dummy/config.ru +4 -0
  42. data/spec/dummy/db/migrate/20120420023014_create_customize.rb +24 -0
  43. data/spec/dummy/db/schema.rb +37 -0
  44. data/spec/dummy/public/404.html +26 -0
  45. data/spec/dummy/public/422.html +26 -0
  46. data/spec/dummy/public/500.html +26 -0
  47. data/spec/dummy/public/favicon.ico +0 -0
  48. data/spec/dummy/public/javascripts/application.js +2 -0
  49. data/spec/dummy/public/javascripts/controls.js +965 -0
  50. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  51. data/spec/dummy/public/javascripts/effects.js +1123 -0
  52. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  53. data/spec/dummy/public/javascripts/rails.js +202 -0
  54. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  55. data/spec/dummy/script/rails +6 -0
  56. data/spec/integration/navigation_spec.rb +9 -0
  57. data/spec/spec_helper.rb +40 -0
  58. metadata +283 -0
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format documentation
data/.watchr ADDED
@@ -0,0 +1,42 @@
1
+ def run(cmd)
2
+ puts(cmd)
3
+ `#{cmd}`
4
+ end
5
+
6
+ def growl(first, result)
7
+ passed = result.include?('0 failures')
8
+ title = "RSpec Test #{ passed ? "Successful!" : "Failed..."}"
9
+ image = passed ? "info" : "error"
10
+ severity = passed ? "low" : "critical"
11
+ body = passed ? "All Passed!" : result[result.rindex("Failures"), result.size].gsub(/(\\|<\/|\r\n:w|[\n\r"'])/,'')
12
+ options = "-i #{image} -u #{severity} '#{title}' '#{body}'"
13
+ system "notify-send #{options} &"
14
+ end
15
+
16
+ def run_spec(file)
17
+ unless File.exist?(file)
18
+ puts "#{file} does not exist"
19
+ return
20
+ end
21
+
22
+ puts "Running #{file}"
23
+ result = run("bundle exec rspec #{file}")
24
+ growl(result.split("\n").first, result) rescue nil
25
+ puts result
26
+ end
27
+
28
+ watch("spec/.*/*_spec\.rb") do |match|
29
+ run_spec match[0]
30
+ end
31
+
32
+ watch("lib/(.*/.*)\.rb") do |match|
33
+ run_spec %{spec/#{match[1]}_spec.rb}
34
+ end
35
+
36
+ watch("spec/.*/.*/*_spec\.rb") do |match|
37
+ run_spec match[0]
38
+ end
39
+
40
+ watch("lib/(.*/.*/.*)\.rb") do |match|
41
+ run_spec %{spec/#{match[1]}_spec.rb}
42
+ end
data/Gemfile ADDED
@@ -0,0 +1,22 @@
1
+ source "http://ruby.taobao.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ gem "rails", ">= 3.0.12"
7
+ gem "capybara", ">= 0.4.0"
8
+
9
+ group :development,:test do
10
+ gem "sqlite3"
11
+ gem "rspec-rails", ">= 2.8.0"
12
+ gem "sqlite3-ruby"
13
+ gem "with_model", '>= 0.1.5'
14
+ gem "rdoc", "~> 3.12"
15
+ gem "cucumber"
16
+ gem "bundler", ">= 1.0.0"
17
+ gem "jeweler", ">= 1.8.3"
18
+ gem "simplecov", ">= 0"
19
+ end
20
+ # To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
21
+ # gem 'ruby-debug'
22
+ # gem 'ruby-debug19'
data/Gemfile.lock ADDED
@@ -0,0 +1,157 @@
1
+ GEM
2
+ remote: http://ruby.taobao.org/
3
+ specs:
4
+ actionmailer (3.2.3)
5
+ actionpack (= 3.2.3)
6
+ mail (~> 2.4.4)
7
+ actionpack (3.2.3)
8
+ activemodel (= 3.2.3)
9
+ activesupport (= 3.2.3)
10
+ builder (~> 3.0.0)
11
+ erubis (~> 2.7.0)
12
+ journey (~> 1.0.1)
13
+ rack (~> 1.4.0)
14
+ rack-cache (~> 1.2)
15
+ rack-test (~> 0.6.1)
16
+ sprockets (~> 2.1.2)
17
+ activemodel (3.2.3)
18
+ activesupport (= 3.2.3)
19
+ builder (~> 3.0.0)
20
+ activerecord (3.2.3)
21
+ activemodel (= 3.2.3)
22
+ activesupport (= 3.2.3)
23
+ arel (~> 3.0.2)
24
+ tzinfo (~> 0.3.29)
25
+ activeresource (3.2.3)
26
+ activemodel (= 3.2.3)
27
+ activesupport (= 3.2.3)
28
+ activesupport (3.2.3)
29
+ i18n (~> 0.6)
30
+ multi_json (~> 1.0)
31
+ addressable (2.2.7)
32
+ arel (3.0.2)
33
+ builder (3.0.0)
34
+ capybara (1.1.2)
35
+ mime-types (>= 1.16)
36
+ nokogiri (>= 1.3.3)
37
+ rack (>= 1.0.0)
38
+ rack-test (>= 0.5.4)
39
+ selenium-webdriver (~> 2.0)
40
+ xpath (~> 0.1.4)
41
+ childprocess (0.3.1)
42
+ ffi (~> 1.0.6)
43
+ cucumber (1.1.9)
44
+ builder (>= 2.1.2)
45
+ diff-lcs (>= 1.1.2)
46
+ gherkin (~> 2.9.0)
47
+ json (>= 1.4.6)
48
+ term-ansicolor (>= 1.0.6)
49
+ diff-lcs (1.1.3)
50
+ erubis (2.7.0)
51
+ ffi (1.0.11)
52
+ gherkin (2.9.3)
53
+ json (>= 1.4.6)
54
+ git (1.2.5)
55
+ hike (1.2.1)
56
+ i18n (0.6.0)
57
+ jeweler (1.8.3)
58
+ bundler (~> 1.0)
59
+ git (>= 1.2.5)
60
+ rake
61
+ rdoc
62
+ journey (1.0.3)
63
+ json (1.6.6)
64
+ libwebsocket (0.1.3)
65
+ addressable
66
+ mail (2.4.4)
67
+ i18n (>= 0.4.0)
68
+ mime-types (~> 1.16)
69
+ treetop (~> 1.4.8)
70
+ mime-types (1.18)
71
+ multi_json (1.3.2)
72
+ nokogiri (1.5.2)
73
+ polyglot (0.3.3)
74
+ rack (1.4.1)
75
+ rack-cache (1.2)
76
+ rack (>= 0.4)
77
+ rack-ssl (1.3.2)
78
+ rack
79
+ rack-test (0.6.1)
80
+ rack (>= 1.0)
81
+ rails (3.2.3)
82
+ actionmailer (= 3.2.3)
83
+ actionpack (= 3.2.3)
84
+ activerecord (= 3.2.3)
85
+ activeresource (= 3.2.3)
86
+ activesupport (= 3.2.3)
87
+ bundler (~> 1.0)
88
+ railties (= 3.2.3)
89
+ railties (3.2.3)
90
+ actionpack (= 3.2.3)
91
+ activesupport (= 3.2.3)
92
+ rack-ssl (~> 1.3.2)
93
+ rake (>= 0.8.7)
94
+ rdoc (~> 3.4)
95
+ thor (~> 0.14.6)
96
+ rake (0.9.2.2)
97
+ rdoc (3.12)
98
+ json (~> 1.4)
99
+ rspec (2.9.0)
100
+ rspec-core (~> 2.9.0)
101
+ rspec-expectations (~> 2.9.0)
102
+ rspec-mocks (~> 2.9.0)
103
+ rspec-core (2.9.0)
104
+ rspec-expectations (2.9.1)
105
+ diff-lcs (~> 1.1.3)
106
+ rspec-mocks (2.9.0)
107
+ rspec-rails (2.9.0)
108
+ actionpack (>= 3.0)
109
+ activesupport (>= 3.0)
110
+ railties (>= 3.0)
111
+ rspec (~> 2.9.0)
112
+ rubyzip (0.9.7)
113
+ selenium-webdriver (2.21.2)
114
+ childprocess (>= 0.2.5)
115
+ ffi (~> 1.0)
116
+ libwebsocket (~> 0.1.3)
117
+ multi_json (~> 1.0)
118
+ rubyzip
119
+ simplecov (0.6.1)
120
+ multi_json (~> 1.0)
121
+ simplecov-html (~> 0.5.3)
122
+ simplecov-html (0.5.3)
123
+ sprockets (2.1.2)
124
+ hike (~> 1.2)
125
+ rack (~> 1.0)
126
+ tilt (~> 1.1, != 1.3.0)
127
+ sqlite3 (1.3.6)
128
+ sqlite3-ruby (1.3.3)
129
+ sqlite3 (>= 1.3.3)
130
+ term-ansicolor (1.0.7)
131
+ thor (0.14.6)
132
+ tilt (1.3.3)
133
+ treetop (1.4.10)
134
+ polyglot
135
+ polyglot (>= 0.3.1)
136
+ tzinfo (0.3.33)
137
+ with_model (0.2.6)
138
+ activerecord (>= 2.3.5, < 4.0.0)
139
+ rspec (< 3)
140
+ xpath (0.1.4)
141
+ nokogiri (~> 1.3)
142
+
143
+ PLATFORMS
144
+ ruby
145
+
146
+ DEPENDENCIES
147
+ bundler (>= 1.0.0)
148
+ capybara (>= 0.4.0)
149
+ cucumber
150
+ jeweler (>= 1.8.3)
151
+ rails (>= 3.0.12)
152
+ rdoc (~> 3.12)
153
+ rspec-rails (>= 2.8.0)
154
+ simplecov
155
+ sqlite3
156
+ sqlite3-ruby
157
+ with_model (>= 0.1.5)
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2012 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.markdown ADDED
@@ -0,0 +1,3 @@
1
+ = Customize
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/README.rdoc ADDED
@@ -0,0 +1,26 @@
1
+ = Customize
2
+
3
+ == Introduction
4
+
5
+ customize is an rails engine intend to easy customize rails models with activerecord.
6
+
7
+ == Install
8
+
9
+ customize is designed for rails 3.0+
10
+
11
+ to use it, add to Gemfile:
12
+
13
+ gem 'customize'
14
+
15
+ install bundle:
16
+
17
+ bundle install
18
+
19
+ generate migrations and other resources:
20
+
21
+ rails g customize
22
+
23
+
24
+ = Copyright
25
+
26
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ # encoding: UTF-8
2
+ require 'rubygems'
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
+
9
+ require 'rake'
10
+ require 'rdoc/task'
11
+
12
+ require 'rspec/core'
13
+ require 'rspec/core/rake_task'
14
+
15
+ RSpec::Core::RakeTask.new(:spec)
16
+
17
+ task :default => :spec
18
+
19
+ Rake::RDocTask.new(:rdoc) do |rdoc|
20
+ rdoc.rdoc_dir = 'rdoc'
21
+ rdoc.title = 'Customize'
22
+ rdoc.options << '--line-numbers' << '--inline-source'
23
+ rdoc.rdoc_files.include('README.rdoc')
24
+ rdoc.rdoc_files.include('lib/**/*.rb')
25
+ end
26
+
27
+ require 'jeweler'
28
+ Jeweler::Tasks.new do |gem|
29
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
30
+ gem.name = "customize"
31
+ gem.homepage = "http://github.com/lazing/customize"
32
+ gem.license = "MIT"
33
+ gem.summary = %Q{easy customize your domain model behavior}
34
+ gem.description = %Q{
35
+ easy customize your domain model, including:
36
+ characterize;
37
+ inherit;
38
+ formula
39
+ }
40
+ gem.email = "ryan@idolgo.com"
41
+ gem.authors = ["Ryan Wong"]
42
+ # dependencies defined in Gemfile
43
+ end
44
+ Jeweler::RubygemsDotOrgTasks.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/customize.gemspec ADDED
@@ -0,0 +1,126 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "customize"
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Ryan Wong"]
12
+ s.date = "2012-04-20"
13
+ s.description = "\n\t\teasy customize your domain model, including:\n\t\tcharacterize;\n\t\tinherit;\n\t\tformula\n\t"
14
+ s.email = "ryan@idolgo.com"
15
+ s.extra_rdoc_files = [
16
+ "README.markdown",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".rspec",
21
+ ".watchr",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "MIT-LICENSE",
25
+ "README.markdown",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "customize.gemspec",
30
+ "lib/customize.rb",
31
+ "lib/customize/character.rb",
32
+ "lib/customize/characterize.rb",
33
+ "lib/customize/engine.rb",
34
+ "lib/customize/inherit_node.rb",
35
+ "lib/customize/inherited.rb",
36
+ "lib/generators/customize/USAGE",
37
+ "lib/generators/customize/customize_generator.rb",
38
+ "lib/generators/customize/templates/migration.rb",
39
+ "spec/customize/characterize_spec.rb",
40
+ "spec/customize/inherited_spec.rb",
41
+ "spec/customize_spec.rb",
42
+ "spec/dummy/Rakefile",
43
+ "spec/dummy/app/controllers/application_controller.rb",
44
+ "spec/dummy/app/helpers/application_helper.rb",
45
+ "spec/dummy/app/views/layouts/application.html.erb",
46
+ "spec/dummy/config.ru",
47
+ "spec/dummy/config/application.rb",
48
+ "spec/dummy/config/boot.rb",
49
+ "spec/dummy/config/database.yml",
50
+ "spec/dummy/config/environment.rb",
51
+ "spec/dummy/config/environments/development.rb",
52
+ "spec/dummy/config/environments/production.rb",
53
+ "spec/dummy/config/environments/test.rb",
54
+ "spec/dummy/config/initializers/backtrace_silencers.rb",
55
+ "spec/dummy/config/initializers/inflections.rb",
56
+ "spec/dummy/config/initializers/mime_types.rb",
57
+ "spec/dummy/config/initializers/secret_token.rb",
58
+ "spec/dummy/config/initializers/session_store.rb",
59
+ "spec/dummy/config/locales/en.yml",
60
+ "spec/dummy/config/routes.rb",
61
+ "spec/dummy/db/migrate/20120420023014_create_customize.rb",
62
+ "spec/dummy/db/schema.rb",
63
+ "spec/dummy/public/404.html",
64
+ "spec/dummy/public/422.html",
65
+ "spec/dummy/public/500.html",
66
+ "spec/dummy/public/favicon.ico",
67
+ "spec/dummy/public/javascripts/application.js",
68
+ "spec/dummy/public/javascripts/controls.js",
69
+ "spec/dummy/public/javascripts/dragdrop.js",
70
+ "spec/dummy/public/javascripts/effects.js",
71
+ "spec/dummy/public/javascripts/prototype.js",
72
+ "spec/dummy/public/javascripts/rails.js",
73
+ "spec/dummy/public/stylesheets/.gitkeep",
74
+ "spec/dummy/script/rails",
75
+ "spec/integration/navigation_spec.rb",
76
+ "spec/spec_helper.rb"
77
+ ]
78
+ s.homepage = "http://github.com/lazing/customize"
79
+ s.licenses = ["MIT"]
80
+ s.require_paths = ["lib"]
81
+ s.rubygems_version = "1.8.21"
82
+ s.summary = "easy customize your domain model behavior"
83
+
84
+ if s.respond_to? :specification_version then
85
+ s.specification_version = 3
86
+
87
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
88
+ s.add_runtime_dependency(%q<rails>, [">= 3.0.12"])
89
+ s.add_runtime_dependency(%q<capybara>, [">= 0.4.0"])
90
+ s.add_development_dependency(%q<sqlite3>, [">= 0"])
91
+ s.add_development_dependency(%q<rspec-rails>, [">= 2.8.0"])
92
+ s.add_development_dependency(%q<sqlite3-ruby>, [">= 0"])
93
+ s.add_development_dependency(%q<with_model>, [">= 0.1.5"])
94
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
95
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
96
+ s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
97
+ s.add_development_dependency(%q<jeweler>, [">= 1.8.3"])
98
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
99
+ else
100
+ s.add_dependency(%q<rails>, [">= 3.0.12"])
101
+ s.add_dependency(%q<capybara>, [">= 0.4.0"])
102
+ s.add_dependency(%q<sqlite3>, [">= 0"])
103
+ s.add_dependency(%q<rspec-rails>, [">= 2.8.0"])
104
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
105
+ s.add_dependency(%q<with_model>, [">= 0.1.5"])
106
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
107
+ s.add_dependency(%q<cucumber>, [">= 0"])
108
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
109
+ s.add_dependency(%q<jeweler>, [">= 1.8.3"])
110
+ s.add_dependency(%q<simplecov>, [">= 0"])
111
+ end
112
+ else
113
+ s.add_dependency(%q<rails>, [">= 3.0.12"])
114
+ s.add_dependency(%q<capybara>, [">= 0.4.0"])
115
+ s.add_dependency(%q<sqlite3>, [">= 0"])
116
+ s.add_dependency(%q<rspec-rails>, [">= 2.8.0"])
117
+ s.add_dependency(%q<sqlite3-ruby>, [">= 0"])
118
+ s.add_dependency(%q<with_model>, [">= 0.1.5"])
119
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
120
+ s.add_dependency(%q<cucumber>, [">= 0"])
121
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
122
+ s.add_dependency(%q<jeweler>, [">= 1.8.3"])
123
+ s.add_dependency(%q<simplecov>, [">= 0"])
124
+ end
125
+ end
126
+
@@ -0,0 +1,5 @@
1
+ class Customize:: Character < ActiveRecord::Base
2
+ self.table_name = "customize_characters"
3
+ serialize :value
4
+ belongs_to :related, :polymorphic => true
5
+ end
@@ -0,0 +1,25 @@
1
+ module Customize
2
+ module Characterize
3
+
4
+ def self.included base
5
+ base.extend ClassMethods
6
+ base.has_many :characters, :class_name=>Customize::Character.name, :as=>:related
7
+ end
8
+
9
+ module ClassMethods
10
+ end
11
+
12
+ def character
13
+ @character ||= proc {
14
+ all_character = Character.where(:related_id=>(ascent_ids | [self.id]), :related_type=>self.class.name)
15
+ all_character.inject(HashWithIndifferentAccess.new) { |map, item|
16
+ map[item.key] = item.value
17
+ map
18
+ }
19
+ }.call
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,7 @@
1
+ module Customize
2
+ class Engine < ::Rails::Engine
3
+ config.generators do |g|
4
+ # g.test_framework :rspec, :view_specs => false
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ class Customize::InheritNode < ActiveRecord::Base
2
+ self.table_name = "customize_inherit_nodes"
3
+ belongs_to :parent_node, :class_name=>self.name, :foreign_key=> 'parent_id'
4
+ has_many :children, :class_name=>self.name, :foreign_key=>'parent_id'
5
+
6
+ after_destroy { |object|
7
+ object.class.where("right > :right and node_type = :type",
8
+ :right=>object.right, :type=>object.node_type).update_all("right = right -2")
9
+ }
10
+ end
11
+
@@ -0,0 +1,48 @@
1
+ module Customize
2
+ module Inherited
3
+ def self.included base
4
+ base.extend ClassMethods
5
+ base.has_one :inherit_node, :class_name=>Customize::InheritNode.name, :as=>:node, :dependent=>:destroy
6
+
7
+ base.after_create { |object|
8
+ object.create_inherit_node :left=>0, :right=>1
9
+ }
10
+
11
+ base.before_destroy { |object|
12
+ raise 'object should not have children when destroy' if object.inherit_node.children.size > 0
13
+ }
14
+
15
+ end
16
+
17
+ module ClassMethods
18
+ end
19
+
20
+ def inherit parent
21
+ raise 'should be save first' if self.new_record?
22
+ raise 'should be same class' if self.class != parent.class
23
+ inherit_node.parent_id = parent.inherit_node.id
24
+ right = parent.inherit_node.right
25
+ InheritNode.where("right >= ?", inherit_node.left).update_all("right = right+2")
26
+ inherit_node.left = right
27
+ inherit_node.right = right + 1
28
+ inherit_node.save
29
+ end
30
+
31
+ def ascent_ids
32
+ @ascent_ids ||=
33
+ InheritNode.where("left < :left and right > :right and node_type = :type",
34
+ :left=>inherit_node.left, :right=>inherit_node.right, :type=>self.class.name).pluck(:node_id)
35
+ end
36
+
37
+ def descent_ids
38
+ r = InheritNode.where("left > :left and right < :right and node_type = :type",
39
+ :left=>inherit_node.left, :right=>inherit_node.right, :type=>self.class.name)
40
+ r.pluck(:node_id)
41
+ end
42
+
43
+ def ascents
44
+ self.class.find ascent_ids
45
+ end
46
+
47
+ end
48
+ end
data/lib/customize.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'active_record'
2
+ require 'customize/engine'
3
+
4
+ module Customize
5
+ autoload :Characterize, 'customize/characterize'
6
+ autoload :Inherited, 'customize/inherited'
7
+ autoload :InheritNode, 'customize/inherit_node'
8
+ autoload :Character, 'customize/character'
9
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate customize Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,17 @@
1
+ class CustomizeGenerator < Rails::Generators::Base
2
+ include Rails::Generators::Migration
3
+ source_root File.expand_path('../templates', __FILE__)
4
+
5
+ def self.next_migration_number(path)
6
+ unless @prev_migration_nr
7
+ @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
8
+ else
9
+ @prev_migration_nr += 1
10
+ end
11
+ @prev_migration_nr.to_s
12
+ end
13
+
14
+ def copy_migrations
15
+ migration_template "migration.rb", "db/migrate/create_customize.rb"
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ class CreateCustomize < ActiveRecord::Migration
2
+
3
+ def self.change
4
+ create_table :customize_characters do |t|
5
+ t.string :key
6
+ t.string :type
7
+ t.text :value
8
+ t.string :related_type
9
+ t.integer :related_id
10
+ end
11
+ add_index :customize_characters, [:related_type, :related_id]
12
+
13
+ create_table :customize_inherit_nodes do |t|
14
+ t.integer :node_id
15
+ t.string :node_type
16
+ t.integer :left
17
+ t.integer :right
18
+ t.integer :parent_id
19
+ end
20
+
21
+ add_index :customize_inherit_nodes, [:node_type, :node_id]
22
+ add_index :customize_inherit_nodes, :parent_id
23
+ end
24
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe Customize::Characterize do
4
+
5
+ with_model :product do
6
+ table do |t|
7
+ t.string :name
8
+ t.timestamps
9
+ end
10
+
11
+ model do
12
+ include Customize::Characterize
13
+ include Customize::Inherited
14
+ end
15
+ end
16
+
17
+ subject { Product.create! }
18
+
19
+ it "has characters" do
20
+ subject.characters.should_not be_nil
21
+ end
22
+
23
+ context "support type" do
24
+
25
+ before :each do
26
+ @value = example.metadata[:description_args].first
27
+ @type = example.metadata[:type]
28
+ subject.characters.create :key=>@type, :type=>@type, :value=>@value
29
+ subject.reload
30
+ end
31
+
32
+ after :each do
33
+ subject.character[@type].should == @value
34
+ end
35
+
36
+ it 10, :type=>:integer do
37
+ end
38
+
39
+ it 12.34, :type=>:decimal do
40
+ end
41
+
42
+ it 'string', :type=>:string do
43
+ end
44
+
45
+ it [1, 2, 3] do
46
+ end
47
+
48
+ it Hash.new(:foo=>:bar) do
49
+ end
50
+
51
+ end
52
+
53
+ it "has readonly hash character" do
54
+ subject.characters.create! :key=>:foo, :value=>'bar'
55
+ subject.character[:foo].should == 'bar'
56
+ end
57
+
58
+ it "has inherited character" do
59
+ parent = Product.create!
60
+ parent.characters.create! :key=>:p, :value=>1
61
+ subject.inherit parent
62
+ subject.character[:p].should == 1
63
+ end
64
+
65
+
66
+ end