active_period 6.1.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.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/Gemfile +5 -0
  4. data/Gemfile.lock +36 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +342 -0
  7. data/Rakefile +10 -0
  8. data/active_period.gemspec +44 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/config/locales/en.yml +36 -0
  12. data/config/locales/fr.yml +59 -0
  13. data/lib/.DS_Store +0 -0
  14. data/lib/active_period/belongs_to/month.rb +12 -0
  15. data/lib/active_period/belongs_to/quarter.rb +12 -0
  16. data/lib/active_period/belongs_to/week.rb +12 -0
  17. data/lib/active_period/belongs_to/year.rb +12 -0
  18. data/lib/active_period/belongs_to.rb +7 -0
  19. data/lib/active_period/collection/free_period.rb +37 -0
  20. data/lib/active_period/collection/holiday_period.rb +44 -0
  21. data/lib/active_period/collection/standard_period.rb +33 -0
  22. data/lib/active_period/collection.rb +60 -0
  23. data/lib/active_period/comparable.rb +51 -0
  24. data/lib/active_period/day.rb +38 -0
  25. data/lib/active_period/free_period.rb +86 -0
  26. data/lib/active_period/has_many/days.rb +14 -0
  27. data/lib/active_period/has_many/holidays.rb +15 -0
  28. data/lib/active_period/has_many/months.rb +14 -0
  29. data/lib/active_period/has_many/quarters.rb +14 -0
  30. data/lib/active_period/has_many/weeks.rb +15 -0
  31. data/lib/active_period/has_many/years.rb +15 -0
  32. data/lib/active_period/has_many.rb +7 -0
  33. data/lib/active_period/holiday.rb +80 -0
  34. data/lib/active_period/month.rb +37 -0
  35. data/lib/active_period/period.rb +158 -0
  36. data/lib/active_period/quarter.rb +42 -0
  37. data/lib/active_period/standard_period.rb +51 -0
  38. data/lib/active_period/version.rb +5 -0
  39. data/lib/active_period/week.rb +41 -0
  40. data/lib/active_period/year.rb +34 -0
  41. data/lib/active_period.rb +28 -0
  42. data/lib/numeric.rb +6 -0
  43. data/lib/period.rb +63 -0
  44. data/lib/range.rb +8 -0
  45. metadata +146 -0
