hairtrigger 0.2.5 → 0.2.6
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/README.md +1 -1
- data/lib/hair_trigger/builder.rb +1 -0
- data/lib/hair_trigger/version.rb +1 -1
- data/spec/builder_spec.rb +1 -3
- data/spec/migrations_spec.rb +40 -0
- data/spec/schema_dumper_spec.rb +68 -109
- data/spec/spec_helper.rb +83 -0
- metadata +155 -135
data/README.md
CHANGED
data/lib/hair_trigger/builder.rb
CHANGED
@@ -152,6 +152,7 @@ module HairTrigger
|
|
152
152
|
@actions.inject({}){ |hash, (key, value)| hash[key] = interpolate(value).rstrip; hash } :
|
153
153
|
interpolate(@actions).rstrip
|
154
154
|
end
|
155
|
+
all_names # ensure (component) trigger names are all cached
|
155
156
|
end
|
156
157
|
|
157
158
|
def validate!(direction = :down)
|
data/lib/hair_trigger/version.rb
CHANGED
data/spec/builder_spec.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# for this spec to work, you need to have postgres and mysql installed (in
|
4
|
+
# addition to the gems), and you should make sure that you have set up
|
5
|
+
# appropriate users and permissions. see database.yml for more info
|
6
|
+
|
7
|
+
describe "migrations" do
|
8
|
+
include_context "hairtrigger utils"
|
9
|
+
|
10
|
+
describe "migrations_current?" do
|
11
|
+
let(:adapter) { :sqlite3 }
|
12
|
+
|
13
|
+
it "should return false if there are pending model triggers" do
|
14
|
+
reset_tmp(:migration_glob => "*initial_tables*")
|
15
|
+
initialize_db
|
16
|
+
HairTrigger.should_not be_migrations_current
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should return true if migrations are current" do
|
20
|
+
# just one trigger migration
|
21
|
+
reset_tmp(:migration_glob => "20110331212*")
|
22
|
+
initialize_db
|
23
|
+
migrate_db
|
24
|
+
HairTrigger.should be_migrations_current
|
25
|
+
|
26
|
+
# or multiple
|
27
|
+
reset_tmp
|
28
|
+
initialize_db
|
29
|
+
migrate_db
|
30
|
+
HairTrigger.should be_migrations_current
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return true even if migrations haven't run" do
|
34
|
+
reset_tmp
|
35
|
+
initialize_db
|
36
|
+
migrate_db
|
37
|
+
HairTrigger.should be_migrations_current
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/spec/schema_dumper_spec.rb
CHANGED
@@ -1,125 +1,84 @@
|
|
1
|
-
require '
|
2
|
-
require 'logger'
|
3
|
-
require 'active_record/connection_adapters/postgresql_adapter'
|
4
|
-
require 'active_record/connection_adapters/mysql_adapter'
|
5
|
-
require 'active_record/connection_adapters/sqlite3_adapter'
|
6
|
-
require 'mysql2'
|
7
|
-
require 'rspec'
|
8
|
-
require 'hair_trigger'
|
9
|
-
require 'yaml'
|
1
|
+
require 'spec_helper'
|
10
2
|
|
11
3
|
# for this spec to work, you need to have postgres and mysql installed (in
|
12
4
|
# addition to the gems), and you should make sure that you have set up
|
13
5
|
# appropriate users and permissions. see database.yml for more info
|
14
6
|
|
15
|
-
describe "schema" do
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def initialize_db(adapter)
|
27
|
-
reset_tmp
|
28
|
-
config = @configs[adapter.to_s].merge({:adapter => adapter.to_s})
|
29
|
-
case adapter
|
30
|
-
when :mysql, :mysql2
|
31
|
-
ret = `echo "drop database if exists #{config['database']}; create database #{config['database']};" | mysql -u #{config['username']}`
|
32
|
-
raise "error creating database: #{ret}" unless $?.exitstatus == 0
|
33
|
-
when :postgresql
|
34
|
-
`dropdb -U #{config['username']} #{config['database']} &>/dev/null`
|
35
|
-
ret = `createdb -U #{config['username']} #{config['database']} 2>&1`
|
36
|
-
raise "error creating database: #{ret}" unless $?.exitstatus == 0
|
7
|
+
describe "schema dumping" do
|
8
|
+
include_context "hairtrigger utils"
|
9
|
+
|
10
|
+
each_adapter do
|
11
|
+
before do
|
12
|
+
reset_tmp
|
13
|
+
initialize_db
|
14
|
+
migrate_db
|
15
|
+
db_triggers.grep(/bob_count \+ 1/).size.should eql(1)
|
37
16
|
end
|
38
|
-
# Arel has an issue in that it keeps using original connection for quoting,
|
39
|
-
# etc. (which breaks stuff) unless you do this:
|
40
|
-
Arel::Visitors::ENGINE_VISITORS.delete(ActiveRecord::Base) if defined?(Arel)
|
41
|
-
ActiveRecord::Base.establish_connection(config)
|
42
|
-
ActiveRecord::Base.logger = Logger.new('/dev/null')
|
43
|
-
ActiveRecord::Migrator.migrate(HairTrigger.migration_path)
|
44
|
-
end
|
45
17
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
18
|
+
context "without schema.rb" do
|
19
|
+
it "should work" do
|
20
|
+
schema_rb = dump_schema
|
21
|
+
schema_rb.should match(/create_trigger\("users_after_insert_row_when_new_name_bob__tr", :generated => true, :compatibility => 1\)/)
|
22
|
+
schema_rb.should match(/create_trigger\("users_after_update_row_when_new_name_joe__tr", :compatibility => 1\)/)
|
23
|
+
end
|
50
24
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
25
|
+
it "should create adapter-specific triggers if no migrations exist" do
|
26
|
+
FileUtils.rm_rf(Dir.glob('tmp/migrations/*rb'))
|
27
|
+
schema_rb = dump_schema
|
28
|
+
schema_rb.should_not match(/create_trigger\(/)
|
29
|
+
schema_rb.should match(/no candidate create_trigger statement could be found, creating an adapter-specific one/)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not dump triggers in migrations that haven't run" do
|
33
|
+
# edit our model trigger, generate a new migration
|
34
|
+
replace_file_contents HairTrigger.model_path + '/user.rb',
|
35
|
+
'"UPDATE groups SET bob_count = bob_count + 1"',
|
36
|
+
'{:default => "UPDATE groups SET bob_count = bob_count + 2"}'
|
37
|
+
reset_models
|
38
|
+
|
39
|
+
HairTrigger.should_not be_migrations_current
|
40
|
+
migration = HairTrigger.generate_migration
|
41
|
+
HairTrigger.should be_migrations_current
|
42
|
+
|
43
|
+
schema_rb = dump_schema
|
44
|
+
schema_rb.should match(/bob_count \+ 1/)
|
45
|
+
schema_rb.should_not match(/bob_count \+ 2/)
|
46
|
+
end
|
47
|
+
end
|
56
48
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
io.rewind
|
62
|
-
schema_rb = io.read
|
63
|
-
schema_rb.should match(/create_trigger\("users_after_insert_row_when_new_name_bob__tr", :generated => true, :compatibility => 1\)/)
|
64
|
-
schema_rb.should match(/create_trigger\("users_after_update_row_when_new_name_joe__tr", :compatibility => 1\)/)
|
49
|
+
context "without schema.rb" do
|
50
|
+
before do
|
51
|
+
ActiveRecord::SchemaDumper.previous_schema = dump_schema
|
52
|
+
end
|
65
53
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
schema_rb2 = io.read
|
72
|
-
schema_rb2.should eql(schema_rb)
|
54
|
+
it "should work" do
|
55
|
+
schema_rb = dump_schema
|
56
|
+
schema_rb.should match(/create_trigger\("users_after_insert_row_when_new_name_bob__tr", :generated => true, :compatibility => 1\)/)
|
57
|
+
schema_rb.should match(/create_trigger\("users_after_update_row_when_new_name_joe__tr", :compatibility => 1\)/)
|
58
|
+
end
|
73
59
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
ActiveRecord::Migrator.migrate(HairTrigger.migration_path)
|
81
|
-
HairTrigger.should be_migrations_current
|
82
|
-
ActiveRecord::Base.connection.triggers.values.grep(/bob_count \+ 1/).size.should eql(0)
|
83
|
-
ActiveRecord::Base.connection.triggers.values.grep(/bob_count \+ 2/).size.should eql(1)
|
84
|
-
|
85
|
-
# schema dump, should have the updated trigger
|
86
|
-
ActiveRecord::SchemaDumper.previous_schema = schema_rb2
|
87
|
-
io = StringIO.new
|
88
|
-
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, io)
|
89
|
-
io.rewind
|
90
|
-
schema_rb3 = io.read
|
91
|
-
schema_rb3.should_not eql(schema_rb2)
|
92
|
-
schema_rb3.should match(/create_trigger\("users_after_insert_row_when_new_name_bob__tr", :generated => true, :compatibility => 1\)/)
|
93
|
-
schema_rb3.should match(/UPDATE groups SET bob_count = bob_count \+ 2/)
|
60
|
+
it "should still work even if migrations have been deleted" do
|
61
|
+
FileUtils.rm_rf(Dir.glob('tmp/migrations/*rb'))
|
62
|
+
schema_rb = dump_schema
|
63
|
+
schema_rb.should match(/create_trigger\("users_after_insert_row_when_new_name_bob__tr", :generated => true, :compatibility => 1\)/)
|
64
|
+
schema_rb.should match(/create_trigger\("users_after_update_row_when_new_name_joe__tr", :compatibility => 1\)/)
|
65
|
+
end
|
94
66
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
schema_rb4 = io.read
|
102
|
-
schema_rb4.should_not eql(schema_rb3)
|
103
|
-
schema_rb4.should eql(schema_rb2)
|
104
|
-
ActiveRecord::Base.connection.triggers.values.grep(/bob_count \+ 1/).size.should eql(1)
|
67
|
+
it "should evaluate all migrations even if they haven't run" do
|
68
|
+
# edit our model trigger, generate a new migration
|
69
|
+
replace_file_contents HairTrigger.model_path + '/user.rb',
|
70
|
+
'"UPDATE groups SET bob_count = bob_count + 1"',
|
71
|
+
'{:default => "UPDATE groups SET bob_count = bob_count + 2"}'
|
72
|
+
reset_models
|
105
73
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
io = StringIO.new
|
110
|
-
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, io)
|
111
|
-
io.rewind
|
112
|
-
schema_rb5 = io.read
|
113
|
-
schema_rb5.should eql(schema_rb4)
|
74
|
+
HairTrigger.should_not be_migrations_current
|
75
|
+
migration = HairTrigger.generate_migration
|
76
|
+
HairTrigger.should be_migrations_current
|
114
77
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
io.rewind
|
120
|
-
schema_rb6 = io.read
|
121
|
-
schema_rb6.should_not match(/create_trigger\(/)
|
122
|
-
schema_rb6.should match(/no candidate create_trigger statement could be found, creating an adapter-specific one/)
|
78
|
+
schema_rb = dump_schema
|
79
|
+
schema_rb.should match(/bob_count \+ 1/)
|
80
|
+
schema_rb.should_not match(/bob_count \+ 2/)
|
81
|
+
end
|
123
82
|
end
|
124
83
|
end
|
125
|
-
end
|
84
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'active_record'
|
3
|
+
require 'logger'
|
4
|
+
require 'hair_trigger'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
CONFIGS = YAML.load_file(File.expand_path(File.dirname(__FILE__) + '/../database.yml'))[ENV["DB_CONFIG"] || "test"]
|
8
|
+
ADAPTERS = [:mysql, :mysql2, :postgresql, :sqlite3]
|
9
|
+
|
10
|
+
def each_adapter
|
11
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
12
|
+
require 'active_record/connection_adapters/mysql_adapter'
|
13
|
+
require 'active_record/connection_adapters/sqlite3_adapter'
|
14
|
+
require 'mysql2'
|
15
|
+
|
16
|
+
ADAPTERS.each do |adapter_name|
|
17
|
+
context "under #{adapter_name}" do
|
18
|
+
let(:adapter) { adapter_name }
|
19
|
+
instance_eval &Proc.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
shared_context "hairtrigger utils" do
|
25
|
+
|
26
|
+
def reset_models
|
27
|
+
User.send :remove_instance_variable, :@triggers if Object.const_defined?('User')
|
28
|
+
load './tmp/models/user.rb' # since some tests modify it
|
29
|
+
end
|
30
|
+
|
31
|
+
def reset_tmp(options = {})
|
32
|
+
options[:migration_glob] ||= '*'
|
33
|
+
HairTrigger.model_path = 'tmp/models'
|
34
|
+
HairTrigger.migration_path = 'tmp/migrations'
|
35
|
+
FileUtils.rm_rf('tmp') if File.directory?('tmp')
|
36
|
+
FileUtils.mkdir_p(HairTrigger.model_path)
|
37
|
+
FileUtils.mkdir_p(HairTrigger.migration_path)
|
38
|
+
FileUtils.cp_r('spec/models', 'tmp')
|
39
|
+
reset_models
|
40
|
+
FileUtils.cp_r(Dir.glob("spec/migrations#{ActiveRecord::VERSION::STRING < "3.1." ? "-pre-3.1" : ""}/#{options[:migration_glob]}"), HairTrigger.migration_path)
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize_db
|
44
|
+
ActiveRecord::Base.clear_all_connections!
|
45
|
+
config = CONFIGS[adapter.to_s].merge({:adapter => adapter.to_s})
|
46
|
+
case adapter
|
47
|
+
when :mysql, :mysql2
|
48
|
+
ret = `echo "drop database if exists #{config['database']}; create database #{config['database']};" | mysql -u #{config['username']}`
|
49
|
+
raise "error creating database: #{ret}" unless $?.exitstatus == 0
|
50
|
+
when :postgresql
|
51
|
+
`dropdb -U #{config['username']} #{config['database']} &>/dev/null`
|
52
|
+
ret = `createdb -U #{config['username']} #{config['database']} 2>&1`
|
53
|
+
raise "error creating database: #{ret}" unless $?.exitstatus == 0
|
54
|
+
end
|
55
|
+
# Arel has an issue in that it keeps using original connection for quoting,
|
56
|
+
# etc. (which breaks stuff) unless you do this:
|
57
|
+
Arel::Visitors::ENGINE_VISITORS.delete(ActiveRecord::Base) if defined?(Arel)
|
58
|
+
ActiveRecord::Base.establish_connection(config)
|
59
|
+
ActiveRecord::Base.logger = Logger.new('/dev/null')
|
60
|
+
ActiveRecord::SchemaDumper.previous_schema = nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def migrate_db
|
64
|
+
ActiveRecord::Migration.verbose = false
|
65
|
+
ActiveRecord::Migrator.migrate(HairTrigger.migration_path)
|
66
|
+
end
|
67
|
+
|
68
|
+
def dump_schema
|
69
|
+
io = StringIO.new
|
70
|
+
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, io)
|
71
|
+
io.rewind
|
72
|
+
io.read
|
73
|
+
end
|
74
|
+
|
75
|
+
def db_triggers
|
76
|
+
ActiveRecord::Base.connection.triggers.values
|
77
|
+
end
|
78
|
+
|
79
|
+
def replace_file_contents(path, source, replacement)
|
80
|
+
contents = File.read(path)
|
81
|
+
File.open(path, 'w') { |f| f.write contents.sub(source, replacement) }
|
82
|
+
end
|
83
|
+
end
|
metadata
CHANGED
@@ -1,167 +1,172 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: hairtrigger
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 6
|
10
|
+
version: 0.2.6
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Jon Jensen
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2014-03-25 00:00:00 -06:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
15
22
|
name: activerecord
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '2.3'
|
22
|
-
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '3.4'
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 5
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 3
|
33
|
+
version: "2.3"
|
38
34
|
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: ruby_parser
|
39
38
|
prerelease: false
|
40
|
-
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
requirements:
|
51
|
-
- - ~>
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 2.0.6
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 13
|
45
|
+
segments:
|
46
|
+
- 3
|
47
|
+
- 5
|
48
|
+
version: "3.5"
|
54
49
|
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: ruby2ruby
|
55
53
|
prerelease: false
|
56
|
-
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
55
|
none: false
|
58
|
-
requirements:
|
56
|
+
requirements:
|
59
57
|
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 2
|
62
|
+
- 0
|
63
|
+
- 6
|
61
64
|
version: 2.0.6
|
62
|
-
|
65
|
+
type: :runtime
|
66
|
+
version_requirements: *id003
|
67
|
+
- !ruby/object:Gem::Dependency
|
63
68
|
name: rake
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ! '>='
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version: '0'
|
70
|
-
type: :development
|
71
69
|
prerelease: false
|
72
|
-
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ~>
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 2.12.0
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
86
79
|
type: :development
|
80
|
+
version_requirements: *id004
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rspec
|
87
83
|
prerelease: false
|
88
|
-
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
85
|
none: false
|
90
|
-
requirements:
|
86
|
+
requirements:
|
91
87
|
- - ~>
|
92
|
-
- !ruby/object:Gem::Version
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 63
|
90
|
+
segments:
|
91
|
+
- 2
|
92
|
+
- 12
|
93
|
+
- 0
|
93
94
|
version: 2.12.0
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: mysql
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ~>
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: 2.9.1
|
102
95
|
type: :development
|
96
|
+
version_requirements: *id005
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: mysql
|
103
99
|
prerelease: false
|
104
|
-
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
105
101
|
none: false
|
106
|
-
requirements:
|
102
|
+
requirements:
|
107
103
|
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 41
|
106
|
+
segments:
|
107
|
+
- 2
|
108
|
+
- 9
|
109
|
+
- 1
|
109
110
|
version: 2.9.1
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: mysql2
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: 0.3.11
|
118
111
|
type: :development
|
112
|
+
version_requirements: *id006
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: mysql2
|
119
115
|
prerelease: false
|
120
|
-
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- -
|
124
|
-
- !ruby/object:Gem::Version
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 5
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
- 3
|
125
|
+
- 11
|
125
126
|
version: 0.3.11
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: pg
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
version: 0.15.1
|
134
127
|
type: :development
|
128
|
+
version_requirements: *id007
|
129
|
+
- !ruby/object:Gem::Dependency
|
130
|
+
name: pg
|
135
131
|
prerelease: false
|
136
|
-
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- -
|
140
|
-
- !ruby/object:Gem::Version
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
hash: 33
|
138
|
+
segments:
|
139
|
+
- 0
|
140
|
+
- 15
|
141
|
+
- 1
|
141
142
|
version: 0.15.1
|
142
|
-
- !ruby/object:Gem::Dependency
|
143
|
-
name: sqlite3
|
144
|
-
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
|
-
requirements:
|
147
|
-
- - ! '>='
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
version: 1.3.7
|
150
143
|
type: :development
|
144
|
+
version_requirements: *id008
|
145
|
+
- !ruby/object:Gem::Dependency
|
146
|
+
name: sqlite3
|
151
147
|
prerelease: false
|
152
|
-
|
153
|
-
none: false
|
154
|
-
requirements:
|
155
|
-
- -
|
156
|
-
- !ruby/object:Gem::Version
|
148
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
149
|
+
none: false
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
hash: 21
|
154
|
+
segments:
|
155
|
+
- 1
|
156
|
+
- 3
|
157
|
+
- 7
|
157
158
|
version: 1.3.7
|
158
|
-
|
159
|
-
|
159
|
+
type: :development
|
160
|
+
version_requirements: *id009
|
161
|
+
description: allows you to declare database triggers in ruby in your models, and then generate appropriate migrations as they change
|
160
162
|
email: jenseng@gmail.com
|
161
163
|
executables: []
|
164
|
+
|
162
165
|
extensions: []
|
166
|
+
|
163
167
|
extra_rdoc_files: []
|
164
|
-
|
168
|
+
|
169
|
+
files:
|
165
170
|
- LICENSE.txt
|
166
171
|
- Rakefile
|
167
172
|
- README.md
|
@@ -183,33 +188,48 @@ files:
|
|
183
188
|
- spec/migrations-pre-3.1/20110331212003_initial_tables.rb
|
184
189
|
- spec/migrations-pre-3.1/20110331212631_user_trigger.rb
|
185
190
|
- spec/migrations-pre-3.1/20110417185102_manual_user_trigger.rb
|
191
|
+
- spec/migrations_spec.rb
|
186
192
|
- spec/models/group.rb
|
187
193
|
- spec/models/user.rb
|
188
194
|
- spec/schema_dumper_spec.rb
|
195
|
+
- spec/spec_helper.rb
|
196
|
+
has_rdoc: true
|
189
197
|
homepage: http://github.com/jenseng/hair_trigger
|
190
|
-
licenses:
|
198
|
+
licenses:
|
191
199
|
- MIT
|
192
200
|
post_install_message:
|
193
201
|
rdoc_options: []
|
194
|
-
|
202
|
+
|
203
|
+
require_paths:
|
195
204
|
- lib
|
196
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
205
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
197
206
|
none: false
|
198
|
-
requirements:
|
199
|
-
- -
|
200
|
-
- !ruby/object:Gem::Version
|
207
|
+
requirements:
|
208
|
+
- - ">="
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
hash: 57
|
211
|
+
segments:
|
212
|
+
- 1
|
213
|
+
- 8
|
214
|
+
- 7
|
201
215
|
version: 1.8.7
|
202
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
217
|
none: false
|
204
|
-
requirements:
|
205
|
-
- -
|
206
|
-
- !ruby/object:Gem::Version
|
218
|
+
requirements:
|
219
|
+
- - ">="
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
hash: 17
|
222
|
+
segments:
|
223
|
+
- 1
|
224
|
+
- 3
|
225
|
+
- 5
|
207
226
|
version: 1.3.5
|
208
227
|
requirements: []
|
228
|
+
|
209
229
|
rubyforge_project:
|
210
|
-
rubygems_version: 1.
|
230
|
+
rubygems_version: 1.6.2
|
211
231
|
signing_key:
|
212
232
|
specification_version: 3
|
213
233
|
summary: easy database triggers for active record
|
214
234
|
test_files: []
|
215
|
-
|
235
|
+
|