active_date_range 0.1.0 → 0.2.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 +4 -4
- data/.github/workflows/ruby.yml +57 -0
- data/.rubocop.yml +0 -1
- data/CHANGELOG.md +12 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +1 -1
- data/Guardfile +5 -3
- data/README.md +5 -1
- data/Rakefile +3 -1
- data/active_date_range.gemspec +6 -4
- data/bin/console +1 -0
- data/lib/active_date_range/date_range.rb +43 -10
- data/lib/active_date_range/i18n.rb +2 -0
- data/lib/active_date_range/locale/en.yml +3 -0
- data/lib/active_date_range/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39ccc9d0058b87f4924d253b5e0018b0d95b7eb1f97177e4a2b09f85a6d438e5
|
4
|
+
data.tar.gz: e80e3a5cfd455008ee8354f4342922b2b601fafabab4e7af8ad223f2a1cccf4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f16e285ad8b6075546916ef1a31342b82ae9f6e84e87ebaf6081326676be69f59c0ef72e5b85460bdc87586b403341df922e816cb54561b8834b6fb5d07828b
|
7
|
+
data.tar.gz: dbf53b90fd564dd372e8af5b3cc974521df3434d0f1a6e79ffed73a81c372b122a25e4af2d130e6b8b10c10a9a5805c920ec2a8209a6cda71ff50315c5390975
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ main ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ main ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
runs-on: ubuntu-latest
|
19
|
+
strategy:
|
20
|
+
matrix:
|
21
|
+
ruby-version: ['2.7', '3.0']
|
22
|
+
|
23
|
+
steps:
|
24
|
+
- uses: actions/checkout@v2
|
25
|
+
- name: Set up Ruby
|
26
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
27
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
28
|
+
# uses: ruby/setup-ruby@v1
|
29
|
+
uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
30
|
+
with:
|
31
|
+
ruby-version: ${{ matrix.ruby-version }}
|
32
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
33
|
+
- name: Run tests
|
34
|
+
run: bundle exec rake
|
35
|
+
|
36
|
+
lint:
|
37
|
+
runs-on: ubuntu-latest
|
38
|
+
|
39
|
+
steps:
|
40
|
+
- uses: actions/checkout@v2
|
41
|
+
- name: Set up Ruby 2.7
|
42
|
+
uses: ruby/setup-ruby@v1
|
43
|
+
with:
|
44
|
+
ruby-version: 2.7
|
45
|
+
- name: Cache gems
|
46
|
+
uses: actions/cache@v1
|
47
|
+
with:
|
48
|
+
path: vendor/bundle
|
49
|
+
key: ${{ runner.os }}-rubocop-${{ hashFiles('**/Gemfile.lock') }}
|
50
|
+
restore-keys: |
|
51
|
+
${{ runner.os }}-rubocop-
|
52
|
+
- name: Install gems
|
53
|
+
run: |
|
54
|
+
bundle config path vendor/bundle
|
55
|
+
bundle install --jobs 4 --retry 3
|
56
|
+
- name: Run RuboCop
|
57
|
+
run: bundle exec rubocop --parallel
|
data/.rubocop.yml
CHANGED
@@ -8,7 +8,6 @@ AllCops:
|
|
8
8
|
# RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
|
9
9
|
# to ignore them, so only the ones explicitly set in this file are enabled.
|
10
10
|
DisabledByDefault: true
|
11
|
-
SuggestExtensions: false
|
12
11
|
Exclude:
|
13
12
|
- '**/tmp/**/*'
|
14
13
|
- '**/templates/**/*'
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,15 @@
|
|
1
|
-
|
1
|
+
## 0.2.0
|
2
|
+
|
3
|
+
* Add support for weeks:
|
4
|
+
|
5
|
+
- Shorthands for `this_week`, `next_week` and `prev_week`
|
6
|
+
- `full_week?` and `one_week?`
|
7
|
+
- `next` and `previous` now handle weeks correctly
|
8
|
+
- Tests for biweekly calculations
|
9
|
+
|
10
|
+
*Edwin Vlieg*
|
11
|
+
|
12
|
+
## 0.1.0
|
2
13
|
|
3
14
|
* Initial import of the DateRange implementation from the internal implementation in the Moneybird code.
|
4
15
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/Guardfile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# A sample Guardfile
|
2
4
|
# More info at https://github.com/guard/guard#readme
|
3
5
|
|
@@ -19,11 +21,11 @@ clearing :on
|
|
19
21
|
|
20
22
|
guard :minitest do
|
21
23
|
# with Minitest::Unit
|
22
|
-
watch(%r{^test/(.*)
|
23
|
-
watch(%r{^test/(.*)
|
24
|
+
watch(%r{^test/(.*)/?test_(.*)\.rb$})
|
25
|
+
watch(%r{^test/(.*)/?(.*)_test\.rb$})
|
24
26
|
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
|
25
27
|
watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}#{m[2]}_test.rb" }
|
26
|
-
watch(%r{^test/test_helper\.rb$}) {
|
28
|
+
watch(%r{^test/test_helper\.rb$}) { "test" }
|
27
29
|
|
28
30
|
# with Minitest::Spec
|
29
31
|
# watch(%r{^spec/(.*)_spec\.rb$})
|
data/README.md
CHANGED
@@ -29,18 +29,21 @@ ActiveDateRange::DateRange.new(Date.new(2021, 1, 1), Date.new(2021, 12, 31))
|
|
29
29
|
ActiveDateRange::DateRange.new(Date.new(2021, 1, 1)..Date.new(2021, 12, 31))
|
30
30
|
```
|
31
31
|
|
32
|
-
You can also use shorthands to initialize a range relative to today. Shorthands are available for `this`, `prev` and `next` for the ranges `month`, `quarter` and `
|
32
|
+
You can also use shorthands to initialize a range relative to today. Shorthands are available for `this`, `prev` and `next` for the ranges `month`, `quarter`, `year` and `week`:
|
33
33
|
|
34
34
|
```ruby
|
35
35
|
ActiveDateRange::DateRange.this_month
|
36
36
|
ActiveDateRange::DateRange.this_year
|
37
37
|
ActiveDateRange::DateRange.this_quarter
|
38
|
+
ActiveDateRange::DateRange.this_week
|
38
39
|
ActiveDateRange::DateRange.prev_month
|
39
40
|
ActiveDateRange::DateRange.prev_year
|
40
41
|
ActiveDateRange::DateRange.prev_quarter
|
42
|
+
ActiveDateRange::DateRange.prev_week
|
41
43
|
ActiveDateRange::DateRange.next_month
|
42
44
|
ActiveDateRange::DateRange.next_year
|
43
45
|
ActiveDateRange::DateRange.next_quarter
|
46
|
+
ActiveDateRange::DateRange.next_week
|
44
47
|
```
|
45
48
|
|
46
49
|
The third option is to use parse:
|
@@ -71,6 +74,7 @@ date_range.months # => 12
|
|
71
74
|
date_range.quarters # => 4
|
72
75
|
date_range.years # => 1
|
73
76
|
date_range.one_month? # => false
|
77
|
+
date_range.one_week? # => false
|
74
78
|
date_range.one_year? # => true
|
75
79
|
date_range.full_year? # => true
|
76
80
|
date_range.same_year? # => true
|
data/Rakefile
CHANGED
data/active_date_range.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/active_date_range/version"
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
4
6
|
spec.name = "active_date_range"
|
@@ -9,15 +11,15 @@ Gem::Specification.new do |spec|
|
|
9
11
|
spec.summary = "DateRange for ActiveSupport"
|
10
12
|
spec.description = "ActiveDateRange provides a range of dates with a powerful API to manipulate and use date ranges in your software."
|
11
13
|
spec.homepage = "https://github.com/moneybird/active-date-range"
|
12
|
-
spec.required_ruby_version = Gem::Requirement.new(">= 2.
|
14
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
|
13
15
|
|
14
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
15
17
|
spec.metadata["source_code_uri"] = "https://github.com/moneybird/active-date-range"
|
16
|
-
spec.metadata["changelog_uri"] = "https://github.com/moneybird/active-date-range/CHANGELOG.md"
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/moneybird/active-date-range/blob/main/CHANGELOG.md"
|
17
19
|
|
18
20
|
# Specify which files should be added to the gem when it is released.
|
19
21
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
-
spec.files
|
22
|
+
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
|
21
23
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
24
|
end
|
23
25
|
spec.bindir = "exe"
|
data/bin/console
CHANGED
@@ -12,7 +12,10 @@ module ActiveDateRange
|
|
12
12
|
next_quarter: -> { DateRange.new(3.months.from_now.to_date.all_quarter) },
|
13
13
|
this_year: -> { DateRange.new(Time.zone.today.all_year) },
|
14
14
|
prev_year: -> { DateRange.new(12.months.ago.to_date.all_year) },
|
15
|
-
next_year: -> { DateRange.new(12.months.from_now.to_date.all_year) }
|
15
|
+
next_year: -> { DateRange.new(12.months.from_now.to_date.all_year) },
|
16
|
+
this_week: -> { DateRange.new(Time.zone.today.all_week) },
|
17
|
+
prev_week: -> { DateRange.new(1.week.ago.to_date.all_week) },
|
18
|
+
next_week: -> { DateRange.new(1.week.from_now.to_date.all_week) }
|
16
19
|
}.freeze
|
17
20
|
|
18
21
|
RANGE_PART_REGEXP = %r{\A(?<year>((1\d|2\d)\d\d))-?(?<month>0[1-9]|1[012])-?(?<day>[0-2]\d|3[01])?\z}
|
@@ -107,6 +110,13 @@ module ActiveDateRange
|
|
107
110
|
months / 12
|
108
111
|
end
|
109
112
|
|
113
|
+
# Returns the number of weeks on the range or nil when range is no full week
|
114
|
+
def weeks
|
115
|
+
return nil unless full_week?
|
116
|
+
|
117
|
+
days / 7
|
118
|
+
end
|
119
|
+
|
110
120
|
# Returns true when begin of the range is at the beginning of the month
|
111
121
|
def begin_at_beginning_of_month?
|
112
122
|
self.begin.day == 1
|
@@ -122,6 +132,11 @@ module ActiveDateRange
|
|
122
132
|
begin_at_beginning_of_month? && self.begin.month == 1
|
123
133
|
end
|
124
134
|
|
135
|
+
# Returns true when begin of the range is at the beginning of the week
|
136
|
+
def begin_at_beginning_of_week?
|
137
|
+
self.begin == self.begin.at_beginning_of_week
|
138
|
+
end
|
139
|
+
|
125
140
|
# Returns true when the range is exactly one month long
|
126
141
|
def one_month?
|
127
142
|
(28..31).cover?(days) &&
|
@@ -143,6 +158,12 @@ module ActiveDateRange
|
|
143
158
|
self.end == self.begin.at_end_of_year
|
144
159
|
end
|
145
160
|
|
161
|
+
def one_week?
|
162
|
+
days == 7 &&
|
163
|
+
begin_at_beginning_of_week? &&
|
164
|
+
self.end == self.begin.at_end_of_week
|
165
|
+
end
|
166
|
+
|
146
167
|
# Returns true when the range is exactly one or more months long
|
147
168
|
def full_month?
|
148
169
|
begin_at_beginning_of_month? && self.end == self.end.at_end_of_month
|
@@ -164,6 +185,13 @@ module ActiveDateRange
|
|
164
185
|
|
165
186
|
alias :full_years? :full_year?
|
166
187
|
|
188
|
+
# Returns true when the range is exactly one or more weeks long
|
189
|
+
def full_week?
|
190
|
+
begin_at_beginning_of_week? && self.end == self.end.at_end_of_week
|
191
|
+
end
|
192
|
+
|
193
|
+
alias :full_weeks? :full_week?
|
194
|
+
|
167
195
|
# Returns true when begin and end are in the same year
|
168
196
|
def same_year?
|
169
197
|
self.begin.year == self.end.year
|
@@ -196,6 +224,8 @@ module ActiveDateRange
|
|
196
224
|
:quarter
|
197
225
|
elsif one_month?
|
198
226
|
:month
|
227
|
+
elsif one_week?
|
228
|
+
:week
|
199
229
|
end
|
200
230
|
end
|
201
231
|
|
@@ -244,13 +274,17 @@ module ActiveDateRange
|
|
244
274
|
# DateRange.this_month.previous # => DateRange.prev_month
|
245
275
|
# DateRange.this_month.previous(2) # => DateRange.prev_month.previous + DateRange.prev_month
|
246
276
|
def previous(periods = 1)
|
247
|
-
if granularity
|
248
|
-
|
277
|
+
begin_date = if granularity
|
278
|
+
self.begin - periods.send(granularity)
|
249
279
|
elsif full_month?
|
250
|
-
|
280
|
+
in_groups_of(:month).first.previous(periods * months).begin
|
251
281
|
else
|
252
|
-
|
282
|
+
(self.begin - (periods * days).days)
|
253
283
|
end
|
284
|
+
|
285
|
+
begin_date = begin_date.at_beginning_of_month if full_month?
|
286
|
+
|
287
|
+
DateRange.new(begin_date, self.begin - 1.day)
|
254
288
|
end
|
255
289
|
|
256
290
|
# Returns the period next to the current period. `periods` can be raised to return more
|
@@ -259,11 +293,10 @@ module ActiveDateRange
|
|
259
293
|
# DateRange.this_month.next # => DateRange.next_month
|
260
294
|
# DateRange.this_month.next(2) # => DateRange.next_month + DateRange.next_month.next
|
261
295
|
def next(periods = 1)
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
end
|
296
|
+
end_date = self.end + (granularity ? periods.send(granularity) : days.days)
|
297
|
+
end_date = end_date.at_end_of_month if full_month?
|
298
|
+
|
299
|
+
DateRange.new(self.end + 1.day, end_date)
|
267
300
|
end
|
268
301
|
|
269
302
|
# Returns an array with date ranges containing full months/quarters/years in the current range.
|
@@ -25,12 +25,15 @@ en:
|
|
25
25
|
relative_range:
|
26
26
|
next_month: "next month"
|
27
27
|
next_quarter: "next quarter"
|
28
|
+
next_week: "next week"
|
28
29
|
next_year: "next year"
|
29
30
|
prev_month: "the previous month"
|
30
31
|
prev_quarter: "the previous quarter"
|
32
|
+
prev_week: "the previous week"
|
31
33
|
prev_year: "the previous year"
|
32
34
|
this_month: "this month"
|
33
35
|
this_quarter: "this quarter"
|
36
|
+
this_week: "this week"
|
34
37
|
this_year: "this year"
|
35
38
|
today: "today"
|
36
39
|
long_quarter: "quarter %{quarter}"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_date_range
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edwin Vlieg
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-04-
|
11
|
+
date: 2021-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -102,6 +102,7 @@ executables: []
|
|
102
102
|
extensions: []
|
103
103
|
extra_rdoc_files: []
|
104
104
|
files:
|
105
|
+
- ".github/workflows/ruby.yml"
|
105
106
|
- ".gitignore"
|
106
107
|
- ".rubocop.yml"
|
107
108
|
- ".travis.yml"
|
@@ -128,7 +129,7 @@ licenses: []
|
|
128
129
|
metadata:
|
129
130
|
homepage_uri: https://github.com/moneybird/active-date-range
|
130
131
|
source_code_uri: https://github.com/moneybird/active-date-range
|
131
|
-
changelog_uri: https://github.com/moneybird/active-date-range/CHANGELOG.md
|
132
|
+
changelog_uri: https://github.com/moneybird/active-date-range/blob/main/CHANGELOG.md
|
132
133
|
post_install_message:
|
133
134
|
rdoc_options: []
|
134
135
|
require_paths:
|
@@ -137,7 +138,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
137
138
|
requirements:
|
138
139
|
- - ">="
|
139
140
|
- !ruby/object:Gem::Version
|
140
|
-
version: 2.
|
141
|
+
version: 2.7.0
|
141
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
143
|
requirements:
|
143
144
|
- - ">="
|