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.
@@ -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,9 @@
1
+ module ActiveBehavior
2
+
3
+ end
4
+
5
+ $:.unshift File.dirname(File.expand_path(__FILE__))
6
+
7
+ require 'active-behavior/loader'
8
+ require 'active-behavior/record_helper'
9
+ require 'active-behavior/railtie'
@@ -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
+