@@ -0,0 +1,42 @@
1
+ require_relative 'standard_period.rb'
2
+ require_relative 'has_many.rb'
3
+ require_relative 'has_many/days.rb'
4
+ require_relative 'has_many/weeks.rb'
5
+ require_relative 'has_many/months.rb'
6
+ require_relative 'belongs_to.rb'
7
+ require_relative 'belongs_to/year.rb'
8
+
9
+ module ActivePeriod
10
+ # @author Lucas Billaudot <billau_l@modulotech.fr>
11
+ # @note One of the StandardPeriod defined in the gem
12
+ class Quarter < ActivePeriod::StandardPeriod
13
+ include ActivePeriod::HasMany::Days
14
+ include ActivePeriod::HasMany::Weeks
15
+ include ActivePeriod::HasMany::Months
16
+
17
+ include ActivePeriod::BelongsTo::Year
18
+
19
+ def strftime(format)
20
+ format = format.gsub(':quarter', quarter_nb.to_s)
21
+ from.strftime(format)
22
+ end
23
+
24
+ def quarter_nb
25
+ @quarter_nb ||= (from.month / 3.0).ceil
26
+ end
27
+
28
+ def to_s
29
+ i18n
30
+ end
31
+
32
+ def i18n(&block)
33
+ return yield(from, to) if block.present?
34
+
35
+ I18n.t(:default_format,
36
+ scope: i18n_scope,
37
+ quarter_nb: quarter_nb,
38
+ year: from.year)
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,51 @@
1
+ module ActivePeriod
2
+ class StandardPeriod < ActivePeriod::Period
3
+
4
+ def initialize(object)
5
+ raise I18n.t(:base_class_id_abstract, scope: %i[active_period standard_period]) if self.class == StandardPeriod
6
+ time = time_parse(object, I18n.t(:date_is_invalid, scope: %i[active_period standard_period]) )
7
+ super(time.send("beginning_of_#{_period}")..time.send("end_of_#{_period}"))
8
+ end
9
+
10
+ def next
11
+ self.class.new(from.send("next_#{_period}"))
12
+ end
13
+ alias succ next
14
+
15
+ def prev
16
+ self.class.new(from.send("prev_#{_period}"))
17
+ end
18
+
19
+ def _period
20
+ self.class._period
21
+ end
22
+
23
+ # @return [String] get the name of the standard period
24
+ def self._period
25
+ name.split('::').last.downcase
26
+ end
27
+
28
+ # Don't realy return an Integer. ActiveSupport::Duration is a better numeric
29
+ # representation a in time manipulation context
30
+ # @return [ActiveSupport::Duration]
31
+ def to_i
32
+ 1.send(_period)
33
+ end
34
+
35
+ # Shift a period to the past acording to her starting point
36
+ # @return [self] A new period of the same kind
37
+ def -(duration)
38
+ self.class.new(from - duration)
39
+ end
40
+
41
+ # Shift a period to the past acording to her ending point
42
+ # @return [self] A new period of the same kind
43
+ def +(duration)
44
+ self.class.new(to + duration)
45
+ end
46
+
47
+ def i18n_scope
48
+ [:active_period, :standard_period, _period]
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,5 @@
1
+ module ActivePeriod
2
+
3
+ VERSION = '6.1.1'.freeze
4
+
5
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'standard_period.rb'
2
+ require_relative 'has_many.rb'
3
+ require_relative 'has_many/days.rb'
4
+ require_relative 'belongs_to.rb'
5
+ require_relative 'belongs_to/week.rb'
6
+ require_relative 'belongs_to/month.rb'
7
+ require_relative 'belongs_to/quarter.rb'
8
+ require_relative 'belongs_to/year.rb'
9
+
10
+ module ActivePeriod
11
+ # @author Lucas Billaudot <billau_l@modulotech.fr>
12
+ # @note One of the StandardPeriod defined in the gem
13
+ class Week < ActivePeriod::StandardPeriod
14
+ include ActivePeriod::HasMany::Days
15
+
16
+ include ActivePeriod::BelongsTo::Month
17
+ include ActivePeriod::BelongsTo::Quarter
18
+ include ActivePeriod::BelongsTo::Year
19
+
20
+ def strftime(format)
21
+ from.strftime(format)
22
+ end
23
+
24
+ def to_s(format: '%V - %G')
25
+ strftime(format)
26
+ end
27
+
28
+ def i18n(&block)
29
+ return yield(from, to) if block.present?
30
+
31
+ I18n.t(:default_format,
32
+ scope: i18n_scope,
33
+ week: strftime('%V'),
34
+ year: strftime('%G'))
35
+ end
36
+
37
+ def include_date
38
+ from + 3.days
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,34 @@
1
+ require_relative 'standard_period.rb'
2
+ require_relative 'has_many.rb'
3
+ require_relative 'has_many/days.rb'
4
+ require_relative 'has_many/weeks.rb'
5
+ require_relative 'has_many/months.rb'
6
+ require_relative 'has_many/quarters.rb'
7
+
8
+ module ActivePeriod
9
+ # @author Lucas Billaudot <billau_l@modulotech.fr>
10
+ # @note One of the StandardPeriod defined in the gem
11
+ class Year < ActivePeriod::StandardPeriod
12
+ include ActivePeriod::HasMany::Days
13
+ include ActivePeriod::HasMany::Weeks
14
+ include ActivePeriod::HasMany::Months
15
+ include ActivePeriod::HasMany::Quarters
16
+
17
+ def strftime(format)
18
+ from.strftime(format)
19
+ end
20
+
21
+ def to_s(format: '%Y')
22
+ strftime(format)
23
+ end
24
+
25
+ def i18n(&block)
26
+ return yield(from, to) if block.present?
27
+
28
+ I18n.t(:default_format,
29
+ scope: i18n_scope,
30
+ year: from.year)
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'active_period/version.rb'
2
+ require 'active_support/all'
3
+ require 'i18n'
4
+
5
+ I18n.load_path << File.expand_path("../config/locales/en.yml", __dir__)
6
+ I18n.load_path << File.expand_path("../config/locales/fr.yml", __dir__)
7
+
8
+ require_relative 'numeric.rb'
9
+ require_relative 'range.rb'
10
+ require_relative 'active_period/collection.rb'
11
+ require_relative 'active_period/collection/free_period.rb'
12
+ require_relative 'active_period/collection/standard_period.rb'
13
+ require_relative 'active_period/collection/holiday_period.rb'
14
+ require_relative 'active_period/comparable.rb'
15
+ require_relative 'active_period/period.rb'
16
+ require_relative 'active_period/free_period.rb'
17
+ require_relative 'active_period/standard_period.rb'
18
+ require_relative 'active_period/day.rb'
19
+ require_relative 'active_period/week.rb'
20
+ require_relative 'active_period/month.rb'
21
+ require_relative 'active_period/quarter.rb'
22
+ require_relative 'active_period/year.rb'
23
+ require_relative 'active_period/holiday.rb'
24
+ require_relative 'period.rb'
25
+
26
+ module ActivePeriod
27
+
28
+ end
data/lib/numeric.rb ADDED
@@ -0,0 +1,6 @@
1
+ class Numeric
2
+ def quarters
3
+ ActiveSupport::Duration.months(self * 3)
4
+ end
5
+ alias :quarter :quarters
6
+ end
data/lib/period.rb ADDED
@@ -0,0 +1,63 @@
1
+ module Period
2
+ def self.new(*args)
3
+ ActivePeriod::FreePeriod.new(*args)
4
+ end
5
+
6
+ def self.bounded(range)
7
+ ActivePeriod::FreePeriod.new(range, allow_beginless: false, allow_endless: false)
8
+ end
9
+
10
+ def self.env_time
11
+ (Time.zone || Time)
12
+ end
13
+
14
+ class << self
15
+ %i[day week month quarter year].each do |period|
16
+ define_method "last_#{period}" do
17
+ date = env_time.now.send(period == :day ? 'yesterday' : "last_#{period}")
18
+ Object.const_get("ActivePeriod::#{period.capitalize}").new(date)
19
+ end
20
+
21
+ define_method "this_#{period}" do
22
+ Object.const_get("ActivePeriod::#{period.capitalize}").new(env_time.now)
23
+ end
24
+
25
+ define_method "next_#{period}" do
26
+ date = env_time.now.send(period == :day ? 'tomorrow' : "next_#{period}")
27
+ Object.const_get("ActivePeriod::#{period.capitalize}").new(date)
28
+ end
29
+
30
+ define_method period.to_s do |range|
31
+ Object.const_get("ActivePeriod::#{period.capitalize}").new(range)
32
+ end
33
+ end
34
+
35
+ alias yesterday last_day
36
+ alias tomorrow next_day
37
+ alias today this_day
38
+
39
+ def method_missing(method_name, *arguments, &block)
40
+ super unless method_name.match?(/(last|next)_\d+_(day|week|month|quarter|year)s?(_from_now)?/)
41
+ last_next, count, klass = method_name.to_s.split('_')
42
+ klass = klass.singularize
43
+
44
+ case last_next
45
+ when 'last'
46
+ from = count.to_i.send(klass).ago.send("beginning_of_#{klass}")
47
+ to = env_time.now
48
+ to -= 1.send(klass) unless method_name.match?(/from_now$/)
49
+ to = to.send("end_of_#{klass}")
50
+ when 'next'
51
+ from = env_time.now
52
+ from += 1.send(klass) unless method_name.match?(/from_now$/)
53
+ from = from.send("beginning_of_#{klass}")
54
+ to = count.to_i.send(klass).from_now.send("end_of_#{klass}")
55
+ end
56
+ self.new(from..to)
57
+ end
58
+
59
+ def respond_to_missing?(method_name, include_private = false)
60
+ method_name.match?(/(last|next)_\d+_(day|week|month|quarter|year)s?(_from_now)?/) || super
61
+ end
62
+ end
63
+ end
data/lib/range.rb ADDED
@@ -0,0 +1,8 @@
1
+ class Range
2
+
3
+ # @return [ActivePeriod::FreePeriod] a new free period
4
+ # @raise see ActivePeriod::FreePeriod.new
5
+ def to_period
6
+ ::Period.new(self)
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_period
3
+ version: !ruby/object:Gem::Version
4
+ version: 6.1.1
5
+ platform: ruby
6
+ authors:
7
+ - billau_l
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-05-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: i18n
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ description:
70
+ email:
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - ".gitignore"
76
+ - Gemfile
77
+ - Gemfile.lock
78
+ - LICENSE.txt
79
+ - README.md
80
+ - Rakefile
81
+ - active_period.gemspec
82
+ - bin/console
83
+ - bin/setup
84
+ - config/locales/en.yml
85
+ - config/locales/fr.yml
86
+ - lib/.DS_Store
87
+ - lib/active_period.rb
88
+ - lib/active_period/belongs_to.rb
89
+ - lib/active_period/belongs_to/month.rb
90
+ - lib/active_period/belongs_to/quarter.rb
91
+ - lib/active_period/belongs_to/week.rb
92
+ - lib/active_period/belongs_to/year.rb
93
+ - lib/active_period/collection.rb
94
+ - lib/active_period/collection/free_period.rb
95
+ - lib/active_period/collection/holiday_period.rb
96
+ - lib/active_period/collection/standard_period.rb
97
+ - lib/active_period/comparable.rb
98
+ - lib/active_period/day.rb
99
+ - lib/active_period/free_period.rb
100
+ - lib/active_period/has_many.rb
101
+ - lib/active_period/has_many/days.rb
102
+ - lib/active_period/has_many/holidays.rb
103
+ - lib/active_period/has_many/months.rb
104
+ - lib/active_period/has_many/quarters.rb
105
+ - lib/active_period/has_many/weeks.rb
106
+ - lib/active_period/has_many/years.rb
107
+ - lib/active_period/holiday.rb
108
+ - lib/active_period/month.rb
109
+ - lib/active_period/period.rb
110
+ - lib/active_period/quarter.rb
111
+ - lib/active_period/standard_period.rb
112
+ - lib/active_period/version.rb
113
+ - lib/active_period/week.rb
114
+ - lib/active_period/year.rb
115
+ - lib/numeric.rb
116
+ - lib/period.rb
117
+ - lib/range.rb
118
+ homepage: https://github.com/billaul/period
119
+ licenses:
120
+ - MIT
121
+ metadata:
122
+ bug_tracker_uri: https://github.com/billaul/period/issues
123
+ homepage_uri: https://github.com/billaul/period
124
+ documentation_uri: https://github.com/billaul/period
125
+ source_code_uri: https://github.com/billaul/period
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ - config
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '2.7'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubygems_version: 3.1.2
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Manage time ranges without brain damage.
146
+ test_files: []