active-behavior 0.2.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/Rakefile +76 -0
- data/lib/active-behavior.rb +9 -0
- data/lib/active-behavior/loader.rb +103 -0
- data/lib/active-behavior/railtie.rb +11 -0
- data/lib/active-behavior/record_helper.rb +37 -0
- metadata +71 -0
data/Rakefile
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require "rake/rdoctask"
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
|
5
|
+
spec = Gem::Specification.new do |s|
|
6
|
+
s.name = "active-behavior"
|
7
|
+
s.authors = ["Lance Pollard"]
|
8
|
+
s.version = "0.2.0"
|
9
|
+
s.summary = "Build your models one module at a time."
|
10
|
+
s.description = "Put each association into it's own behavior module. This makes testing and organizing your Rails app a lot easier when it gets big."
|
11
|
+
s.homepage = "http://github.com/viatropos/active-behavior"
|
12
|
+
s.email = "lancejpollard@gmail.com"
|
13
|
+
s.rubyforge_project = "active-behavior"
|
14
|
+
s.platform = Gem::Platform::RUBY
|
15
|
+
s.files = %w(Rakefile) + Dir["{lib,rails,test}/**/*"] - Dir["test/tmp"]
|
16
|
+
s.require_path = "lib"
|
17
|
+
end
|
18
|
+
|
19
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
20
|
+
pkg.gem_spec = spec
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'run unit tests'
|
24
|
+
task :test do
|
25
|
+
Dir["test/**/*"].each do |file|
|
26
|
+
next unless File.basename(file) =~ /test_/
|
27
|
+
next unless File.extname(file) == ".rb"
|
28
|
+
system "ruby #{file}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc "Create .gemspec file (useful for github)"
|
33
|
+
task :gemspec do
|
34
|
+
File.open("#{spec.name}.gemspec", "w") do |f|
|
35
|
+
f.puts spec.to_ruby
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "Build the gem into the current directory"
|
40
|
+
task :gem => :gemspec do
|
41
|
+
`gem build #{spec.name}.gemspec`
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "Publish gem to rubygems"
|
45
|
+
task :publish => [:package] do
|
46
|
+
%x[gem push #{spec.name}-#{spec.version}.gem]
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "Print a list of the files to be put into the gem"
|
50
|
+
task :manifest do
|
51
|
+
File.open("Manifest", "w") do |f|
|
52
|
+
spec.files.each do |file|
|
53
|
+
f.puts file
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
desc "Install the gem locally"
|
59
|
+
task :install => [:package] do
|
60
|
+
File.mkdir("pkg") unless File.exists?("pkg")
|
61
|
+
command = "gem install pkg/#{spec.name}-#{spec.version} --no-ri --no-rdoc"
|
62
|
+
command = "sudo #{command}" if ENV["SUDO"] == true
|
63
|
+
sh %{#{command}}
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "Generate the rdoc"
|
67
|
+
Rake::RDocTask.new do |rdoc|
|
68
|
+
files = ["README.md", "lib/**/*.rb"]
|
69
|
+
rdoc.rdoc_files.add(files)
|
70
|
+
rdoc.main = "README.md"
|
71
|
+
rdoc.title = spec.summary
|
72
|
+
end
|
73
|
+
|
74
|
+
task :yank do
|
75
|
+
`gem yank #{spec.name} -v #{spec.version}`
|
76
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
def class_exists?(class_name)
|
2
|
+
klass = Module.const_get(class_name)
|
3
|
+
return klass.is_a?(Class)
|
4
|
+
rescue NameError
|
5
|
+
return false
|
6
|
+
end
|
7
|
+
|
8
|
+
def define_module(name, &block)
|
9
|
+
name = name.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
10
|
+
parts = name.split("::").select { |i| i != "" }
|
11
|
+
parts.each_with_index do |part, index|
|
12
|
+
class_name = parts[0..index].join("::")
|
13
|
+
unless class_exists?(class_name)
|
14
|
+
eval("module ::#{class_name}; unloadable ; end")
|
15
|
+
else
|
16
|
+
clazz = eval("::#{class_name}")
|
17
|
+
clazz.unloadable if clazz.respond_to?(:unloadable)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
clazz = eval(name)
|
21
|
+
#clazz.unloadable if clazz.respond_to?(:unloadable)
|
22
|
+
clazz.class_eval(&block) if block_given?
|
23
|
+
clazz
|
24
|
+
end
|
25
|
+
|
26
|
+
module ActiveBehavior
|
27
|
+
class Loader
|
28
|
+
|
29
|
+
def self.imports
|
30
|
+
@imports
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.imports=(value)
|
34
|
+
@imports = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.requires=(value)
|
38
|
+
@requires = value
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.requires
|
42
|
+
@requires
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.import
|
46
|
+
# http://snippets.dzone.com/posts/show/12537
|
47
|
+
behavior_dir = "#{Rails.root}/app/behaviors"
|
48
|
+
self.requires = []
|
49
|
+
self.imports = Dir["#{behavior_dir}/**/*"].sort.inject({}) do |hash, file|
|
50
|
+
if File.extname(file) == ".rb"
|
51
|
+
self.requires << file
|
52
|
+
tree = hash
|
53
|
+
nodes = file.gsub("#{behavior_dir}/", "").gsub(/\.rb$/, "").split("/")
|
54
|
+
nodes.each do |node|
|
55
|
+
tree[node] ||= {}
|
56
|
+
tree = tree[node]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
hash
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.define(hash = self.imports)
|
64
|
+
hash.each do |key, value|
|
65
|
+
name = "::#{key.split(".").map(&:camelize).join("::")}"
|
66
|
+
define_behavior(name)
|
67
|
+
|
68
|
+
value.keys.each do |child_key|
|
69
|
+
value["#{key}.#{child_key}"] = value.delete(child_key)
|
70
|
+
end
|
71
|
+
define value if value.is_a?(Hash)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.define_behavior(name)
|
76
|
+
begin
|
77
|
+
define_module(name).class_eval %{
|
78
|
+
unloadable
|
79
|
+
module ClassMethods; unloadable; end
|
80
|
+
module InstanceMethods; unloadable; end
|
81
|
+
}
|
82
|
+
rescue Exception => e
|
83
|
+
puts e.inspect
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.require_files
|
88
|
+
self.requires.each do |file|
|
89
|
+
require file
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.load
|
94
|
+
import
|
95
|
+
define
|
96
|
+
ENV["BEHAVIOR_LOADED"] = "true"
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.loaded?
|
100
|
+
ENV.has_key?("BEHAVIOR_LOADED") && ENV["BEHAVIOR_LOADED"] == "true"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ActiveBehavior
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
initializer "active_behavior.insert_into_active_record" do
|
4
|
+
ActiveSupport.on_load :active_record do
|
5
|
+
ActiveRecord::Base.send :include, ActiveBehavior::RecordHelper
|
6
|
+
|
7
|
+
ActiveBehavior::Loader.load unless ActiveBehavior::Loader.loaded?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ActiveBehavior
|
2
|
+
module RecordHelper
|
3
|
+
unloadable
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend ClassMethods
|
7
|
+
base.send :include, InstanceMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
unloadable
|
12
|
+
|
13
|
+
def behaviors(*names)
|
14
|
+
@behaviors = names.flatten.compact.uniq
|
15
|
+
|
16
|
+
include_behaviors
|
17
|
+
end
|
18
|
+
|
19
|
+
def include_behaviors
|
20
|
+
return unless @behaviors.present?
|
21
|
+
|
22
|
+
@behaviors.each do |behavior|
|
23
|
+
begin
|
24
|
+
include "::#{self.name}::#{behavior.to_s.camelize}".constantize
|
25
|
+
rescue Exception => e
|
26
|
+
puts "#{e.inspect}\n#{e.backtrace.join("\n")}" unless e.inspect =~ /uninitialized constant/
|
27
|
+
include "::Shared::#{behavior.to_s.camelize}".constantize rescue nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module InstanceMethods
|
34
|
+
unloadable
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: active-behavior
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Lance Pollard
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-07-05 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Put each association into it's own behavior module. This makes testing and organizing your Rails app a lot easier when it gets big.
|
23
|
+
email: lancejpollard@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files: []
|
29
|
+
|
30
|
+
files:
|
31
|
+
- Rakefile
|
32
|
+
- lib/active-behavior/loader.rb
|
33
|
+
- lib/active-behavior/railtie.rb
|
34
|
+
- lib/active-behavior/record_helper.rb
|
35
|
+
- lib/active-behavior.rb
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://github.com/viatropos/active-behavior
|
38
|
+
licenses: []
|
39
|
+
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
none: false
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
hash: 3
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
requirements: []
|
64
|
+
|
65
|
+
rubyforge_project: active-behavior
|
66
|
+
rubygems_version: 1.3.7
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: Build your models one module at a time.
|
70
|
+
test_files: []
|
71
|
+
|