hideable 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,61 @@
1
+ # Hideable
2
+
3
+ [![Build Status](https://secure.travis-ci.org/joecorcoran/hideable.png?branch=master)](http://travis-ci.org/joecorcoran/hideable)
4
+
5
+ A simple way to provide hideability to ActiveRecord models. Mark records as hidden instead of destroying them for good.
6
+
7
+ ## Use
8
+
9
+ Run the generator to create migrations for all of the models you want to hide:
10
+
11
+ $ rails generate hideable:migration Foo Bar
12
+ $ rake db:migrate
13
+
14
+ Declare your models `hideable`:
15
+
16
+ class Foo < ActiveRecord::Base
17
+ extend Hideable::ActiveRecord
18
+ hideable
19
+ end
20
+
21
+ This will add `hide!`, `unhide!` and `hidden?` instance methods and `hidden` and `not_hidden` scopes.
22
+
23
+ Hideable is designed to work in a similar way to the `:dependent` option on associations too, if that's what you want.
24
+
25
+ class Foo < ActiveRecord::Base
26
+ has_one :bar
27
+
28
+ extend Hideable::ActiveRecord
29
+ hideable :dependent => :hide
30
+ end
31
+
32
+ class Bar < ActiveRecord::Base
33
+ belongs_to :foo
34
+
35
+ extend Hideable::ActiveRecord
36
+ hideable
37
+ end
38
+
39
+ All models that you wish to hide, including dependents, must be declared as `hideable`.
40
+
41
+ > foo = Foo.not_hidden.first
42
+ > foo.hide
43
+ > foo.bar.hidden? #=> true
44
+
45
+ ## Why?
46
+
47
+ Knowing that you can hide or unhide a record is often better destroying it for good. Other gems – such as [paranoia](https://github.com/radar/paranoia) and [acts_as_paranoid](https://github.com/technoweenie/acts_as_paranoid) – do a similar job by overriding `#destroy`, which I don't like.
48
+
49
+ ## Development
50
+
51
+ Install the general dependencies, including all the versions of `activerecord` that `hideable` is tested against.
52
+
53
+ ```
54
+ $ bundle install && rake appraisal:install
55
+ ```
56
+
57
+ Run tests as follows.
58
+
59
+ ```
60
+ $ rake appraisal
61
+ ```
@@ -0,0 +1,16 @@
1
+ module Hideable
2
+ module Generators
3
+
4
+ class MigrationGenerator < Rails::Generators::Base
5
+ desc 'Generates a hideable migration for each given class.'
6
+ argument :classes, :type => :array, :default => [], :banner => 'User Post'
7
+ def exec
8
+ classes.each do |c|
9
+ table_name = c.constantize.table_name
10
+ generate('migration', "AddHiddenAtTo#{table_name.camelize} hidden_at:datetime")
11
+ end
12
+ end
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ require 'hideable/version'
2
+ require 'hideable/active_record'
3
+ require 'hideable/active_record/instance_methods'
@@ -0,0 +1,20 @@
1
+ module Hideable
2
+ module ActiveRecord
3
+
4
+ def hideable(options = {})
5
+ send :include, InstanceMethods
6
+ class_attribute :hide_dependent
7
+ self.hide_dependent = options[:dependent] == :hide ? true : false
8
+ after_save :update_hideable_dependents
9
+ end
10
+
11
+ def hidden
12
+ where(self.arel_table[:hidden_at].not_eq(nil))
13
+ end
14
+
15
+ def not_hidden
16
+ where(self.arel_table[:hidden_at].eq(nil))
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,46 @@
1
+ module Hideable
2
+ module ActiveRecord
3
+ module InstanceMethods
4
+
5
+ def hidden?
6
+ self.hidden_at.is_a?(DateTime)
7
+ end
8
+
9
+ def hide!
10
+ return if self.hidden?
11
+ self.hidden_at = DateTime.now
12
+ self.save!
13
+ end
14
+
15
+ def unhide!
16
+ return unless self.hidden?
17
+ self.hidden_at = nil
18
+ self.save!
19
+ end
20
+
21
+ private
22
+
23
+ def update_hideable_dependents
24
+ self.class.reflect_on_all_associations.each do |reflection|
25
+ if update_reflected_record?(reflection)
26
+ dependent_records = Array(self.send(reflection.name)).compact
27
+ dependent_records.each do |record|
28
+ action = self.hidden? ? :hide! : :unhide!
29
+ record.send(action) if record.respond_to?(action)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ def update_reflected_record?(reflection)
36
+ macros = [:has_many, :has_one, :has_and_belongs_to_many]
37
+ (
38
+ macros.include?(reflection.macro) &&
39
+ reflection.options[:through].nil? &&
40
+ self.class.hide_dependent == true
41
+ )
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,3 @@
1
+ module Hideable
2
+ VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hideable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joe Corcoran
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: 2.14.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 2.14.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - "~>"
36
+ - !ruby/object:Gem::Version
37
+ version: 10.1.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - "~>"
44
+ - !ruby/object:Gem::Version
45
+ version: 10.1.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: sqlite3
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 1.3.6
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.6
62
+ - !ruby/object:Gem::Dependency
63
+ name: timecop
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 0.6.1
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: 0.6.1
78
+ - !ruby/object:Gem::Dependency
79
+ name: appraisal
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: 0.5.2
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: 0.5.2
94
+ description: Enables soft-deletion in ActiveRecord by marking records as hidden
95
+ email:
96
+ - joe@tribesports.com
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - lib/generators/hideable/migration_generator.rb
102
+ - lib/hideable/active_record/instance_methods.rb
103
+ - lib/hideable/active_record.rb
104
+ - lib/hideable/version.rb
105
+ - lib/hideable.rb
106
+ - README.md
107
+ homepage: http://rubygems.org/gems/hideable
108
+ licenses: []
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project:
127
+ rubygems_version: 1.8.25
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: Don't want to destroy your records? Hide them
131
+ test_files: []