timelines 0.1.0
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 +7 -0
- data/README.md +52 -0
- data/Rakefile +3 -0
- data/lib/tasks/timelines_tasks.rake +4 -0
- data/lib/timelines/ephemeral.rb +52 -0
- data/lib/timelines/railtie.rb +4 -0
- data/lib/timelines/version.rb +3 -0
- data/lib/timelines.rb +6 -0
- metadata +68 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 339ae3e7d0c51c23d89e50623e47968edeea76e05f712450b8239dce582a40d9
|
4
|
+
data.tar.gz: 10a248044ed773b787dd9a0520c4198e5742fab92e0635b715dfe13fe5d23dec
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 216d2927c9597196a0978234f6745d41ba4b0f9f545b51ad7dd74acdf0fdf0aa49097809f17281969675680e7767b4eb73caa887e16d0f75707739023996cebd
|
7
|
+
data.tar.gz: 03f80b16d2d44a06086f0adb3a8c8a26cf10f549297cf4a786d7115045cb4550928f0c778a7de64fb451b219457808f7291c12ba903cb315e35ba83c8d739974
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# Timelines
|
2
|
+
I use this `Ephemeral` pattern frequently across projects to have a simple pattern for tracking the lifecycle of a record, whether it is currently active/ended/draft, and soft-deleting records to keep an audit trail.
|
3
|
+
|
4
|
+
## Usage
|
5
|
+
For an ActiveRecord model that has `started_at` and `ended_at` columns (datetime), include `Ephemeral` to give it ephemeral behavior.
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
include Timelines::Ephemeral
|
9
|
+
```
|
10
|
+
|
11
|
+
This gives you the following Instance methods:
|
12
|
+
```ruby
|
13
|
+
# Returns a boolean indicating whether the record is currently active
|
14
|
+
.active?
|
15
|
+
|
16
|
+
# Sets the record's `started_at` to the current time to indicate that it has started
|
17
|
+
.start!
|
18
|
+
|
19
|
+
# Returns a boolean indicating whether the record has started
|
20
|
+
.started?
|
21
|
+
|
22
|
+
# Sets the record's `ended_at` to the current time to indicate that it has ended
|
23
|
+
.end!
|
24
|
+
|
25
|
+
# Returns a boolean indicating whether the record has ended
|
26
|
+
.ended?
|
27
|
+
|
28
|
+
# Returns a boolean indicating whether the record is currently in a draft state (nil `started_at` and `ended_at`, or `started_at` in the future)
|
29
|
+
.draft?
|
30
|
+
|
31
|
+
# Soft-deletes the record by setting `ended_at` to the current time, removing it from the `.active` scope.
|
32
|
+
.destroy
|
33
|
+
```
|
34
|
+
|
35
|
+
And the following Class methods:
|
36
|
+
```ruby
|
37
|
+
# Soft-deletes all records by setting `ended_at` to the current time, removing them from the `.active` scope.
|
38
|
+
.self.destroy_all
|
39
|
+
```
|
40
|
+
|
41
|
+
## Installation
|
42
|
+
Add this line to your application's Gemfile:
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
gem "timelines"
|
46
|
+
```
|
47
|
+
|
48
|
+
## Contributing
|
49
|
+
Pull requests/issues are welcome on GitHub
|
50
|
+
|
51
|
+
## License
|
52
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require "active_support/concern"
|
2
|
+
|
3
|
+
module Timelines
|
4
|
+
module Ephemeral
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
scope :draft, -> { where(started_at: nil) }
|
9
|
+
scope :active, -> { where(ended_at: nil, started_at: [..Time.current]) }
|
10
|
+
scope :with_deleted, -> { unscope(where: :ended_at) }
|
11
|
+
scope :ended, -> { where.not(ended_at: nil) }
|
12
|
+
scope :deleted, -> { ended }
|
13
|
+
scope :not_deleted, -> { where(ended_at: nil) }
|
14
|
+
|
15
|
+
def active?
|
16
|
+
started? && !ended?
|
17
|
+
end
|
18
|
+
|
19
|
+
def start!
|
20
|
+
return if started_at.present?
|
21
|
+
|
22
|
+
update(started_at: Time.current)
|
23
|
+
end
|
24
|
+
|
25
|
+
def started?
|
26
|
+
!!started_at&.past?
|
27
|
+
end
|
28
|
+
|
29
|
+
def end!
|
30
|
+
destroy
|
31
|
+
end
|
32
|
+
|
33
|
+
def ended?
|
34
|
+
!!ended_at&.past?
|
35
|
+
end
|
36
|
+
|
37
|
+
def draft?
|
38
|
+
!started?
|
39
|
+
end
|
40
|
+
|
41
|
+
def destroy
|
42
|
+
return if ended_at.present?
|
43
|
+
|
44
|
+
update(ended_at: Time.current)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.destroy_all
|
48
|
+
where(ended_at: nil).update_all(ended_at: Time.current)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/timelines.rb
ADDED
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: timelines
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Craig Gilchrist
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-10-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 7.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: 7.1.0
|
27
|
+
description: Library for managing historical records.
|
28
|
+
email:
|
29
|
+
- craig.a.gilchrist@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- README.md
|
35
|
+
- Rakefile
|
36
|
+
- lib/tasks/timelines_tasks.rake
|
37
|
+
- lib/timelines.rb
|
38
|
+
- lib/timelines/ephemeral.rb
|
39
|
+
- lib/timelines/railtie.rb
|
40
|
+
- lib/timelines/version.rb
|
41
|
+
homepage: https://github.com/Craggar/timelines
|
42
|
+
licenses:
|
43
|
+
- MIT
|
44
|
+
metadata:
|
45
|
+
homepage_uri: https://github.com/Craggar/timelines
|
46
|
+
github_repo: git@github.com:Craggar/timelines.git
|
47
|
+
source_code_uri: https://github.com/Craggar/timelines
|
48
|
+
changelog_uri: https://github.com/Craggar/timelines/CHANGELOG.md
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubygems_version: 3.4.10
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Library for managing historical records.
|
68
|
+
test_files: []
|