kakurenbo-puti 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: db851cf209d31a80217b782ac9996290d3f72de5
4
+ data.tar.gz: 6e263c0a7727470e81c790e6d6cf07d1622a63ca
5
+ SHA512:
6
+ metadata.gz: b9a1cd55cf877d33bf7a5d558e800c2a68d97369fc315388f63289d3e832beef1908ecf7d195b5d1fb2dd84280c4f3379c615bb730b944d6d3a866a39aab73cd
7
+ data.tar.gz: d62a5e2a8705d012079ca2bf54c6e69830116f37cea3372b060fbe01b140a552632ab742a2ad0b8efa3ed0640c0e73ff07e3cb9b6f61ab2b553b84e3b393d2fc
@@ -0,0 +1 @@
1
+ service_name: travis-ci
@@ -0,0 +1,22 @@
1
+ # Test report files.
2
+ /spec/reports/
3
+ /coverage/
4
+
5
+ # Documentation files.
6
+ /doc/
7
+ /_yardoc/
8
+ /.yardoc
9
+
10
+ # Temporary files.
11
+ /.bundle/
12
+ /Gemfile.lock
13
+ /pkg/
14
+ /tmp/
15
+ *.bundle
16
+ *.so
17
+ *.o
18
+ *.a
19
+ mkmf.log
20
+
21
+ # IDE files.
22
+ .idea/
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ script: bundle exec rspec
3
+ before_install:
4
+ - gem install bundler
5
+ rvm:
6
+ - 2.0.0
7
+ - 2.1.0
8
+ - 2.1.2
9
+ env:
10
+ - ACTIVE_RECORD_VERSION='~> 4.1.0'
11
+ - ACTIVE_RECORD_VERSION='~> 4.2.0'
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ if ENV['ACTIVE_RECORD_VERSION']
4
+ gem 'activerecord', ENV['ACTIVE_RECORD_VERSION']
5
+ end
6
+
7
+ # Specify your gem's dependencies in kakurenbo-puti.gemspec
8
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 alfa-jpn
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,110 @@
1
+ # Kakurenbo\-Puti
2
+ kakurenbo-puti provides an ActiveRecord-friendly soft-delete gem.
3
+ This gem does not override methods of ActiveRecord.
4
+
5
+ I think that kakurenbo-puti is cho-iketeru! (very cool!)
6
+
7
+ [![Build Status](https://travis-ci.org/alfa-jpn/kakurenbo-puti.svg?branch=master)](https://travis-ci.org/alfa-jpn/kakurenbo-puti)
8
+ [![Coverage Status](https://coveralls.io/repos/alfa-jpn/kakurenbo-puti/badge.svg)](https://coveralls.io/r/alfa-jpn/kakurenbo-puti)
9
+ [![Code Climate](https://codeclimate.com/github/alfa-jpn/kakurenbo-puti/badges/gpa.svg)](https://codeclimate.com/github/alfa-jpn/kakurenbo-puti)
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem 'kakurenbo-puti'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install kakurenbo-puti
26
+
27
+ ## Usage
28
+ At first, add `soft_destroyed_at` column to your model.
29
+
30
+ ```shell
31
+ rails g migration AddSoftDestroyedAtYourModel soft_destroyed_at:datetime:index
32
+ ```
33
+
34
+ Next, call `soft_deletable` in model.
35
+
36
+ ```ruby
37
+
38
+ class Member < ActiveRecord::Base
39
+ soft_deletable
40
+ end
41
+
42
+ ```
43
+
44
+
45
+ ### Scopes
46
+
47
+ ```ruby
48
+ # Get models without soft-deleted
49
+ Model.without_soft_destroyed
50
+
51
+ # Get models only soft-deleted
52
+ Model.only_soft_destroyed
53
+ ```
54
+
55
+ ### Soft-delete record
56
+
57
+ ```ruby
58
+ model.soft_destroy
59
+
60
+ # or
61
+ model.soft_destroy!
62
+
63
+ # check soft_destroyed
64
+ model.soft_destroyed? # => true
65
+ ```
66
+
67
+ # Restore record
68
+
69
+ ```ruby
70
+ model.restore
71
+
72
+ # or
73
+ model.restore!
74
+ ```
75
+
76
+ ## Advanced
77
+
78
+ ### Definition of the dependency
79
+ Use dependent_associations option of `soft-deletable`.
80
+
81
+ ```ruby
82
+
83
+ class Parent < ActiveRecord::Base
84
+ soft_deletable
85
+ has_many :children
86
+ end
87
+
88
+ class Child < ActiveRecord::Base
89
+ soft_deletable dependent_associations: [:soft_delete_model, :normal_model]
90
+ belongs_to :parent
91
+ end
92
+
93
+ # create instance
94
+ parent = Parent.create!
95
+ child = Child.create!
96
+
97
+ # add child
98
+ parent.children << child
99
+
100
+ child.destroyed? # false
101
+
102
+ # soft-destroy parent
103
+ parent.soft_destroy
104
+
105
+ child.destroyed? # true
106
+
107
+ ```
108
+
109
+ # License
110
+ This gem is released under the MIT license.
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'kakurenbo_puti/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'kakurenbo-puti'
8
+ spec.version = KakurenboPuti::VERSION
9
+ spec.authors = ['alfa-jpn']
10
+ spec.email = ['a.nkmr.ja@gmail.com']
11
+ spec.homepage = 'https://github.com/alfa-jpn/kakurenbo-puti'
12
+ spec.license = 'MIT'
13
+ spec.summary = <<-EOF
14
+ Lightweight soft-delete gem.
15
+ EOF
16
+ spec.description = <<-EOF
17
+ kakurenbo-puti provides an ActiveRecord-friendly soft-delete gem.
18
+ This gem does not override methods of ActiveRecord.
19
+
20
+ I think that kakurenbo-puti is cho-iketeru! (very cool!)
21
+ EOF
22
+
23
+ spec.files = `git ls-files -z`.split("\x0")
24
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
25
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
26
+ spec.require_paths = ['lib']
27
+
28
+ spec.add_dependency 'activerecord', '>= 4.1.0'
29
+
30
+ spec.add_development_dependency 'bundler', '~> 1.7'
31
+ spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'rspec', '~> 3.0.0'
33
+ spec.add_development_dependency 'yard', '~> 0.8.7.6'
34
+ spec.add_development_dependency 'sqlite3', '~> 1.3.10'
35
+ spec.add_development_dependency 'coveralls', '~> 0.7.8'
36
+ end
@@ -0,0 +1,5 @@
1
+ require 'active_record'
2
+ require 'kakurenbo_puti/version'
3
+ require 'kakurenbo_puti/active_record_base'
4
+
5
+ ActiveRecord::Base.send :extend, KakurenboPuti::ActiveRecordBase
@@ -0,0 +1,69 @@
1
+ module KakurenboPuti
2
+ # Extension module of ActiveRecord::Base
3
+ module ActiveRecordBase
4
+ # Enable soft-delete.
5
+ # @raise [StandardException] if Not found soft-deleted date column.
6
+ #
7
+ # @param [Symbol] column name of soft-deleted date column.
8
+ # @param [Array<Symbol>] dependent_associations names of dependency association.
9
+ def soft_deletable(column: :soft_destroyed_at, dependent_associations: [])
10
+ raise "`#{column}` is not defined in #{self.class.name}." unless column_names.include?(column.to_s)
11
+
12
+ define_singleton_method(:soft_delete_column) { column }
13
+ delegate :soft_delete_column, to: :class
14
+
15
+ define_model_callbacks :restore
16
+ define_model_callbacks :soft_destroy
17
+
18
+ scope :only_soft_destroyed, -> { where.not(id: without_soft_destroyed.select(:id)) }
19
+ scope :without_soft_destroyed, (lambda do
20
+ dependent_associations.inject(where(soft_delete_column => nil)) do |relation, name|
21
+ association = relation.klass.reflect_on_all_associations.find{|a| a.name == name }
22
+ if association.klass.method_defined?(:soft_delete_column)
23
+ relation.joins(name).merge(association.klass.without_soft_destroyed).references(name)
24
+ else
25
+ relation.joins(name).references(name)
26
+ end
27
+ end
28
+ end)
29
+
30
+ include InstanceMethods
31
+ end
32
+
33
+ module InstanceMethods
34
+ # Restore model.
35
+ # @return [Boolean] Return true if it is success.
36
+ def restore
37
+ true.tap { restore! }
38
+ rescue
39
+ false
40
+ end
41
+
42
+ # Restore model.
43
+ # @raise [ActiveRecordError]
44
+ def restore!
45
+ run_callbacks(:restore) { update_column soft_delete_column, nil; self }
46
+ end
47
+
48
+ # Soft-Delete model.
49
+ # @return [Boolean] Return true if it is success.
50
+ def soft_destroy
51
+ true.tap { soft_destroy! }
52
+ rescue
53
+ false
54
+ end
55
+
56
+ # Soft-Delete model.
57
+ # @raise [ActiveRecordError]
58
+ def soft_destroy!
59
+ run_callbacks(:soft_destroy) { touch soft_delete_column; self }
60
+ end
61
+
62
+ # Check if model is soft-deleted.
63
+ # @return [Boolean] Return true if model is soft-deleted.
64
+ def soft_destroyed?
65
+ self.class.only_soft_destroyed.where(id: id).exists?
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,3 @@
1
+ module KakurenboPuti
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,330 @@
1
+ require 'spec_helper'
2
+
3
+ describe KakurenboPuti::ActiveRecordBase do
4
+ define_active_record_model :NormalModel do; end
5
+
6
+ define_active_record_model :SoftDeleteModel do |t|
7
+ t.datetime :soft_destroyed_at
8
+ t.datetime :deleted_at
9
+ end
10
+
11
+ define_active_record_model :SoftDeleteChild do |t|
12
+ t.integer :soft_delete_model_id
13
+ t.integer :normal_model_id
14
+ t.datetime :soft_destroyed_at
15
+ end
16
+
17
+ let :model_class do
18
+ options_cache = model_class_options
19
+ SoftDeleteModel.tap do |klass|
20
+ klass.class_eval do
21
+ soft_deletable options_cache
22
+
23
+ before_soft_destroy :cb_mock
24
+ after_soft_destroy :cb_mock
25
+
26
+ before_restore :cb_mock
27
+ after_restore :cb_mock
28
+
29
+ define_method(:cb_mock) { true }
30
+ end
31
+ end
32
+ end
33
+
34
+ let :child_class do
35
+ options_cache = child_class_options
36
+ SoftDeleteChild.tap do |klass|
37
+ klass.class_eval do
38
+ soft_deletable options_cache
39
+ belongs_to :soft_delete_model
40
+ belongs_to :normal_model
41
+ end
42
+ end
43
+ end
44
+
45
+ let :model_class_options do
46
+ {}
47
+ end
48
+
49
+ let :child_class_options do
50
+ { dependent_associations: [:soft_delete_model, :normal_model] }
51
+ end
52
+
53
+ let! :normal_model_instance do
54
+ NormalModel.create!
55
+ end
56
+
57
+ let! :model_instance do
58
+ model_class.create!
59
+ end
60
+
61
+ let! :child_instance do
62
+ child_class.create!(soft_delete_model: model_instance, normal_model: normal_model_instance)
63
+ end
64
+
65
+ describe '.soft_delete_column' do
66
+ it 'Return column name of soft-delete' do
67
+ expect(model_class.soft_delete_column).to eq(:soft_destroyed_at)
68
+ end
69
+
70
+ context 'When with column option' do
71
+ let :model_class_options do
72
+ { column: :deleted_at }
73
+ end
74
+
75
+ it 'Return column name of option' do
76
+ expect(model_class.soft_delete_column).to eq(model_class_options[:column])
77
+ end
78
+ end
79
+ end
80
+
81
+ describe '.only_soft_destroyed' do
82
+ subject do
83
+ child_class.only_soft_destroyed
84
+ end
85
+
86
+ context 'When soft-deleted' do
87
+ it 'Return a relation without soft-deleted model.' do
88
+ expect {
89
+ child_instance.soft_destroy!
90
+ }.to change {
91
+ subject.count
92
+ }.by(1)
93
+ end
94
+ end
95
+
96
+ context 'When parent is soft-deleted' do
97
+ it 'Return a relation without parent soft-deleted model.' do
98
+ expect {
99
+ child_instance.soft_delete_model.soft_destroy!
100
+ }.to change {
101
+ subject.count
102
+ }.by(1)
103
+ end
104
+
105
+ context 'When dependent association is nothing' do
106
+ let :child_class_options do
107
+ { dependent_associations: [] }
108
+ end
109
+
110
+ it 'Return a relation with parent soft-deleted model.' do
111
+ expect {
112
+ child_instance.soft_delete_model.soft_destroy!
113
+ }.not_to change {
114
+ subject.count
115
+ }
116
+ end
117
+ end
118
+ end
119
+
120
+ context 'When parent is hard-deleted' do
121
+ it 'Return a relation without parent soft-deleted model.' do
122
+ expect {
123
+ child_instance.normal_model.destroy!
124
+ }.to change {
125
+ subject.count
126
+ }.by(1)
127
+ end
128
+
129
+ context 'When dependent association is nothing' do
130
+ let :child_class_options do
131
+ { dependent_associations: [] }
132
+ end
133
+
134
+ it 'Return a relation with parent soft-deleted model.' do
135
+ expect {
136
+ child_instance.normal_model.destroy!
137
+ }.not_to change {
138
+ subject.count
139
+ }
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '.without_soft_destroyed' do
146
+ subject do
147
+ child_class.without_soft_destroyed
148
+ end
149
+
150
+ context 'When soft-deleted' do
151
+ it 'Return a relation without soft-deleted model.' do
152
+ expect {
153
+ child_instance.soft_destroy!
154
+ }.to change {
155
+ subject.count
156
+ }.by(-1)
157
+ end
158
+ end
159
+
160
+ context 'When parent is soft-deleted' do
161
+ it 'Return a relation without parent soft-deleted model.' do
162
+ expect {
163
+ child_instance.soft_delete_model.soft_destroy!
164
+ }.to change {
165
+ subject.count
166
+ }.by(-1)
167
+ end
168
+
169
+ context 'When dependent association is nothing' do
170
+ let :child_class_options do
171
+ { dependent_associations: [] }
172
+ end
173
+
174
+ it 'Return a relation with parent soft-deleted model.' do
175
+ expect {
176
+ child_instance.soft_delete_model.soft_destroy!
177
+ }.not_to change {
178
+ subject.count
179
+ }
180
+ end
181
+ end
182
+ end
183
+
184
+ context 'When parent is hard-deleted' do
185
+ it 'Return a relation without parent soft-deleted model.' do
186
+ expect {
187
+ child_instance.normal_model.destroy!
188
+ }.to change {
189
+ subject.count
190
+ }.by(-1)
191
+ end
192
+
193
+ context 'When dependent association is nothing' do
194
+ let :child_class_options do
195
+ { dependent_associations: [] }
196
+ end
197
+
198
+ it 'Return a relation with parent soft-deleted model.' do
199
+ expect {
200
+ child_instance.normal_model.destroy!
201
+ }.not_to change {
202
+ subject.count
203
+ }
204
+ end
205
+ end
206
+ end
207
+ end
208
+
209
+ describe '#restore' do
210
+ before :each do
211
+ model_instance.soft_destroy
212
+ end
213
+
214
+ subject do
215
+ model_instance.restore
216
+ end
217
+
218
+ it 'Restore soft-deleted model.' do
219
+ expect {
220
+ subject
221
+ }.to change {
222
+ model_class.without_soft_destroyed.count
223
+ }.by(1)
224
+ end
225
+
226
+ it 'Return truethy value.' do
227
+ expect(subject).to be_truthy
228
+ end
229
+
230
+ it 'Run callbacks.' do
231
+ expect(model_instance).to receive(:cb_mock).twice
232
+ subject
233
+ end
234
+
235
+ context 'When raise exception.' do
236
+ before :each do
237
+ allow_any_instance_of(model_class).to receive(:update_column) { raise }
238
+ end
239
+
240
+ it 'Return falsey value.' do
241
+ expect(subject).to be_falsey
242
+ end
243
+ end
244
+ end
245
+
246
+ describe '#restore!' do
247
+ subject do
248
+ model_instance.restore!
249
+ end
250
+
251
+ context 'When raise exception.' do
252
+ before :each do
253
+ allow_any_instance_of(model_class).to receive(:update_column) { raise }
254
+ end
255
+
256
+ it 'Raise Error.' do
257
+ expect{ subject }.to raise_error
258
+ end
259
+ end
260
+ end
261
+
262
+ describe '#soft_delete' do
263
+ subject do
264
+ model_instance.soft_destroy
265
+ end
266
+
267
+ it 'Soft-delete model.' do
268
+ expect {
269
+ subject
270
+ }.to change {
271
+ model_class.without_soft_destroyed.count
272
+ }.by(-1)
273
+ end
274
+
275
+ it 'Return truethy value.' do
276
+ expect(subject).to be_truthy
277
+ end
278
+
279
+ it 'Run callbacks.' do
280
+ expect(model_instance).to receive(:cb_mock).twice
281
+ subject
282
+ end
283
+
284
+ context 'When raise exception.' do
285
+ before :each do
286
+ allow_any_instance_of(model_class).to receive(:touch) { raise }
287
+ end
288
+
289
+ it 'Return falsey value.' do
290
+ expect(subject).to be_falsey
291
+ end
292
+ end
293
+ end
294
+
295
+ describe '#soft_delete!' do
296
+ subject do
297
+ model_instance.soft_delete!
298
+ end
299
+
300
+ context 'When raise exception.' do
301
+ before :each do
302
+ allow_any_instance_of(model_class).to receive(:update_column) { raise }
303
+ end
304
+
305
+ it 'Raise Error.' do
306
+ expect{ subject }.to raise_error
307
+ end
308
+ end
309
+ end
310
+
311
+ describe '#soft_destroyed?' do
312
+ subject do
313
+ model_instance.soft_destroyed?
314
+ end
315
+
316
+ it 'Return falsey' do
317
+ expect(subject).to be_falsey
318
+ end
319
+
320
+ context 'When model is soft-deleted' do
321
+ before :each do
322
+ model_instance.soft_destroy!
323
+ end
324
+
325
+ it 'Return truthy' do
326
+ expect(subject).to be_truthy
327
+ end
328
+ end
329
+ end
330
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'supports/active_record_model'
4
+ require 'kakurenbo_puti'
5
+ require 'coveralls'
6
+
7
+ RSpec.configure do |config|
8
+ config.color = true
9
+ config.mock_framework = :rspec
10
+ config.before :all do
11
+ ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
12
+ end
13
+ end
14
+
15
+ Coveralls.wear!
@@ -0,0 +1,35 @@
1
+ require 'active_support'
2
+
3
+ # Use ActiveSupport::Inflector#classify
4
+ Inflector = Class.new.extend(ActiveSupport::Inflector)
5
+
6
+ # Define model of ActiveRecord.
7
+ #
8
+ # @param [Symbol] Model name.
9
+ # @yield [table] Table column definition.
10
+ def define_active_record_model(model_name, &block)
11
+ raise 'column definition block is nothing!' unless block_given?
12
+
13
+ tableize_name = Inflector.tableize(model_name)
14
+
15
+ before :all do
16
+ migration = ActiveRecord::Migration.new
17
+ migration.verbose = false
18
+ migration.create_table tableize_name, &block
19
+
20
+ mock_class = Class.new(ActiveRecord::Base) do
21
+ define_singleton_method(:name) { model_name.to_s }
22
+ reset_table_name
23
+ end
24
+
25
+ Object.const_set model_name, mock_class
26
+ end
27
+
28
+ after :all do
29
+ migration = ActiveRecord::Migration.new
30
+ migration.verbose = false
31
+ migration.drop_table tableize_name
32
+
33
+ Object.class_eval { remove_const model_name }
34
+ end
35
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#define_active_record_model' do
4
+ define_active_record_model :Drink do |t|
5
+ t.integer :price
6
+ end
7
+
8
+ it 'created Drink class.' do
9
+ expect(Object.const_defined? :Drink).to be_truthy
10
+ end
11
+
12
+ describe 'created class' do
13
+ it 'has methods of ActiveRecord.' do
14
+ expect(Drink).to respond_to(:create, :find, :where, :update_all)
15
+ end
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kakurenbo-puti
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - alfa-jpn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 3.0.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 3.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.8.7.6
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.8.7.6
83
+ - !ruby/object:Gem::Dependency
84
+ name: sqlite3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.3.10
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.3.10
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.7.8
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.7.8
111
+ description: |2
112
+ kakurenbo-puti provides an ActiveRecord-friendly soft-delete gem.
113
+ This gem does not override methods of ActiveRecord.
114
+
115
+ I think that kakurenbo-puti is cho-iketeru! (very cool!)
116
+ email:
117
+ - a.nkmr.ja@gmail.com
118
+ executables: []
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - ".coveralls.yml"
123
+ - ".gitignore"
124
+ - ".travis.yml"
125
+ - Gemfile
126
+ - LICENSE.txt
127
+ - README.md
128
+ - Rakefile
129
+ - kakurenbo-puti.gemspec
130
+ - lib/kakurenbo_puti.rb
131
+ - lib/kakurenbo_puti/active_record_base.rb
132
+ - lib/kakurenbo_puti/version.rb
133
+ - spec/kakurenbo_puti/active_record_base_spec.rb
134
+ - spec/spec_helper.rb
135
+ - spec/supports/active_record_model.rb
136
+ - spec/supports/active_record_model_spec.rb
137
+ homepage: https://github.com/alfa-jpn/kakurenbo-puti
138
+ licenses:
139
+ - MIT
140
+ metadata: {}
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ requirements: []
156
+ rubyforge_project:
157
+ rubygems_version: 2.4.5
158
+ signing_key:
159
+ specification_version: 4
160
+ summary: Lightweight soft-delete gem.
161
+ test_files:
162
+ - spec/kakurenbo_puti/active_record_base_spec.rb
163
+ - spec/spec_helper.rb
164
+ - spec/supports/active_record_model.rb
165
+ - spec/supports/active_record_model_spec.rb
166
+ has_rdoc: