calendario 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89a09aa1117a1ad2bac868c40efd513e14fb6de0fb7d5954956af9c2071b9c8d
4
- data.tar.gz: 003dabc70ca610796204de8ec3efad4357ec75090b352b6c7a20d7e72476be73
3
+ metadata.gz: dc383b592c482fbab67e016507b402e7ee9c0a66553e8e306ca4ce54b53b22dd
4
+ data.tar.gz: '08888fb132751ed44cda84da8c1f3f24b3230c4c7e89216bc153f1a6d77c09d9'
5
5
  SHA512:
6
- metadata.gz: 1fd1c4568c21d9278bdcadf849ab13bdd4b83cb5b9be5a84a741c6ab7e3097b71500a598758b4f7ca8e0f42d5d96c1692f7d534c49789b6dafd0dbd9320181cc
7
- data.tar.gz: 8e23336cd1bbc7aef8317374464b7cb7e701ebcd4d5665911d36ae4bdc3391dd51e791e48713339963575da7780db6ddfae65b630e2ed123c10eae1ad2d21467
6
+ metadata.gz: d27a34fe68a5839f9729466e337e494322be699a436995aa7fd86a22079bb39bd752f12f9c67f1efb0b137afc448301b561f08d589ac0932398a831ce60b59be
7
+ data.tar.gz: ee1d9868cf5cf3a62d8f580fb240bc18c75a0fab205dd2508fdd8d1edb2c65f01c683250a794ef45e202943fda6e7d17fef46f634a1594c3139124f7bcedc7da
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.3.0] - 2020-06-30
8
+ ### Added
9
+ - Added the concept of `Interval`. Intervals are groups of one or more months and can span multiple years
10
+
7
11
  ## [0.2.0] - 2020-06-29
8
12
  ### Changed
9
13
  - Split the year rendering into 4 classes: `YearRenderer`, `RenderedYear`, `MonthRenderer` and `RenderedMonth`
@@ -18,5 +22,5 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
18
22
  - Initial core functionality
19
23
  - Codebase maintenance tools
20
24
 
21
- [0.2.0]: https://github.com/wilsonsilva/tuga/compare/v0.1.0...v0.2.0
22
- [0.1.0]: https://github.com/wilsonsilva/tuga/compare/15adab8...v0.1.0
25
+ [0.2.0]: https://github.com/wilsonsilva/calendario/compare/v0.1.0...v0.2.0
26
+ [0.1.0]: https://github.com/wilsonsilva/calendario/compare/15adab8...v0.1.0
data/README.md CHANGED
@@ -65,6 +65,9 @@ Or install it yourself as:
65
65
 
66
66
  ## Usage
67
67
 
68
+ __WARNING:__ The API is experimental until the gem reaches the version 1.0.
69
+
70
+ ### Rendering a year
68
71
  Rendering the current year:
69
72
  ```ruby
70
73
  calendar = Calendario::Calendar.new
@@ -85,6 +88,46 @@ end
85
88
  puts rendered_calendar
86
89
  ```
87
90
 
91
+ ### Rendering a custom time interval
92
+
93
+ You can render a custom interval in any given number of columns. In the example below, we're rendering 5 months in
94
+ 2 columns and as many rows as necessary:
95
+
96
+ ```ruby
97
+ interval = Calendario::Interval.new(2020, 2, 2020, 6)
98
+ renderer = Calendario::Renderers::IntervalRenderer.new
99
+
100
+ rendered_year = renderer.render(interval, columns: 2)
101
+ puts rendered_year
102
+
103
+ # February March
104
+ # Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
105
+ # 1 1 2 3 4 5 6 7
106
+ # 2 3 4 5 6 7 8 8 9 10 11 12 13 14
107
+ # 9 10 11 12 13 14 15 15 16 17 18 19 20 21
108
+ # 16 17 18 19 20 21 22 22 23 24 25 26 27 28
109
+ # 23 24 25 26 27 28 29 29 30 31
110
+ #
111
+ #
112
+ # April May
113
+ # Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
114
+ # 1 2 3 4 1 2
115
+ # 5 6 7 8 9 10 11 3 4 5 6 7 8 9
116
+ # 12 13 14 15 16 17 18 10 11 12 13 14 15 16
117
+ # 19 20 21 22 23 24 25 17 18 19 20 21 22 23
118
+ # 26 27 28 29 30 24 25 26 27 28 29 30
119
+ # 31
120
+ #
121
+ # June
122
+ # Su Mo Tu We Th Fr Sa
123
+ # 1 2 3 4 5 6
124
+ # 7 8 9 10 11 12 13
125
+ # 14 15 16 17 18 19 20
126
+ # 21 22 23 24 25 26 27
127
+ # 28 29 30
128
+ #
129
+ ```
130
+
88
131
  ## Development
