active_table 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/.gitignore +4 -0
- data/Gemfile +5 -0
- data/Rakefile +45 -0
- data/active_table.gemspec +23 -0
- data/gemfiles/Gemfile.common +9 -0
- data/gemfiles/rspec1/Gemfile +5 -0
- data/gemfiles/rspec2/Gemfile +6 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool_extensions.rb +9 -0
- data/lib/active_table/base.rb +32 -0
- data/lib/active_table/version.rb +3 -0
- data/lib/active_table.rb +4 -0
- data/spec/active_table_spec.rb +107 -0
- data/spec/spec_helper.rb +15 -0
- metadata +104 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
environments = %w[rspec1 rspec2]
|
5
|
+
major, minor, revision = RUBY_VERSION.split(".").map{|str| str.to_i }
|
6
|
+
|
7
|
+
in_environment = lambda do |environment, command|
|
8
|
+
sh %Q{export BUNDLE_GEMFILE="gemfiles/#{environment}/Gemfile"; bundle --quiet && bundle exec #{command}}
|
9
|
+
end
|
10
|
+
|
11
|
+
in_all_environments = lambda do |command|
|
12
|
+
environments.each do |environment|
|
13
|
+
puts "\n---#{environment}---\n"
|
14
|
+
in_environment.call(environment, command)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
autotest_styles = {
|
19
|
+
:rspec1 => 'rspec',
|
20
|
+
:rspec2 => 'rspec2'
|
21
|
+
}
|
22
|
+
|
23
|
+
desc "Run all specs against Rspec 1 and 2"
|
24
|
+
task "spec" do
|
25
|
+
in_environment.call('rspec1', 'spec spec') if major == 1 && minor < 9
|
26
|
+
in_environment.call('rspec2', 'rspec spec')
|
27
|
+
end
|
28
|
+
|
29
|
+
namespace "autotest" do
|
30
|
+
environments.each do |environment|
|
31
|
+
desc "Run autotest in #{environment}"
|
32
|
+
task environment do
|
33
|
+
in_environment.call(environment, "autotest -s #{autotest_styles[environment.to_sym]}")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
namespace "doc" do
|
39
|
+
desc "Generate README and preview in browser"
|
40
|
+
task "readme" do
|
41
|
+
sh "rdoc -c utf8 README.rdoc && open doc/files/README_rdoc.html"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
task :default => :spec
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "active_table/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "active_table"
|
7
|
+
s.version = ActiveTable::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Case Commons LLC"]
|
10
|
+
s.email = ["casecommons-dev@googlegroups.com"]
|
11
|
+
s.homepage = "https://github.com/Casecommons/active_table"
|
12
|
+
s.summary = %q{Dynamically-populated ActiveRecord models based on static data}
|
13
|
+
s.description = s.summary
|
14
|
+
|
15
|
+
s.rubyforge_project = "active_table"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency 'activerecord', '>=2.3.5', '<4.0.0'
|
23
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module ActiveTable
|
2
|
+
class Base < ActiveRecord::Base
|
3
|
+
@@tables = {}
|
4
|
+
def self.create_table(name, options = {}, &block)
|
5
|
+
class_name = self.name
|
6
|
+
@@tables[class_name] = {:name => name, :options => options, :block => block, :rows => []}
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.insert(params)
|
10
|
+
class_name = self.name
|
11
|
+
@@tables[class_name][:rows] << params
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.create_tables(connection)
|
15
|
+
@@tables.each_value do |table|
|
16
|
+
connection.create_table table[:name], table[:options].merge(:temporary => true) do |t|
|
17
|
+
table[:block].call(t)
|
18
|
+
end
|
19
|
+
|
20
|
+
table[:rows].each do |row|
|
21
|
+
connection.execute generate_insert_sql_for_hash(connection, table[:name], row)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.generate_insert_sql_for_hash(connection, table_name, params)
|
27
|
+
keys = params.keys.map {|k| connection.quote(k.to_s)}.join(", ")
|
28
|
+
values = params.values.map {|v| connection.quote(v.to_s)}.join(", ")
|
29
|
+
"INSERT INTO #{connection.quote(table_name.to_s)} (#{keys}) VALUES (#{values})"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/active_table.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "a temporary ActiveRecord model created with with_model" do
|
4
|
+
before(:each) do
|
5
|
+
@connection_pool = ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ":memory:")
|
6
|
+
end
|
7
|
+
|
8
|
+
after(:each) do
|
9
|
+
@connection_pool.disconnect!
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should inherit from ActiveRecord::Base" do
|
13
|
+
ActiveTable::Base.superclass.should == ActiveRecord::Base
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when a connection is opened" do
|
17
|
+
it "should create a table from its model definition" do
|
18
|
+
class TemporaryModel < ActiveTable::Base
|
19
|
+
create_table :temporary_models do |t|
|
20
|
+
t.string :name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
connection = @connection_pool.connection
|
25
|
+
|
26
|
+
lambda {
|
27
|
+
connection.execute("SELECT * FROM temporary_models")
|
28
|
+
}.should_not raise_error
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should create multiple tables at the same time" do
|
32
|
+
class TemporaryModel < ActiveTable::Base
|
33
|
+
create_table :temporary_models do |t|
|
34
|
+
t.string :name
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class TemporaryModelTwo < ActiveTable::Base
|
39
|
+
create_table :temporary_models_two do |t|
|
40
|
+
t.string :name
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
connection = @connection_pool.connection
|
45
|
+
|
46
|
+
lambda {
|
47
|
+
connection.execute("SELECT * FROM temporary_models")
|
48
|
+
connection.execute("SELECT * FROM temporary_models_two")
|
49
|
+
}.should_not raise_error
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should insert rows of data specified within the model" do
|
53
|
+
class TemporaryModel < ActiveTable::Base
|
54
|
+
create_table :temporary_models do |t|
|
55
|
+
t.string :name
|
56
|
+
end
|
57
|
+
|
58
|
+
insert :id => 1, :name => "foo"
|
59
|
+
insert :id => 4, :name => "baz"
|
60
|
+
end
|
61
|
+
|
62
|
+
connection = @connection_pool.connection
|
63
|
+
|
64
|
+
connection.execute("SELECT * FROM temporary_models").size.should == 2
|
65
|
+
connection.execute("SELECT * FROM temporary_models WHERE id = 1").first["name"].should == "foo"
|
66
|
+
connection.execute("SELECT * FROM temporary_models WHERE name = 'baz'").first["id"].should == 4
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when inserting data" do
|
71
|
+
it "should handle apostrophes without blowing up" do
|
72
|
+
class TemporaryModel < ActiveTable::Base
|
73
|
+
create_table :temporary_models do |t|
|
74
|
+
t.string :name
|
75
|
+
end
|
76
|
+
|
77
|
+
insert :id => 1, :name => "foo's the boss?"
|
78
|
+
end
|
79
|
+
|
80
|
+
connection = @connection_pool.connection
|
81
|
+
|
82
|
+
connection.execute("SELECT * FROM temporary_models WHERE id = 1").first["name"].should == "foo's the boss?"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "with multiple connections" do
|
87
|
+
it "should create a temporary table for each connection" do
|
88
|
+
class TemporaryModel < ActiveTable::Base
|
89
|
+
create_table :temporary_models do |t|
|
90
|
+
t.string :name
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
connections = []
|
95
|
+
3.times do
|
96
|
+
connections << @connection_pool.checkout
|
97
|
+
end
|
98
|
+
|
99
|
+
connections.first.should_not == connections.last
|
100
|
+
connections.each do |connection|
|
101
|
+
lambda {
|
102
|
+
connection.execute("SELECT * FROM temporary_models")
|
103
|
+
}.should_not raise_error
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "active_record"
|
2
|
+
require "active_table"
|
3
|
+
|
4
|
+
if defined?(RSpec)
|
5
|
+
# For RSpec 2 users.
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.extend ActiveTable
|
8
|
+
end
|
9
|
+
else
|
10
|
+
# For RSpec 1 users.
|
11
|
+
Spec::Runner.configure do |config|
|
12
|
+
config.extend ActiveTable
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: active_table
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Case Commons LLC
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-06-08 00:00:00 -04:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: activerecord
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 9
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 3
|
33
|
+
- 5
|
34
|
+
version: 2.3.5
|
35
|
+
- - <
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
hash: 63
|
38
|
+
segments:
|
39
|
+
- 4
|
40
|
+
- 0
|
41
|
+
- 0
|
42
|
+
version: 4.0.0
|
43
|
+
type: :runtime
|
44
|
+
version_requirements: *id001
|
45
|
+
description: Dynamically-populated ActiveRecord models based on static data
|
46
|
+
email:
|
47
|
+
- casecommons-dev@googlegroups.com
|
48
|
+
executables: []
|
49
|
+
|
50
|
+
extensions: []
|
51
|
+
|
52
|
+
extra_rdoc_files: []
|
53
|
+
|
54
|
+
files:
|
55
|
+
- .gitignore
|
56
|
+
- Gemfile
|
57
|
+
- Rakefile
|
58
|
+
- active_table.gemspec
|
59
|
+
- gemfiles/Gemfile.common
|
60
|
+
- gemfiles/rspec1/Gemfile
|
61
|
+
- gemfiles/rspec2/Gemfile
|
62
|
+
- lib/active_record/connection_adapters/abstract/connection_pool_extensions.rb
|
63
|
+
- lib/active_table.rb
|
64
|
+
- lib/active_table/base.rb
|
65
|
+
- lib/active_table/version.rb
|
66
|
+
- spec/active_table_spec.rb
|
67
|
+
- spec/spec_helper.rb
|
68
|
+
has_rdoc: true
|
69
|
+
homepage: https://github.com/Casecommons/active_table
|
70
|
+
licenses: []
|
71
|
+
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
hash: 3
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
hash: 3
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
version: "0"
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project: active_table
|
98
|
+
rubygems_version: 1.3.7
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: Dynamically-populated ActiveRecord models based on static data
|
102
|
+
test_files:
|
103
|
+
- spec/active_table_spec.rb
|
104
|
+
- spec/spec_helper.rb
|