dcal 0.0.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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +58 -0
- data/Rakefile +11 -0
- data/bin/dcal +19 -0
- data/dcal.gemspec +22 -0
- data/lib/dcal.rb +5 -0
- data/lib/dcal/cal.rb +55 -0
- data/lib/dcal/month.rb +65 -0
- data/lib/dcal/version.rb +3 -0
- data/lib/dcal/year.rb +50 -0
- data/test/dcal/test_cal.rb +9 -0
- data/test/dcal/test_cal_new.rb +20 -0
- data/test/dcal/test_cal_output.rb +47 -0
- data/test/dcal/test_month.rb +46 -0
- data/test/dcal/test_year.rb +53 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: 929e76bf2d797ce1cdbf15b077d397d64553b887
|
4
|
+
data.tar.gz: 96a0f887abd1de03f012d48cf5847e2cdfaf4b8c
|
5
|
+
!binary "U0hBNTEy":
|
6
|
+
metadata.gz: 294834412be578f0cd64c8b357f35f9049dfdf74dcb0f23866938f1100f366f1910d5f95c422ca514ef5885f81b4f36a522ac287da529925f44fe07014fc1b3e
|
7
|
+
data.tar.gz: ad815acb41453c041b765fa9da9ed62c17dcf772c22cbb93b88745a4b2e32d2894beb1fb12e72a51919e720b539b64631855a8ae598c11e431588d4e34b95461
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Chun-wei Kuo
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# DCal
|
2
|
+
|
3
|
+
Just a stupid `cal`.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Please do not install it.
|
8
|
+
|
9
|
+
If you insist to do so:
|
10
|
+
|
11
|
+
$ gem install dcal
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
The `dcal` command would be installed with the gem.
|
16
|
+
|
17
|
+
It works almost like the `cal` command, but stupider.
|
18
|
+
|
19
|
+
Provide it the numbers of month and year:
|
20
|
+
|
21
|
+
$ dcal 12 2012
|
22
|
+
|
23
|
+
And the output would be like:
|
24
|
+
|
25
|
+
```
|
26
|
+
December 2012
|
27
|
+
Su Mo Tu We Th Fr Sa
|
28
|
+
1
|
29
|
+
2 3 4 5 6 7 8
|
30
|
+
9 10 11 12 13 14 15
|
31
|
+
16 17 18 19 20 21 22
|
32
|
+
23 24 25 26 27 28 29
|
33
|
+
30 31
|
34
|
+
```
|
35
|
+
|
36
|
+
No any other fancier functionality.
|
37
|
+
|
38
|
+
## Compatibility
|
39
|
+
|
40
|
+
Compatible with Ruby 2.0.0-dev.
|
41
|
+
|
42
|
+
Please install Bundler 1.3.0+ by running:
|
43
|
+
|
44
|
+
$ gem install bundler --pre
|
45
|
+
|
46
|
+
## Todo
|
47
|
+
|
48
|
+
This section is intentionally left blank.
|
49
|
+
|
50
|
+
## License
|
51
|
+
|
52
|
+
Copyright (c) 2012 Chun-wei Kuo
|
53
|
+
|
54
|
+
MIT License
|
55
|
+
|
56
|
+
See [LICENSE] for futher details.
|
57
|
+
|
58
|
+
[LICENSE]: https://github.com/Domon/dcal/blob/master/LICENSE.txt
|
data/Rakefile
ADDED
data/bin/dcal
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding: utf-8 -*-
|
3
|
+
|
4
|
+
require 'dcal'
|
5
|
+
|
6
|
+
month = ARGV[0]
|
7
|
+
year = ARGV[1]
|
8
|
+
|
9
|
+
unless month && year
|
10
|
+
puts "usage: cal month year"
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
cal = DCal::Cal.new month, year
|
16
|
+
print cal.output
|
17
|
+
rescue RangeError => e
|
18
|
+
puts "dcal: #{e.message}"
|
19
|
+
end
|
data/dcal.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dcal/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'dcal'
|
8
|
+
gem.version = DCal::VERSION
|
9
|
+
gem.summary = 'Just a stupid cal.'
|
10
|
+
gem.description = 'Just a stupid cal.'
|
11
|
+
|
12
|
+
gem.license = 'MIT'
|
13
|
+
|
14
|
+
gem.author = 'Chun-wei Kuo'
|
15
|
+
gem.email = 'Dendoh@gmail.com'
|
16
|
+
gem.homepage = 'https://github.com/Domon/dcal'
|
17
|
+
|
18
|
+
gem.files = `git ls-files`.split($/)
|
19
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
20
|
+
gem.test_files = gem.files.grep(%r{^test/})
|
21
|
+
gem.require_path = 'lib'
|
22
|
+
end
|
data/lib/dcal.rb
ADDED
data/lib/dcal/cal.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'dcal/month'
|
2
|
+
|
3
|
+
module DCal
|
4
|
+
class Cal
|
5
|
+
ABBR_DAYNAMES = %w(Su Mo Tu We Th Fr Sa)
|
6
|
+
|
7
|
+
def initialize(month, year)
|
8
|
+
@month = DCal::Month.new(month, year)
|
9
|
+
@year = DCal::Year.new(year)
|
10
|
+
end
|
11
|
+
|
12
|
+
def output
|
13
|
+
title + "\n" +
|
14
|
+
header + "\n" +
|
15
|
+
weeks + "\n"
|
16
|
+
end
|
17
|
+
|
18
|
+
def month
|
19
|
+
@month.month
|
20
|
+
end
|
21
|
+
|
22
|
+
def year
|
23
|
+
@year
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def title
|
29
|
+
"#{@month.name} #{@year}".center(20)
|
30
|
+
end
|
31
|
+
|
32
|
+
def header
|
33
|
+
ABBR_DAYNAMES.join(" ")
|
34
|
+
end
|
35
|
+
|
36
|
+
def weeks
|
37
|
+
weeks = cells.each_slice(7).to_a
|
38
|
+
weeks.map { |week| week.join(" ") }.join("\n")
|
39
|
+
end
|
40
|
+
|
41
|
+
def cells
|
42
|
+
cells = Array.new(42, " ")
|
43
|
+
|
44
|
+
days = 1..@month.days_in_month
|
45
|
+
start = @month.wday_of_first_day
|
46
|
+
|
47
|
+
cells.each_index do |i|
|
48
|
+
day = i - start + 1
|
49
|
+
cells[i] = day.to_s.rjust(2) if days.cover?(day)
|
50
|
+
end
|
51
|
+
|
52
|
+
cells
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/dcal/month.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'dcal/year'
|
2
|
+
|
3
|
+
module DCal
|
4
|
+
class Month
|
5
|
+
attr_reader :month, :year
|
6
|
+
|
7
|
+
MONTHNAMES = [
|
8
|
+
nil,
|
9
|
+
"January", "February", "March",
|
10
|
+
"April", "May", "June",
|
11
|
+
"July", "August", "September",
|
12
|
+
"October", "November", "December"
|
13
|
+
]
|
14
|
+
|
15
|
+
COMMON_YEAR_DAYS_IN_MONTH = [
|
16
|
+
nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
|
17
|
+
]
|
18
|
+
|
19
|
+
def initialize(month, year)
|
20
|
+
@month = month.to_i
|
21
|
+
@year = DCal::Year.new(year.to_i)
|
22
|
+
|
23
|
+
unless (1..12).cover? @month
|
24
|
+
raise RangeError, "#{@month} is not a month number (1..12)"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def name
|
29
|
+
MONTHNAMES[@month]
|
30
|
+
end
|
31
|
+
|
32
|
+
def days_since_1970
|
33
|
+
(@year - 1970) * 365 + @year.leap_years_since_1970 + passed_days_this_year
|
34
|
+
end
|
35
|
+
|
36
|
+
def days_in_month
|
37
|
+
return 29 if @month == 2 && @year.leap?
|
38
|
+
COMMON_YEAR_DAYS_IN_MONTH[@month]
|
39
|
+
end
|
40
|
+
|
41
|
+
def wday_of_first_day
|
42
|
+
# 1970-01-01 is Thursday (4).
|
43
|
+
(days_since_1970 + 4) % 7
|
44
|
+
end
|
45
|
+
|
46
|
+
# For inspect
|
47
|
+
def to_s
|
48
|
+
"#{@year}-#{@month}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# For better output in console
|
52
|
+
def inspect
|
53
|
+
"#<#{self.class.name} #{to_s}>"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def passed_days_this_year
|
59
|
+
return 0 if @month == 1
|
60
|
+
(1...@month).reduce(0) { |sum, m| sum + DCal::Month.new(m, @year).days_in_month }
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
data/lib/dcal/version.rb
ADDED
data/lib/dcal/year.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
module DCal
|
2
|
+
class Year
|
3
|
+
include Comparable
|
4
|
+
|
5
|
+
def initialize(value)
|
6
|
+
@value = value.to_i
|
7
|
+
|
8
|
+
unless (1970..9999).cover? @value
|
9
|
+
raise RangeError, "year #{@value} not in range 1970..9999"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def leap?
|
14
|
+
# ref: http://en.wikipedia.org/wiki/Leap_year#Algorithm
|
15
|
+
@value % 400 == 0 || (@value % 100 != 0 && @value % 4 == 0)
|
16
|
+
end
|
17
|
+
|
18
|
+
def leap_years_since_1970
|
19
|
+
return 0 if @value == 1970
|
20
|
+
(1970...@value).select { |y| DCal::Year.new(y).leap? }.size
|
21
|
+
end
|
22
|
+
|
23
|
+
def <=>(other)
|
24
|
+
if other.integer?
|
25
|
+
to_i <=> other
|
26
|
+
else
|
27
|
+
to_i <=> other.to_i
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def -(integer)
|
32
|
+
to_i - integer
|
33
|
+
end
|
34
|
+
|
35
|
+
# For calculations
|
36
|
+
def to_i
|
37
|
+
@value
|
38
|
+
end
|
39
|
+
|
40
|
+
# For inspect
|
41
|
+
def to_s
|
42
|
+
@value.to_s
|
43
|
+
end
|
44
|
+
|
45
|
+
# For better output in console
|
46
|
+
def inspect
|
47
|
+
"#<#{self.class.name} #{to_s}>"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'dcal'
|
3
|
+
|
4
|
+
class TestCalNew < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@cal = DCal::Cal.new 12, 2012
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_new
|
10
|
+
assert_instance_of DCal::Cal, @cal
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_month
|
14
|
+
assert_equal 12, @cal.month
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_year
|
18
|
+
assert_equal 2012, @cal.year
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'dcal'
|
3
|
+
|
4
|
+
class TestCalOutput < Test::Unit::TestCase
|
5
|
+
def test_output
|
6
|
+
output_1_1970 = <<-OUTPUT
|
7
|
+
January 1970
|
8
|
+
Su Mo Tu We Th Fr Sa
|
9
|
+
1 2 3
|
10
|
+
4 5 6 7 8 9 10
|
11
|
+
11 12 13 14 15 16 17
|
12
|
+
18 19 20 21 22 23 24
|
13
|
+
25 26 27 28 29 30 31
|
14
|
+
|
15
|
+
OUTPUT
|
16
|
+
|
17
|
+
output_8_1998 = <<-OUTPUT
|
18
|
+
August 1998
|
19
|
+
Su Mo Tu We Th Fr Sa
|
20
|
+
1
|
21
|
+
2 3 4 5 6 7 8
|
22
|
+
9 10 11 12 13 14 15
|
23
|
+
16 17 18 19 20 21 22
|
24
|
+
23 24 25 26 27 28 29
|
25
|
+
30 31
|
26
|
+
OUTPUT
|
27
|
+
|
28
|
+
output_12_2012 = <<-OUTPUT
|
29
|
+
December 2012
|
30
|
+
Su Mo Tu We Th Fr Sa
|
31
|
+
1
|
32
|
+
2 3 4 5 6 7 8
|
33
|
+
9 10 11 12 13 14 15
|
34
|
+
16 17 18 19 20 21 22
|
35
|
+
23 24 25 26 27 28 29
|
36
|
+
30 31
|
37
|
+
OUTPUT
|
38
|
+
|
39
|
+
cal_1_1970 = DCal::Cal.new( 1, 1970)
|
40
|
+
cal_8_1998 = DCal::Cal.new( 8, 1998)
|
41
|
+
cal_12_2012 = DCal::Cal.new(12, 2012)
|
42
|
+
|
43
|
+
assert_equal output_1_1970, cal_1_1970.output
|
44
|
+
assert_equal output_8_1998, cal_8_1998.output
|
45
|
+
assert_equal output_12_2012, cal_12_2012.output
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'dcal'
|
3
|
+
|
4
|
+
class TestMonth < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@month = DCal::Month.new(1, 1970)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_constants
|
10
|
+
assert_nil DCal::Month::COMMON_YEAR_DAYS_IN_MONTH[0]
|
11
|
+
assert_equal 31, DCal::Month::COMMON_YEAR_DAYS_IN_MONTH[1]
|
12
|
+
assert_equal 13 , DCal::Month::COMMON_YEAR_DAYS_IN_MONTH.size
|
13
|
+
|
14
|
+
assert_nil DCal::Month::MONTHNAMES[0]
|
15
|
+
assert_equal 'January', DCal::Month::MONTHNAMES[1]
|
16
|
+
assert_equal 13 , DCal::Month::MONTHNAMES.size
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_new
|
20
|
+
assert_raise(RangeError) { DCal::Month.new(13, 2000) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_name
|
24
|
+
assert 'January', @month.name
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_days_since_1970
|
28
|
+
month_1_1970 = DCal::Month.new(1, 1970)
|
29
|
+
month_12_2012 = DCal::Month.new(12, 2012)
|
30
|
+
|
31
|
+
assert_equal 0, month_1_1970.days_since_1970
|
32
|
+
assert_equal 15675, month_12_2012.days_since_1970
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_days_in_month
|
36
|
+
month_1_1970 = DCal::Month.new(1, 1970)
|
37
|
+
month_2_2012 = DCal::Month.new(2, 2012)
|
38
|
+
|
39
|
+
assert_equal 31, month_1_1970.days_in_month
|
40
|
+
assert_equal 29, month_2_2012.days_in_month
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_inspect
|
44
|
+
assert_equal "#<DCal::Month 1970-1>", @month.inspect
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'dcal'
|
3
|
+
|
4
|
+
class TestYear < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
@year = DCal::Year.new(2012)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_new
|
10
|
+
assert_raise(RangeError) { DCal::Year.new(1900) }
|
11
|
+
assert_raise(RangeError) { DCal::Year.new(99999) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_comparable
|
15
|
+
assert_equal 2012, @year
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_substraction
|
19
|
+
assert_equal 2011, @year - 1
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_to_i
|
23
|
+
assert_equal 2012, @year.to_i
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_to_s
|
27
|
+
assert_equal "2012", @year.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_inspect
|
31
|
+
assert_equal "#<DCal::Year 2012>", @year.inspect
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_leap
|
35
|
+
y_1970 = DCal::Year.new(1970)
|
36
|
+
y_2000 = DCal::Year.new(2000)
|
37
|
+
y_2012 = DCal::Year.new(2012)
|
38
|
+
y_2100 = DCal::Year.new(2100)
|
39
|
+
|
40
|
+
assert_equal false, y_1970.leap?
|
41
|
+
assert_equal true , y_2000.leap?
|
42
|
+
assert_equal true , y_2012.leap?
|
43
|
+
assert_equal false, y_2100.leap?
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_leap_years_since_1970
|
47
|
+
y_1970 = DCal::Year.new(1970)
|
48
|
+
y_2012 = DCal::Year.new(2012)
|
49
|
+
|
50
|
+
assert_equal 0, y_1970.leap_years_since_1970
|
51
|
+
assert_equal 10, y_2012.leap_years_since_1970
|
52
|
+
end
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dcal
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chun-wei Kuo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2012-12-13 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Just a stupid cal.
|
14
|
+
email: Dendoh@gmail.com
|
15
|
+
executables:
|
16
|
+
- dcal
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- .gitignore
|
21
|
+
- Gemfile
|
22
|
+
- LICENSE.txt
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- bin/dcal
|
26
|
+
- dcal.gemspec
|
27
|
+
- lib/dcal.rb
|
28
|
+
- lib/dcal/cal.rb
|
29
|
+
- lib/dcal/month.rb
|
30
|
+
- lib/dcal/version.rb
|
31
|
+
- lib/dcal/year.rb
|
32
|
+
- test/dcal/test_cal.rb
|
33
|
+
- test/dcal/test_cal_new.rb
|
34
|
+
- test/dcal/test_cal_output.rb
|
35
|
+
- test/dcal/test_month.rb
|
36
|
+
- test/dcal/test_year.rb
|
37
|
+
homepage: https://github.com/Domon/dcal
|
38
|
+
licenses:
|
39
|
+
- MIT
|
40
|
+
metadata: {}
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 2.0.0.preview2.1
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: Just a stupid cal.
|
61
|
+
test_files:
|
62
|
+
- test/dcal/test_cal.rb
|
63
|
+
- test/dcal/test_cal_new.rb
|
64
|
+
- test/dcal/test_cal_output.rb
|
65
|
+
- test/dcal/test_month.rb
|
66
|
+
- test/dcal/test_year.rb
|