hairtrigger 0.2.19 → 0.2.24
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.
- checksums.yaml +4 -4
- data/README.md +29 -6
- data/lib/hair_trigger.rb +38 -31
- data/lib/hair_trigger/builder.rb +16 -11
- data/lib/hair_trigger/migrator.rb +10 -8
- data/lib/hair_trigger/schema_dumper.rb +14 -14
- data/lib/hair_trigger/version.rb +1 -1
- metadata +17 -24
- data/spec/adapter_spec.rb +0 -95
- data/spec/builder_spec.rb +0 -433
- data/spec/migrations-pre-3.1/20110331212003_initial_tables.rb +0 -18
- data/spec/migrations-pre-3.1/20110331212631_user_trigger.rb +0 -18
- data/spec/migrations-pre-3.1/20110417185102_manual_user_trigger.rb +0 -10
- data/spec/migrations/20110331212003_initial_tables.rb +0 -18
- data/spec/migrations/20110331212631_user_trigger.rb +0 -18
- data/spec/migrations/20110417185102_manual_user_trigger.rb +0 -10
- data/spec/migrations_spec.rb +0 -60
- data/spec/models/group.rb +0 -3
- data/spec/models/user.rb +0 -6
- data/spec/schema_dumper_spec.rb +0 -124
- data/spec/spec_helper.rb +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3a4b255f8184decc442a9c455f5b8a5a5c9bd48
|
4
|
+
data.tar.gz: b6c202c7328de121c67161cc4d31d83926076044
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5eb6f48db749f2841ee9a0b986dbaf9cf2d93f48f687822e8a6dda52c90e45165fba783510e7fb1e5ec8a490ce4a6dd58df5f2ebd04567e3d2839f87ef82815f
|
7
|
+
data.tar.gz: c8eebfc8a7a45d4987f1d6ea5281a06c333a4eee929830a73a78521c442983b1743f14a4f677fb31de9d4a7ce6b144f67000f84cd7c068d08160ef260bb815cf
|
data/README.md
CHANGED
@@ -7,8 +7,15 @@ and a simple rake task does all the dirty work for you.
|
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
HairTrigger works with Rails 5.0 onwards. Add the following line to your Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem 'hairtrigger'
|
14
|
+
```
|
15
|
+
|
16
|
+
Then run `bundle install`
|
17
|
+
|
18
|
+
For older versions of Rails check the last [0.2 release](https://github.com/jenseng/hair_trigger/tree/v0.2.21)
|
12
19
|
|
13
20
|
## Usage
|
14
21
|
|
@@ -248,7 +255,7 @@ create.
|
|
248
255
|
|
249
256
|
## Warnings and Errors
|
250
257
|
|
251
|
-
There are a couple classes of errors: declaration errors and generation
|
258
|
+
There are a couple classes of errors: declaration errors and generation
|
252
259
|
errors/warnings.
|
253
260
|
|
254
261
|
Declaration errors happen if your trigger declaration is obviously wrong, and
|
@@ -313,10 +320,26 @@ existing trigger if you wish to redefine it.
|
|
313
320
|
* Manual `create_trigger` statements have some gotchas. See the section
|
314
321
|
"Manual triggers and :compatibility"
|
315
322
|
|
323
|
+
## Contributing
|
324
|
+
|
325
|
+
Contributions welcome! I don't write much Ruby these days 😢 (and haven't used this
|
326
|
+
gem in years 😬) but am happy to take contributions. If I'm slow to respond, don't
|
327
|
+
hesitate to @ me repeatedly, sometimes those github notifications slip through
|
328
|
+
the cracks. 😆.
|
329
|
+
|
330
|
+
If you want to add a feature/bugfix, you can rely on Travis to run the tests, but
|
331
|
+
do also run them locally (especially if you are changing supported railses/etc).
|
332
|
+
HairTrigger uses [appraisal](https://github.com/thoughtbot/appraisal) to manage all
|
333
|
+
that w/ automagical gemfiles. So the tl;dr when testing locally is:
|
334
|
+
|
335
|
+
1. make sure you have mysql and postgres installed (homebrew or whatever)
|
336
|
+
2. `bundle exec appraisal install` -- get all the dependencies
|
337
|
+
3. `bundle exec appraisal rake` -- run the specs every which way
|
338
|
+
|
316
339
|
## Compatibility
|
317
340
|
|
318
|
-
* Ruby
|
319
|
-
* Rails
|
341
|
+
* Ruby 2.3.0+
|
342
|
+
* Rails 5.0+
|
320
343
|
* PostgreSQL 8.0+
|
321
344
|
* MySQL 5.0.10+
|
322
345
|
* SQLite 3.3.8+
|
@@ -325,4 +348,4 @@ existing trigger if you wish to redefine it.
|
|
325
348
|
|
326
349
|
## Copyright
|
327
350
|
|
328
|
-
Copyright (c) 2011-
|
351
|
+
Copyright (c) 2011-2021 Jon Jensen. See LICENSE.txt for further details.
|
data/lib/hair_trigger.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ostruct'
|
2
|
+
require 'fileutils'
|
2
3
|
require 'active_record'
|
3
4
|
require 'hair_trigger/base'
|
4
5
|
require 'hair_trigger/migrator'
|
@@ -21,7 +22,7 @@ module HairTrigger
|
|
21
22
|
end
|
22
23
|
|
23
24
|
def models
|
24
|
-
if defined?(Rails)
|
25
|
+
if defined?(Rails)
|
25
26
|
Rails.application.eager_load!
|
26
27
|
else
|
27
28
|
Dir[model_path + '/*rb'].each do |model|
|
@@ -34,16 +35,24 @@ module HairTrigger
|
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
37
|
-
ActiveRecord::
|
38
|
-
ActiveRecord::Base.send(:subclasses) :
|
39
|
-
ActiveRecord::Base.descendants
|
38
|
+
ActiveRecord::Base.descendants
|
40
39
|
end
|
41
40
|
|
42
41
|
def migrator
|
43
|
-
|
44
|
-
|
45
|
-
migration_path
|
46
|
-
|
42
|
+
version = ActiveRecord::VERSION::STRING
|
43
|
+
if version >= "6.0."
|
44
|
+
migrations = ActiveRecord::MigrationContext.new(migration_path, ActiveRecord::SchemaMigration).migrations
|
45
|
+
elsif version >= "5.2."
|
46
|
+
migrations = ActiveRecord::MigrationContext.new(migration_path).migrations
|
47
|
+
else # version >= "4.0."
|
48
|
+
migrations = ActiveRecord::Migrator.migrations(migration_path)
|
49
|
+
end
|
50
|
+
|
51
|
+
if version >= "6.0."
|
52
|
+
ActiveRecord::Migrator.new(:up, migrations, ActiveRecord::SchemaMigration)
|
53
|
+
else
|
54
|
+
ActiveRecord::Migrator.new(:up, migrations)
|
55
|
+
end
|
47
56
|
end
|
48
57
|
|
49
58
|
def current_migrations(options = {})
|
@@ -52,7 +61,7 @@ module HairTrigger
|
|
52
61
|
options[:schema_rb_first] = true
|
53
62
|
options[:skip_pending_migrations] = true
|
54
63
|
end
|
55
|
-
|
64
|
+
|
56
65
|
# if we're in a db:schema:dump task (explict or kicked off by db:migrate),
|
57
66
|
# we evaluate the previous schema.rb (if it exists), and then all applied
|
58
67
|
# migrations in order (even ones older than schema.rb). this ensures we
|
@@ -69,7 +78,7 @@ module HairTrigger
|
|
69
78
|
triggers = MigrationReader.get_triggers(migration, options)
|
70
79
|
migrations << [migration, triggers] unless triggers.empty?
|
71
80
|
end
|
72
|
-
|
81
|
+
|
73
82
|
if previous_schema = (options.has_key?(:previous_schema) ? options[:previous_schema] : File.exist?(schema_rb_path) && File.read(schema_rb_path))
|
74
83
|
base_triggers = MigrationReader.get_triggers(previous_schema, options)
|
75
84
|
unless base_triggers.empty?
|
@@ -77,9 +86,9 @@ module HairTrigger
|
|
77
86
|
migrations.unshift [OpenStruct.new({:version => version}), base_triggers]
|
78
87
|
end
|
79
88
|
end
|
80
|
-
|
89
|
+
|
81
90
|
migrations = migrations.sort_by{|(migration, triggers)| migration.version} unless options[:schema_rb_first]
|
82
|
-
|
91
|
+
|
83
92
|
all_builders = []
|
84
93
|
migrations.each do |(migration, triggers)|
|
85
94
|
triggers.each do |new_trigger|
|
@@ -90,7 +99,7 @@ module HairTrigger
|
|
90
99
|
all_builders << [migration.name, new_trigger] unless new_trigger.options[:drop]
|
91
100
|
end
|
92
101
|
end
|
93
|
-
|
102
|
+
|
94
103
|
all_builders
|
95
104
|
end
|
96
105
|
|
@@ -101,27 +110,27 @@ module HairTrigger
|
|
101
110
|
def generate_migration(silent = false)
|
102
111
|
begin
|
103
112
|
canonical_triggers = current_triggers
|
104
|
-
rescue
|
113
|
+
rescue
|
105
114
|
$stderr.puts $!
|
106
115
|
exit 1
|
107
116
|
end
|
108
|
-
|
117
|
+
|
109
118
|
migrations = current_migrations
|
110
119
|
migration_names = migrations.map(&:first)
|
111
120
|
existing_triggers = migrations.map(&:last)
|
112
|
-
|
121
|
+
|
113
122
|
up_drop_triggers = []
|
114
123
|
up_create_triggers = []
|
115
124
|
down_drop_triggers = []
|
116
125
|
down_create_triggers = []
|
117
|
-
|
126
|
+
|
118
127
|
# see which triggers need to be dropped
|
119
128
|
existing_triggers.each do |existing|
|
120
129
|
next if canonical_triggers.any?{ |t| t.prepared_name == existing.prepared_name }
|
121
130
|
up_drop_triggers.concat existing.drop_triggers
|
122
131
|
down_create_triggers << existing
|
123
132
|
end
|
124
|
-
|
133
|
+
|
125
134
|
# see which triggers need to be added/replaced
|
126
135
|
(canonical_triggers - existing_triggers).each do |new_trigger|
|
127
136
|
up_create_triggers << new_trigger
|
@@ -134,28 +143,28 @@ module HairTrigger
|
|
134
143
|
down_create_triggers << existing
|
135
144
|
end
|
136
145
|
end
|
137
|
-
|
146
|
+
|
138
147
|
return if up_drop_triggers.empty? && up_create_triggers.empty?
|
139
148
|
|
140
149
|
migration_name = infer_migration_name(migration_names, up_create_triggers, up_drop_triggers)
|
141
150
|
migration_version = infer_migration_version(migration_name)
|
142
151
|
file_name = migration_path + '/' + migration_version + "_" + migration_name.underscore + ".rb"
|
143
|
-
|
144
|
-
File.open(file_name, "w"){ |f| f.write <<-
|
152
|
+
FileUtils.mkdir_p migration_path
|
153
|
+
File.open(file_name, "w") { |f| f.write <<-RUBY }
|
145
154
|
# This migration was auto-generated via `rake db:generate_trigger_migration'.
|
146
155
|
# While you can edit this file, any changes you make to the definitions here
|
147
156
|
# will be undone by the next auto-generated trigger migration.
|
148
157
|
|
149
|
-
class #{migration_name} < ActiveRecord::Migration
|
150
|
-
def
|
158
|
+
class #{migration_name} < ActiveRecord::Migration[#{ActiveRecord::Migration.current_version}]
|
159
|
+
def up
|
151
160
|
#{(up_drop_triggers + up_create_triggers).map{ |t| t.to_ruby(' ') }.join("\n\n").lstrip}
|
152
161
|
end
|
153
162
|
|
154
|
-
def
|
163
|
+
def down
|
155
164
|
#{(down_drop_triggers + down_create_triggers).map{ |t| t.to_ruby(' ') }.join("\n\n").lstrip}
|
156
165
|
end
|
157
166
|
end
|
158
|
-
|
167
|
+
RUBY
|
159
168
|
file_name
|
160
169
|
end
|
161
170
|
|
@@ -217,11 +226,9 @@ end
|
|
217
226
|
end
|
218
227
|
end
|
219
228
|
|
220
|
-
|
221
|
-
|
222
|
-
ActiveRecord::Migrator.send :extend, HairTrigger::Migrator
|
223
|
-
else
|
229
|
+
ActiveSupport.on_load(:active_record) do
|
230
|
+
ActiveRecord::Base.send :extend, HairTrigger::Base
|
224
231
|
ActiveRecord::Migration.send :include, HairTrigger::Migrator
|
232
|
+
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval { include HairTrigger::Adapter }
|
233
|
+
ActiveRecord::SchemaDumper.class_eval { include HairTrigger::SchemaDumper }
|
225
234
|
end
|
226
|
-
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval { include HairTrigger::Adapter }
|
227
|
-
ActiveRecord::SchemaDumper.class_eval { include HairTrigger::SchemaDumper }
|
data/lib/hair_trigger/builder.rb
CHANGED
@@ -137,22 +137,22 @@ module HairTrigger
|
|
137
137
|
methods.each do |method|
|
138
138
|
class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
139
139
|
alias #{method}_orig #{method}
|
140
|
-
def #{method}(*args)
|
140
|
+
def #{method}(*args, &block)
|
141
141
|
@chained_calls << :#{method}
|
142
142
|
if @triggers || @trigger_group
|
143
143
|
@errors << ["mysql doesn't support #{method} within a trigger group", :mysql] unless [:name, :where, :all, :of].include?(:#{method})
|
144
144
|
end
|
145
|
-
set_#{method}(*args, &(block_given? ?
|
145
|
+
set_#{method}(*args, &(block_given? ? block : nil))
|
146
146
|
end
|
147
|
-
def set_#{method}(*args)
|
147
|
+
def set_#{method}(*args, &block)
|
148
148
|
if @triggers # i.e. each time we say t.something within a trigger group block
|
149
149
|
@chained_calls.pop # the subtrigger will get this, we don't need it
|
150
150
|
@chained_calls = @chained_calls.uniq
|
151
151
|
@triggers << trigger = clone
|
152
|
-
trigger.#{method}(*args, &(block_given? ?
|
152
|
+
trigger.#{method}(*args, &(block_given? ? block : nil))
|
153
153
|
else
|
154
|
-
#{method}_orig(*args)
|
155
|
-
maybe_execute(&
|
154
|
+
#{method}_orig(*args, &block)
|
155
|
+
maybe_execute(&block) if block_given?
|
156
156
|
self
|
157
157
|
end
|
158
158
|
end
|
@@ -335,10 +335,11 @@ module HairTrigger
|
|
335
335
|
block.call(self)
|
336
336
|
raise DeclarationError, "trigger group did not define any triggers" if @triggers.empty?
|
337
337
|
else
|
338
|
-
@actions =
|
339
|
-
|
340
|
-
actions.
|
341
|
-
|
338
|
+
@actions =
|
339
|
+
case (actions = block.call)
|
340
|
+
when Hash then actions.map { |key, action| [key, ensure_semicolon(action)] }.to_h
|
341
|
+
else ensure_semicolon(actions)
|
342
|
+
end
|
342
343
|
end
|
343
344
|
# only the top-most block actually executes
|
344
345
|
if !@trigger_group
|
@@ -350,6 +351,10 @@ module HairTrigger
|
|
350
351
|
self
|
351
352
|
end
|
352
353
|
|
354
|
+
def ensure_semicolon(action)
|
355
|
+
action && action !~ /;\s*\z/ ? action.sub(/(\s*)\z/, ';\1') : action
|
356
|
+
end
|
357
|
+
|
353
358
|
def validate_names!
|
354
359
|
subtriggers = all_triggers(false)
|
355
360
|
named_subtriggers = subtriggers.select{ |t| t.options[:name] }
|
@@ -427,7 +432,7 @@ END;
|
|
427
432
|
raise GenerationError, "declare cannot be used in conjunction with nowrap" if options[:nowrap] && options[:declare]
|
428
433
|
raise GenerationError, "security cannot be used in conjunction with nowrap" if options[:nowrap] && options[:security]
|
429
434
|
raise GenerationError, "where can only be used in conjunction with nowrap on postgres 9.0 and greater" if options[:nowrap] && prepared_where && db_version < 90000
|
430
|
-
raise GenerationError, "of can only be used in conjunction with nowrap on postgres 9.1 and greater" if options[:nowrap] && options[:of] && db_version <
|
435
|
+
raise GenerationError, "of can only be used in conjunction with nowrap on postgres 9.1 and greater" if options[:nowrap] && options[:of] && db_version < 90100
|
431
436
|
|
432
437
|
sql = ''
|
433
438
|
|
@@ -1,23 +1,25 @@
|
|
1
1
|
module HairTrigger
|
2
2
|
module Migrator
|
3
|
-
def proper_table_name_with_hash_awareness(*args)
|
4
|
-
name = args.first
|
5
|
-
return name if name.is_a?(Hash)
|
6
|
-
proper_table_name_without_hash_awareness(*args)
|
7
|
-
end
|
8
|
-
|
9
3
|
class << self
|
4
|
+
module ProperTableNameWithHashAwarenessSupport
|
5
|
+
def proper_table_name(*args)
|
6
|
+
name = args.first
|
7
|
+
return name if name.is_a?(Hash)
|
8
|
+
super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
10
12
|
def extended(base)
|
11
13
|
base.class_eval do
|
12
14
|
class << self
|
13
|
-
|
15
|
+
prepend ProperTableNameWithHashAwarenessSupport
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
20
|
def included(base)
|
19
21
|
base.instance_eval do
|
20
|
-
|
22
|
+
prepend ProperTableNameWithHashAwarenessSupport
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module HairTrigger
|
2
2
|
module SchemaDumper
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
module TrailerWithTriggersSupport
|
4
|
+
def trailer(stream)
|
5
|
+
orig_show_warnings = Builder.show_warnings
|
6
|
+
Builder.show_warnings = false # we already show them when running the migration
|
7
|
+
triggers(stream)
|
8
|
+
super
|
9
|
+
ensure
|
10
|
+
Builder.show_warnings = orig_show_warnings
|
11
|
+
end
|
11
12
|
end
|
12
13
|
|
13
14
|
def triggers(stream)
|
@@ -54,7 +55,7 @@ module HairTrigger
|
|
54
55
|
stream.puts " # no candidate create_trigger statement could be found, creating an adapter-specific one"
|
55
56
|
end
|
56
57
|
if definition =~ /\n/
|
57
|
-
stream.print " execute(<<-
|
58
|
+
stream.print " execute(<<-SQL)\n#{definition.rstrip}\n SQL\n\n"
|
58
59
|
else
|
59
60
|
stream.print " execute(#{definition.inspect})\n\n"
|
60
61
|
end
|
@@ -66,7 +67,7 @@ module HairTrigger
|
|
66
67
|
def normalize_trigger(name, definition, type)
|
67
68
|
@adapter_name = @connection.adapter_name.downcase.to_sym
|
68
69
|
|
69
|
-
return definition unless @adapter_name == :postgresql
|
70
|
+
return definition unless @adapter_name == :postgresql || @adapter_name == :postgis
|
70
71
|
# because postgres does not preserve the original CREATE TRIGGER/
|
71
72
|
# FUNCTION statements, its decompiled reconstruction will not match
|
72
73
|
# ours. we work around it by creating our generated trigger/function,
|
@@ -97,10 +98,9 @@ module HairTrigger
|
|
97
98
|
|
98
99
|
def self.included(base)
|
99
100
|
base.class_eval do
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
101
|
+
prepend TrailerWithTriggersSupport
|
102
|
+
|
103
|
+
class_attribute :previous_schema
|
104
104
|
end
|
105
105
|
end
|
106
106
|
end
|
data/lib/hair_trigger/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hairtrigger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Jensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,42 +16,48 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '7'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
29
|
+
version: '5.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '7'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: ruby_parser
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: '3.
|
39
|
+
version: '3.10'
|
34
40
|
type: :runtime
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
44
|
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version: '3.
|
46
|
+
version: '3.10'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: ruby2ruby
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: '2.
|
53
|
+
version: '2.4'
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '2.
|
60
|
+
version: '2.4'
|
55
61
|
description: allows you to declare database triggers in ruby in your models, and then
|
56
62
|
generate appropriate migrations as they change
|
57
63
|
email: jenseng@gmail.com
|
@@ -73,19 +79,6 @@ files:
|
|
73
79
|
- lib/hair_trigger/version.rb
|
74
80
|
- lib/hairtrigger.rb
|
75
81
|
- lib/tasks/hair_trigger.rake
|
76
|
-
- spec/adapter_spec.rb
|
77
|
-
- spec/builder_spec.rb
|
78
|
-
- spec/migrations-pre-3.1/20110331212003_initial_tables.rb
|
79
|
-
- spec/migrations-pre-3.1/20110331212631_user_trigger.rb
|
80
|
-
- spec/migrations-pre-3.1/20110417185102_manual_user_trigger.rb
|
81
|
-
- spec/migrations/20110331212003_initial_tables.rb
|
82
|
-
- spec/migrations/20110331212631_user_trigger.rb
|
83
|
-
- spec/migrations/20110417185102_manual_user_trigger.rb
|
84
|
-
- spec/migrations_spec.rb
|
85
|
-
- spec/models/group.rb
|
86
|
-
- spec/models/user.rb
|
87
|
-
- spec/schema_dumper_spec.rb
|
88
|
-
- spec/spec_helper.rb
|
89
82
|
homepage: http://github.com/jenseng/hair_trigger
|
90
83
|
licenses:
|
91
84
|
- MIT
|
@@ -98,15 +91,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
91
|
requirements:
|
99
92
|
- - ">="
|
100
93
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
94
|
+
version: 2.3.0
|
102
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
96
|
requirements:
|
104
97
|
- - ">="
|
105
98
|
- !ruby/object:Gem::Version
|
106
|
-
version:
|
99
|
+
version: '0'
|
107
100
|
requirements: []
|
108
101
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.5.
|
102
|
+
rubygems_version: 2.5.2.3
|
110
103
|
signing_key:
|
111
104
|
specification_version: 4
|
112
105
|
summary: easy database triggers for active record
|