89
132
 
90
133
  After checking out the repo, run `bin/setup` to install dependencies, configure git hooks and create support files.
@@ -0,0 +1,32 @@
1
+ require 'calendario/month'
2
+
3
+ module Calendario
4
+ # A list of one or more months
5
+ class Interval
6
+ include Comparable
7
+
8
+ # Array of all months in the period
9
+ #
10
+ # @api private
11
+ # @return [Array<Month>]
12
+ #
13
+ attr_reader :months
14
+
15
+ # Initialize a time interval
16
+ #
17
+ # @api private
18
+ #
19
+ # @param [Integer] first_year The primitive representation of the first year
20
+ # @param [Integer] first_month The primitive representation of the first month
21
+ # @param [Integer] last_year The primitive representation of the last year
22
+ # @param [Integer] last_month The primitive representation of the last month
23
+ #
24
+ def initialize(first_year, first_month, last_year, last_month)
25
+ @first_year = first_year
26
+ @first_month = first_month
27
+ @last_year = last_year
28
+ @last_month = last_month
29
+ @months = (Month.new(first_year, first_month)..Month.new(last_year, last_month)).to_a
30
+ end
31
+ end
32
+ end
@@ -79,5 +79,28 @@ module Calendario
79
79
  def name
80
80
  MONTH_NAMES[month_number]
81
81
  end
82
+
83
+ # The following month
84
+ #
85
+ # @api private
86
+ # @return [Month]
87
+ #
88
+ def succ
89
+ if month_number == 12
90
+ self.class.new(year_number + 1, 1)
91
+ else
92
+ self.class.new(year_number, month_number + 1)
93
+ end
94
+ end
95
+
96
+ # Operator to sorts months in chronological order
97
+ #
98
+ # @api private
99
+ # @param [Month] other
100
+ # @return [Integer]
101
+ #
102
+ def <=>(other)
103
+ (year_number <=> other.year_number).nonzero? || month_number <=> other.month_number
104
+ end
82
105
  end
83
106
  end
@@ -0,0 +1,38 @@
1
+ module Calendario
2
+ # A cal-like representation of an interval:
3
+ #
4
+ # January February March
5
+ # Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
6
+ # 1 2 3 4 1 1 2 3 4 5 6 7
7
+ # 5 6 7 8 9 10 11 2 3 4 5 6 7 8 8 9 10 11 12 13 14
8
+ # 12 13 14 15 16 17 18 9 10 11 12 13 14 15 15 16 17 18 19 20 21
9
+ # 19 20 21 22 23 24 25 16 17 18 19 20 21 22 22 23 24 25 26 27 28
10
+ # 26 27 28 29 30 31 23 24 25 26 27 28 29 29 30 31
11
+ #
12
+ class RenderedInterval
13
+ # A list of lines representing an interval
14
+ #
15
+ # @api private
16
+ # @return [Array<String>]
17
+ #
18
+ attr_reader :lines
19
+
20
+ # Initializes a rendered interval
21
+ #
22
+ # @api private
23
+ # @param [Array<String>] lines List of lines representing an interval
24
+ #
25
+ def initialize(lines)
26
+ @lines = lines
27
+ end
28
+
29
+ # Returns the textual representation of an interval
30
+ #
31
+ # @api private
32
+ # @return [String]
33
+ #
34
+ def to_s
35
+ lines.join("\n")
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,71 @@
1
+ require 'calendario/interval'
2
+ require 'calendario/rendered_interval'
3
+ require 'calendario/renderers/month_renderer'
4
+
5
+ module Calendario
6
+ module Renderers
7
+ # Renders a time interval, line by line, in a table
8
+ class IntervalRenderer
9
+ # The space of an empty day
10
+ # @return [String]
11
+ EMPTY_DAY_SPACES = ' '.freeze
12
+
13
+ # Initializes a interval renderer
14
+ #
15
+ # @api private
16
+ # @param [MonthRenderer] month_renderer A service to render a month line by line
17
+ #
18
+ def initialize(month_renderer = MonthRenderer.new)
19
+ @month_renderer = month_renderer
20
+ end
21
+
22
+ # Formats a time interval, line by line, in a table
23
+ #
24
+ # @api private
25
+ # @param [Interval] interval The time interval to be rendered.
26
+ # @return [RenderedInterval]
27
+ #
28
+ def render(interval, columns:, &block)
29
+ month_renderer.filter = block if block_given?
30
+
31
+ lines = []
32
+ rendered_months = render_months(interval.months)
33
+
34
+ rendered_months.each_slice(columns) do |months|
35
+ 0.upto(7) { |month_line| lines << take_row(month_line, months) }
36
+ lines.push('') # Separate rows of months
37
+ end
38
+
39
+ RenderedInterval.new(lines)
40
+ end
41
+
42
+ private
43
+
44
+ # A service to render a month line by line
45
+ #
46
+ # @api private
47
+ # @return [Calendario::Renderers::MonthRenderer]
48
+ #
49
+ attr_accessor :month_renderer
50
+
51
+ # Extracts a row from a group of months
52
+ #
53
+ # @api private
54
+ # @return [Array<String>]
55
+ #
56
+ def take_row(month_line, months)
57
+ months.map { |month| month[month_line] }.join(EMPTY_DAY_SPACES)
58
+ end
59
+
60
+ # Renders a list of months
61
+ #
62
+ # @api private
63
+ # @param [Array<Month>] months The list of months to be rendered
64
+ # @return [Array<RenderedMonth>]
65
+ #
66
+ def render_months(months)
67
+ months.map { |month| month_renderer.render(month) }
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,27 +1,15 @@
1
1
  require 'calendario/rendered_year'
