magic_multi_connections 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.txt ADDED
File without changes
data/History.txt ADDED
@@ -0,0 +1,3 @@
1
+ *** 1.0.0 / 2007-4-9
2
+
3
+ + First release
data/Manifest.txt ADDED
@@ -0,0 +1,32 @@
1
+ CHANGELOG.txt
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ lib/ext_active_record/connection_specification.rb
7
+ lib/magic_multi_connections.rb
8
+ lib/magic_multi_connections/connected.rb
9
+ lib/magic_multi_connections/module.rb
10
+ lib/magic_multi_connections/version.rb
11
+ scripts/txt2html
12
+ scripts/txt2js
13
+ setup.rb
14
+ test/connections/native_postgresql/connection.rb
15
+ test/fixtures/contact_repository.rb
16
+ test/fixtures/db_definitions/postgresql.sql
17
+ test/fixtures/people.yml
18
+ test/fixtures/person.rb
19
+ test/test_helper.rb
20
+ test/test_magic_multi_connections.rb
21
+ test/test_parent_module.rb
22
+ test/test_preexisting_module.rb
23
+ website/index.html
24
+ website/index.txt
25
+ website/javascripts/rounded_corners_lite.inc.js
26
+ website/stylesheets/screen.css
27
+ website/template.js
28
+ website/template.rhtml
29
+ website/version-raw.js
30
+ website/version-raw.txt
31
+ website/version.js
32
+ website/version.txt
data/README.txt ADDED
@@ -0,0 +1,3 @@
1
+ README for magic_multi_connections
2
+ ==================================
3
+
data/Rakefile ADDED
@@ -0,0 +1,103 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'fileutils'
10
+ require 'hoe'
11
+ include FileUtils
12
+ require File.join(File.dirname(__FILE__), 'lib', 'magic_multi_connections', 'version')
13
+
14
+ AUTHOR = "nicwilliams" # can also be an array of Authors
15
+ EMAIL = "drnicwilliams@gmail.com"
16
+ DESCRIPTION = "Your ActiveRecord classes can be accessed within multiple modules, each which targets a different DB connection"
17
+ GEM_NAME = "magic_multi_connections" # what ppl will type to install your gem
18
+ RUBYFORGE_PROJECT = "magicmodels" # The unix name for your project
19
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
20
+
21
+
22
+ NAME = "magic_multi_connections"
23
+ REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
24
+ VERS = ENV['VERSION'] || (MagicMultiConnection::VERSION::STRING + (REV ? ".#{REV}" : ""))
25
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
26
+ RDOC_OPTS = ['--quiet', '--title', "magic_multi_connections documentation",
27
+ "--opname", "index.html",
28
+ "--line-numbers",
29
+ "--main", "README",
30
+ "--inline-source"]
31
+
32
+ class Hoe
33
+ def extra_deps
34
+ @extra_deps.reject { |x| Array(x).first == 'hoe' }
35
+ end
36
+ end
37
+
38
+ # Generate all the Rake tasks
39
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
40
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
41
+ p.author = AUTHOR
42
+ p.description = DESCRIPTION
43
+ p.email = EMAIL
44
+ p.summary = DESCRIPTION
45
+ p.url = HOMEPATH
46
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
47
+ p.test_globs = ["test/**/test_*.rb"]
48
+ p.clean_globs = CLEAN #An array of file patterns to delete on clean.
49
+
50
+ # == Optional
51
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
52
+ #p.extra_deps - An array of rubygem dependencies.
53
+ #p.spec_extras - A hash of extra values to set in the gemspec.
54
+ end
55
+
56
+ for adapter in %w( mysql sqlite oracle postgresql ) # UNTESTED - firebird sqlserver sqlserver_odbc db2 sybase openbase )
57
+ Rake::TestTask.new("test_#{adapter}") { |t|
58
+ t.libs << "test" << "test/connections/native_#{adapter}"
59
+ t.pattern = "test/test_*.rb"
60
+ t.verbose = true
61
+ }
62
+ end
63
+
64
+ SCHEMA_PATH = File.join(File.dirname(__FILE__), *%w(test fixtures db_definitions))
65
+
66
+
67
+ desc 'Build the PostgreSQL test databases'
68
+ task :build_postgresql_databases do
69
+ sh %{ createdb "#{GEM_NAME}_unittest" }
70
+ sh %{ psql "#{GEM_NAME}_unittest" -f #{File.join(SCHEMA_PATH, 'postgresql.sql')} }
71
+ sh %{ createdb "#{GEM_NAME}_extra_unittest" }
72
+ sh %{ psql "#{GEM_NAME}_extra_unittest" -f #{File.join(SCHEMA_PATH, 'postgresql.sql')} }
73
+ end
74
+
75
+ desc 'Drop the PostgreSQL test databases'
76
+ task :drop_postgresql_databases do
77
+ sh %{ dropdb "#{GEM_NAME}_unittest" }
78
+ sh %{ dropdb "#{GEM_NAME}_extra_unittest" }
79
+ end
80
+
81
+ desc 'Rebuild the PostgreSQL test databases'
82
+ task :rebuild_postgresql_databases => [:drop_postgresql_databases, :build_postgresql_databases]
83
+
84
+
85
+ desc 'Generate website files'
86
+ task :website_generate do
87
+ sh %{ ruby scripts/txt2html website/index.txt > website/index.html }
88
+ sh %{ ruby scripts/txt2js website/version.txt > website/version.js }
89
+ sh %{ ruby scripts/txt2js website/version-raw.txt > website/version-raw.js }
90
+ end
91
+
92
+ desc 'Upload website files to rubyforge'
93
+ task :website_upload do
94
+ config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
95
+ host = "#{config["username"]}@rubyforge.org"
96
+ remote_dir = "/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/#{GEM_NAME}/"
97
+ local_dir = 'website'
98
+ sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}}
99
+ end
100
+
101
+ desc 'Generate and upload website files'
102
+ task :website => [:website_generate, :website_upload] do
103
+ end
@@ -0,0 +1,24 @@
1
+ module ActiveRecord
2
+ class Base
3
+
4
+ class << self
5
+
6
+ def active_connection_name #:nodoc:
7
+ @active_connection_name ||=
8
+ if active_connections[name] || @@defined_connections[name]
9
+ name
10
+ elsif self == ActiveRecord::Base
11
+ nil
12
+ elsif self.parent_module.ancestors.include?(MagicMultiConnection::Connected)
13
+ self.parent_module.establish_connection_on self
14
+ self.active_connection_name
15
+ else
16
+ superclass.active_connection_name
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ module MagicMultiConnection::Connected
2
+ def self.included(base)
3
+ base.instance_eval <<-EOS
4
+ alias :pre_connected_const_missing :const_missing
5
+
6
+ def const_missing(const_id)
7
+ return pre_connected_const_missing(const_id) rescue nil
8
+ target_class = "::\#{const_id}".constantize rescue nil
9
+ raise NameError.new("uninitialized constant \#{const_id}") unless target_class
10
+ klass = create_class const_id, target_class
11
+ klass.establish_connection self.connection_spec
12
+ klass
13
+ end
14
+
15
+ def create_class(class_name, superclass = Object, &block)
16
+ klass = Class.new superclass, &block
17
+ self.const_set class_name, klass
18
+ end
19
+ EOS
20
+ base.extend(ClassMethods)
21
+ end
22
+
23
+ module ClassMethods
24
+ def establish_connection_on(klass)
25
+ klass.establish_connection self.connection_spec
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,26 @@
1
+ class Module
2
+ attr_accessor :connection_spec
3
+
4
+ def establish_connection(connection_spec)
5
+ include MagicMultiConnection::Connected
6
+ instance_variable_set '@connection_spec', connection_spec
7
+ update_active_records
8
+ end
9
+
10
+ def parent_module
11
+ parent = self.name.split('::')[0..-2].join('::')
12
+ parent = 'Object' if parent.blank?
13
+ parent.constantize
14
+ end
15
+
16
+ private
17
+ def update_active_records
18
+ self.constants.each do |c_str|
19
+ c = "#{self.name}::#{c_str}".constantize
20
+ next unless c.is_a? Class
21
+ next unless c.new.is_a? ActiveRecord::Base
22
+ c.establish_connection connection_spec
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,9 @@
1
+ module MagicMultiConnection #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ TINY = 0
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ unless defined?(ActiveSupport) && defined?(ActiveRecord)
5
+ begin
6
+ require 'active_support'
7
+ require 'active_record'
8
+ rescue LoadError
9
+ require 'rubygems'
10
+ require 'active_support'
11
+ require 'active_record'
12
+ end
13
+ end
14
+
15
+ module MagicMultiConnection
16
+ end
17
+
18
+ require 'magic_multi_connections/version'
19
+ require 'magic_multi_connections/connected'
20
+ require 'magic_multi_connections/module'
21
+ require 'ext_active_record/connection_specification'
data/scripts/txt2html ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'redcloth'
5
+ require 'syntax/convertors/html'
6
+ require 'erb'
7
+ require File.dirname(__FILE__) + '/../lib/magic_multi_connections/version.rb'
8
+
9
+ version = MagicMultiConnection::VERSION::STRING
10
+ download = 'http://rubyforge.org/projects/magicmodels'
11
+
12
+ class Fixnum
13
+ def ordinal
14
+ # teens
15
+ return 'th' if (10..19).include?(self % 100)
16
+ # others
17
+ case self % 10
18
+ when 1: return 'st'
19
+ when 2: return 'nd'
20
+ when 3: return 'rd'
21
+ else return 'th'
22
+ end
23
+ end
24
+ end
25
+
26
+ class Time
27
+ def pretty
28
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
29
+ end
30
+ end
31
+
32
+ def convert_syntax(syntax, source)
33
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
34
+ end
35
+
36
+ if ARGV.length >= 1
37
+ src, template = ARGV
38
+ template ||= File.dirname(__FILE__) + '/../website/template.rhtml'
39
+
40
+ else
41
+ puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
42
+ exit!
43
+ end
44
+
45
+ template = ERB.new(File.open(template).read)
46
+
47
+ title = nil
48
+ body = nil
49
+ File.open(src) do |fsrc|
50
+ title_text = fsrc.readline
51
+ body_text = fsrc.read
52
+ syntax_items = []
53
+ body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
54
+ ident = syntax_items.length
55
+ element, syntax, source = $1, $2, $3
56
+ syntax_items << "<#{element} class=\"syntax\">#{convert_syntax(syntax, source)}</#{element}>"
57
+ "syntax-temp-#{ident}"
58
+ }
59
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
60
+ body = RedCloth.new(body_text).to_html
61
+ body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
62
+ end
63
+ stat = File.stat(src)
64
+ created = stat.ctime
65
+ modified = stat.mtime
66
+
67
+ $stdout << template.result(binding)
data/scripts/txt2js ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'redcloth'
5
+ require 'syntax/convertors/html'
6
+ require 'erb'
7
+ require 'active_support'
8
+ require File.dirname(__FILE__) + '/../lib/magic_multi_connections/version.rb'
9
+
10
+ version = MagicMultiConnection::VERSION::STRING
11
+ download = 'http://rubyforge.org/projects/compositekeys'
12
+
13
+ class Fixnum
14
+ def ordinal
15
+ # teens
16
+ return 'th' if (10..19).include?(self % 100)
17
+ # others
18
+ case self % 10
19
+ when 1: return 'st'
20
+ when 2: return 'nd'
21
+ when 3: return 'rd'
22
+ else return 'th'
23
+ end
24
+ end
25
+ end
26
+
27
+ class Time
28
+ def pretty
29
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
30
+ end
31
+ end
32
+
33
+ def convert_syntax(syntax, source)
34
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
35
+ end
36
+
37
+ if ARGV.length >= 1
38
+ src, template = ARGV
39
+ template ||= File.dirname(__FILE__) + '/../website/template.js'
40
+ else
41
+ puts("Usage: #{File.split($0).last} source.txt [template.js] > output.html")
42
+ exit!
43
+ end
44
+
45
+ template = ERB.new(File.open(template).read)
46
+
47
+ title = nil
48
+ body = nil
49
+ File.open(src) do |fsrc|
50
+ title_text = fsrc.readline
51
+ body_text = fsrc.read
52
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
53
+ body = RedCloth.new(body_text)
54
+ end
55
+ stat = File.stat(src)
56
+ created = stat.ctime
57
+ modified = stat.mtime
58
+
59
+ $stdout << template.result(binding)