time_for_a_boolean 0.0.4 → 0.2.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.
- checksums.yaml +5 -5
- data/README.md +19 -5
- data/lib/time_for_a_boolean.rb +19 -11
- data/lib/time_for_a_boolean/version.rb +1 -1
- data/spec/time_for_a_boolean_spec.rb +55 -5
- data/time_for_a_boolean.gemspec +18 -17
- metadata +25 -13
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: af337b26f0dc5ce70747c5146b92e0a115d987ed835cd3131e42aca5611bb58c
|
4
|
+
data.tar.gz: 59329bac85be78bad931c35fd629278d5676419f2ae8aeaba13c1e7312f55695
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a78da81585e4c74ec3a3560308020390b3a089726d9461796a9a9b0481f38f9f5de88710e276a9a08d241059942542e8bfa0630d317e8a55be18ef1a800d2eb
|
7
|
+
data.tar.gz: e9ae065b1573973fc993ec6a918a770261383baa36b41cd0b09dbc77cab9cf40e917bd3c2fffb032c58246585e109e22f379997826d1457150e6901b502164b3
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Time for A Boolean
|
2
2
|
==================
|
3
3
|
|
4
|
-
[](https://travis-ci.org/calebthompson/time_for_a_boolean)
|
5
|
+
[](https://codeclimate.com/github/calebthompson/time_for_a_boolean)
|
6
|
+
[](https://coveralls.io/r/calebthompson/time_for_a_boolean)
|
7
7
|
|
8
8
|
|
9
9
|
> Sally: Hey, we need to add a flag to Post
|
@@ -63,9 +63,9 @@ methods are defined:
|
|
63
63
|
|
64
64
|
| Method | Description
|
65
65
|
| --------------- | -----------
|
66
|
-
| `Post#deleted` | `true` if `Post#deleted_at` is set
|
66
|
+
| `Post#deleted` | `true` if `Post#deleted_at` is set to a time before `Time.current`, `false` otherwise
|
67
67
|
| `Post#deleted?` | Alias for `Post#deleted`
|
68
|
-
| `Post#deleted=` | Sets the timestamp to `
|
68
|
+
| `Post#deleted=` | Sets the timestamp to `Time.current` if the new value is true, and `nil` otherwise
|
69
69
|
|
70
70
|
These methods allow you to use a timestamp as you would a boolean value in your
|
71
71
|
application.
|
@@ -77,3 +77,17 @@ Okay... why?
|
|
77
77
|
* `COUNT(posts.deleted_at)` gives you the count of deleted posts, which is
|
78
78
|
useful when writing a report. Define and use `Post.deleted.count` when you
|
79
79
|
have Ruby available.
|
80
|
+
|
81
|
+
Other Options
|
82
|
+
-------------
|
83
|
+
|
84
|
+
If you have a date or time column that does not follow the `attribute_at` convention,
|
85
|
+
you can specify the attribute name:
|
86
|
+
|
87
|
+
```
|
88
|
+
class User < ActiveRecord::Base
|
89
|
+
time_for_a_boolean :expires, :expires_on
|
90
|
+
end
|
91
|
+
```
|
92
|
+
|
93
|
+
This is especially useful when using date only columns.
|
data/lib/time_for_a_boolean.rb
CHANGED
@@ -1,20 +1,28 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "active_support/core_ext/module/delegation"
|
2
|
+
require "active_support/core_ext/time/calculations"
|
3
|
+
require "active_model/type"
|
4
|
+
require "time_for_a_boolean/version"
|
5
|
+
require "time_for_a_boolean/railtie"
|
4
6
|
|
5
7
|
module TimeForABoolean
|
6
|
-
def time_for_a_boolean(attribute)
|
8
|
+
def time_for_a_boolean(attribute, field=:"#{attribute}_at")
|
7
9
|
define_method(attribute) do
|
8
|
-
!send(
|
9
|
-
send("#{attribute}_at") <= -> { DateTime.current }.()
|
10
|
+
!send(field).nil? && send(field) <= -> { Time.current }.()
|
10
11
|
end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
alias_method :"#{attribute}?", attribute
|
14
|
+
|
15
|
+
setter_attribute = :"#{field}="
|
16
|
+
define_method(:"#{attribute}=") do |value|
|
17
|
+
if ActiveModel::Type::Boolean::FALSE_VALUES.include?(value)
|
18
|
+
send(setter_attribute, nil)
|
15
19
|
else
|
16
|
-
send(
|
20
|
+
send(setter_attribute, -> { Time.current }.())
|
17
21
|
end
|
18
22
|
end
|
23
|
+
|
24
|
+
define_method(:"#{attribute}!") do
|
25
|
+
send(:"#{attribute}=", true)
|
26
|
+
end
|
19
27
|
end
|
20
28
|
end
|
@@ -22,6 +22,12 @@ describe TimeForABoolean do
|
|
22
22
|
expect(klass.new).to respond_to :attribute=
|
23
23
|
end
|
24
24
|
|
25
|
+
it 'defines the bangable method to act as an implicit writer' do
|
26
|
+
klass.time_for_a_boolean :attribute
|
27
|
+
|
28
|
+
expect(klass.new).to respond_to :attribute!
|
29
|
+
end
|
30
|
+
|
25
31
|
describe 'attribute method' do
|
26
32
|
it 'calls nil? on the backing timestamp' do
|
27
33
|
klass.time_for_a_boolean :attribute
|
@@ -35,7 +41,7 @@ describe TimeForABoolean do
|
|
35
41
|
|
36
42
|
it 'is true if the attribute is not nil' do
|
37
43
|
klass.time_for_a_boolean :attribute
|
38
|
-
allow(object).to receive(:attribute_at).and_return(
|
44
|
+
allow(object).to receive(:attribute_at).and_return(Time.now - 10)
|
39
45
|
|
40
46
|
expect(object.attribute).to be_truthy
|
41
47
|
end
|
@@ -53,6 +59,39 @@ describe TimeForABoolean do
|
|
53
59
|
|
54
60
|
expect(object.attribute).to be_falsey
|
55
61
|
end
|
62
|
+
|
63
|
+
context 'when the user has defined their own attribute name' do
|
64
|
+
it 'calls nil? on the backing value' do
|
65
|
+
klass.time_for_a_boolean :attribute, :attribute_on
|
66
|
+
date = double(nil?: true)
|
67
|
+
allow(object).to receive(:attribute_on).and_return(date)
|
68
|
+
|
69
|
+
object.attribute
|
70
|
+
|
71
|
+
expect(date).to have_received(:nil?)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'is true if the attribute is not nil' do
|
75
|
+
klass.time_for_a_boolean :attribute, :attribute_on
|
76
|
+
allow(object).to receive(:attribute_on).and_return(Date.current - 10)
|
77
|
+
|
78
|
+
expect(object.attribute).to be_truthy
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'is false if the attribute is nil' do
|
82
|
+
klass.time_for_a_boolean :attribute, :attribute_on
|
83
|
+
allow(object).to receive(:attribute_on)
|
84
|
+
|
85
|
+
expect(object.attribute).to be_falsey
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'is false if the attribute date is in the future' do
|
89
|
+
klass.time_for_a_boolean :attribute, :attribute_on
|
90
|
+
allow(object).to receive(:attribute_on).and_return(Date.current + 1)
|
91
|
+
|
92
|
+
expect(object.attribute).to be_falsey
|
93
|
+
end
|
94
|
+
end
|
56
95
|
end
|
57
96
|
|
58
97
|
describe 'the query method' do
|
@@ -70,14 +109,14 @@ describe TimeForABoolean do
|
|
70
109
|
|
71
110
|
object.attribute = true
|
72
111
|
|
73
|
-
expect(object.attribute_at).to be_kind_of(
|
112
|
+
expect(object.attribute_at).to be_kind_of(Time)
|
74
113
|
end
|
75
114
|
|
76
115
|
it 'sets the timestamp to nil if value is false' do
|
77
116
|
klass.time_for_a_boolean :attribute
|
78
117
|
klass.send(:attr_accessor, :attribute_at)
|
79
118
|
|
80
|
-
object.attribute_at =
|
119
|
+
object.attribute_at = Time.now
|
81
120
|
object.attribute = false
|
82
121
|
|
83
122
|
expect(object.attribute_at).to be_nil
|
@@ -89,20 +128,31 @@ describe TimeForABoolean do
|
|
89
128
|
|
90
129
|
object.attribute = '1'
|
91
130
|
|
92
|
-
expect(object.attribute_at).to be_kind_of(
|
131
|
+
expect(object.attribute_at).to be_kind_of(Time)
|
93
132
|
end
|
94
133
|
|
95
134
|
it 'works with other representations of false' do
|
96
135
|
klass.time_for_a_boolean :attribute
|
97
136
|
klass.send(:attr_accessor, :attribute_at)
|
98
137
|
|
99
|
-
object.attribute_at =
|
138
|
+
object.attribute_at = Time.now
|
100
139
|
object.attribute = '0'
|
101
140
|
|
102
141
|
expect(object.attribute_at).to be_nil
|
103
142
|
end
|
104
143
|
end
|
105
144
|
|
145
|
+
describe 'the bangable method' do
|
146
|
+
it 'sets the timestamp to now' do
|
147
|
+
klass.time_for_a_boolean :attribute
|
148
|
+
klass.send(:attr_accessor, :attribute_at)
|
149
|
+
|
150
|
+
object.attribute!
|
151
|
+
|
152
|
+
expect(object.attribute_at).to be_kind_of(Time)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
106
156
|
def klass
|
107
157
|
@klass ||= Class.new do
|
108
158
|
extend TimeForABoolean
|
data/time_for_a_boolean.gemspec
CHANGED
@@ -1,29 +1,30 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "time_for_a_boolean/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
7
|
+
spec.name = "time_for_a_boolean"
|
8
|
+
spec.version = TimeForABoolean::VERSION
|
9
|
+
spec.authors = ["Caleb Thompson"]
|
10
|
+
spec.email = ["caleb@calebthompson.io"]
|
11
11
|
spec.description = <<-DESCRIPTION
|
12
12
|
Use timestamp values to represent boolean data such as deleted, published,
|
13
13
|
or subscribed.
|
14
14
|
DESCRIPTION
|
15
|
-
spec.summary
|
16
|
-
spec.homepage
|
17
|
-
spec.license
|
15
|
+
spec.summary = "Back boolean values with timestamps"
|
16
|
+
spec.homepage = "https://github.com/calebthompson/time_for_a_boolean"
|
17
|
+
spec.license = "MIT"
|
18
18
|
|
19
|
-
spec.files
|
20
|
-
spec.test_files
|
21
|
-
spec.require_paths = [
|
19
|
+
spec.files = `git ls-files`.split($/)
|
20
|
+
spec.test_files = spec.files.grep(%r{^spec/})
|
21
|
+
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.add_dependency
|
23
|
+
spec.add_dependency "activerecord"
|
24
|
+
spec.add_dependency "railties"
|
24
25
|
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
26
|
+
spec.add_development_dependency "bundler"
|
27
|
+
spec.add_development_dependency "coveralls"
|
28
|
+
spec.add_development_dependency "rake"
|
29
|
+
spec.add_development_dependency "rspec"
|
29
30
|
end
|
metadata
CHANGED
@@ -1,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_for_a_boolean
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Caleb Thompson
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: railties
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
@@ -28,16 +42,16 @@ dependencies:
|
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- - "
|
45
|
+
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
47
|
+
version: '0'
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- - "
|
52
|
+
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: coveralls
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -91,7 +105,6 @@ extra_rdoc_files: []
|
|
91
105
|
files:
|
92
106
|
- ".gitignore"
|
93
107
|
- ".ruby-gemset"
|
94
|
-
- ".ruby-version"
|
95
108
|
- CONTRIBUTING.md
|
96
109
|
- Gemfile
|
97
110
|
- LICENSE
|
@@ -106,7 +119,7 @@ homepage: https://github.com/calebthompson/time_for_a_boolean
|
|
106
119
|
licenses:
|
107
120
|
- MIT
|
108
121
|
metadata: {}
|
109
|
-
post_install_message:
|
122
|
+
post_install_message:
|
110
123
|
rdoc_options: []
|
111
124
|
require_paths:
|
112
125
|
- lib
|
@@ -121,9 +134,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
134
|
- !ruby/object:Gem::Version
|
122
135
|
version: '0'
|
123
136
|
requirements: []
|
124
|
-
|
125
|
-
|
126
|
-
signing_key:
|
137
|
+
rubygems_version: 3.1.2
|
138
|
+
signing_key:
|
127
139
|
specification_version: 4
|
128
140
|
summary: Back boolean values with timestamps
|
129
141
|
test_files:
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.1.2
|