2
2
  require 'calendario/renderers/month_renderer'
3
+ require 'calendario/renderers/interval_renderer'
3
4
 
4
5
  module Calendario
5
6
  module Renderers
6
7
  # Renders a year, line by line, in a table of 3 columns by 4 rows
7
- class YearRenderer
8
- # The space of an empty day
9
- # @return [String]
10
- EMPTY_DAY_SPACES = ' '.freeze
11
-
8
+ class YearRenderer < IntervalRenderer
12
9
  # Number of month columns to display
13
10
  # @return [Integer]
14
11
  NUMBER_OF_MONTH_COLUMNS = 3
15
12
 
16
- # Initializes a year renderer
17
- #
18
- # @api private
19
- # @param [MonthRenderer] month_renderer A service to render a month line by line
20
- #
21
- def initialize(month_renderer = MonthRenderer.new)
22
- @month_renderer = month_renderer
23
- end
24
-
25
13
  # Formats a year, line by line, in a table of 3 columns by 4 rows
26
14
  #
27
15
  # @api private
@@ -44,22 +32,6 @@ module Calendario
44
32
 
45
33
  private
46
34
 
47
- # A service to render a month line by line
48
- #
49
- # @api private
50
- # @return [Calendario::Renderers::MonthRenderer]
51
- #
52
- attr_accessor :month_renderer
53
-
54
- # Extracts a row from a group of months
55
- #
56
- # @api private
57
- # @return [Array<String>]
58
- #
59
- def take_row(month_line, months)
60
- months.map { |month| month[month_line] }.join(EMPTY_DAY_SPACES)
61
- end
62
-
63
35
  # Centers the year in the middle of the calendar
64
36
  #
65
37
  # @api private
@@ -69,16 +41,6 @@ module Calendario
69
41
  def center_year_number(year)
70
42
  year.year_number.to_s.center(61)
71
43
  end
72
-
73
- # Renders a list of months
74
- #
75
- # @api private
76
- # @param [Array<Month>] months The list of months to be rendered
77
- # @return [Array<RenderedMonth>]
78
- #
79
- def render_months(months)
80
- months.map { |month| month_renderer.render(month) }
81
- end
82
44
  end
83
45
  end
84
46
  end
@@ -1,3 +1,3 @@
1
1
  module Calendario
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: calendario
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wilson Silva
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-28 00:00:00.000000000 Z
11
+ date: 2020-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler-audit
@@ -290,9 +290,12 @@ files:
290
290
  - calendario.gemspec
291
291
  - lib/calendario.rb
292
292
  - lib/calendario/calendar.rb
293
+ - lib/calendario/interval.rb
293
294
  - lib/calendario/month.rb
295
+ - lib/calendario/rendered_interval.rb
294
296
  - lib/calendario/rendered_month.rb
295
297
  - lib/calendario/rendered_year.rb
298
+ - lib/calendario/renderers/interval_renderer.rb
296
299
  - lib/calendario/renderers/month_renderer.rb
297
300
  - lib/calendario/renderers/year_renderer.rb
298
301
  - lib/calendario/version.rb