parsi-date 0.2 → 0.2.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.
data/README.rdoc CHANGED
@@ -2,5 +2,34 @@
2
2
 
3
3
  This is an implementation of {Solar Hijri Calendar}[http://en.wikipedia.org/wiki/Solar_Hijri_calendar]
4
4
  (some times referred to as Jalali or Persian Calendar) which is Iran's official calendar.
5
- Main aim of this gem is to create a Solar Hijri date library as close as possible to built-in date library.
5
+ Main aim of this gem is to create a Solar Hijri date library as close as possible to the built-in date library.
6
6
  Conversion algorithm originally adopted from {here}[http://www.fourmilab.ch/documents/calendar/].
7
+
8
+ == Usage
9
+
10
+ You can use +Parsi::Date+ and +Parsi::DateTime+ objects as +Date+ and +DateTime+ objects
11
+ For example:
12
+
13
+ ```
14
+ a = Parsi::Date.today # => #<Parsi::Date: 1391-08-09 (4912461/2,0/1)>
15
+ b = a >> 12 # => #<Parsi::Date: 1392-08-09 (4913193/2,0/1)>
16
+ a.upto(b).select{ |d| d.sunday? }.count # => 52
17
+
18
+ Parsi::Date.leap? 1391 # => true
19
+
20
+ c = Parsi::Date.parse "1391/10/12" # => #<Parsi::Date: 1391-10-12 (4912587/2,0)>
21
+ c.strftime "%A %d %B %Y" # => "سه‌شنده 12 دی 1391"
22
+ c.strftime "%^EA %d %^EB %Y" # => "Seshambe 12 Day 1391"
23
+ ```
24
+
25
+ For converting a +Date+ or +DateTime+ object just call +to_parsi+ (aliased to +jalali+ and +to_jalali+) on it.
26
+ To convert back use +to_gregorian+.
27
+
28
+ ```
29
+ d = Date.civil(2012, 10, 30).to_parsi # => #<Parsi::Date: 1391-08-09 (4912461/2,0/1)>
30
+ d.to_gregorian # => #<Date: 2012-10-30 ((2456231j,0s,0n),+0s,2299161j)>
31
+ ```
32
+
33
+
34
+
35
+ Copyright (c) 2012 Hassan Zamani, released under the MIT license.
data/lib/parsi-date.rb CHANGED
@@ -93,19 +93,31 @@ module Parsi
93
93
  # month's numerical representation indexed into this array
94
94
  # gives the name of that month (hence the first element is nil).
95
95
  MONTHNAMES = [nil] + %w(فروردین اردیبهشت خرداد تیر مرداد شهریور مهر آبان آذر دی بهمن اسفند)
96
+ # Full month names, in English. Months count from 1 to 12;
97
+ EN_MONTHNAMES = [nil] + %w(farvardin ordibehesht khordad tir mordad sharivar mehr aban azar day bahman esfand)
96
98
 
97
99
  # Full names of days of the week, in Farsi. Days of the week
98
- # count from 0 to 6 (except in the commercial week); a day's numerical
99
- # representation indexed into this array gives the name of that day.
100
+ # count from 0 to 6; a day's numerical representation indexed into this array gives
101
+ # the name of that day.
100
102
  DAYNAMES = %w(یک‌شنده دوشنده سه‌شنده چهارشنده چنج‌شنده جمعه شنده)
101
103
 
104
+ # Full names of days of the week, in English. Days of the week
105
+ # count from 0 to 6; a day's numerical representation indexed into this array gives
106
+ # the name of that day.
107
+ EN_DAYNAMES = %w(yekshambe doshambe seshambe chaharshambe panjshanbe jomee shanbe)
108
+
102
109
  # Abbreviated month names, in English.
103
- ABBR_MONTHNAMES = [nil] + %w(Far Ord Kho Tir Mor Sha Meh Abn Azr Dey Bah Esf)
110
+ #
111
+ # We don't have Farsi abbreviated month names, as they are not useful
112
+ ABBR_MONTHNAMES = [nil] + %w(far ord kho tir mor sha meh abn azr dey bah esf)
104
113
 
105
114
  # Abbreviated day names, in Farsi.
106
115
  ABBR_DAYNAMES = %w(۱ش ۲ش ۳ش ۴ش ۵ش ج ش)
107
116
 
108
- [MONTHNAMES, ABBR_MONTHNAMES, DAYNAMES, ABBR_DAYNAMES].each do |xs|
117
+ # Abbreviated day names, in English.
118
+ ABBR_EN_DAYNAMES = %w(ye do se ch pj jo sh)
119
+
120
+ [MONTHNAMES, EN_MONTHNAMES, ABBR_MONTHNAMES, DAYNAMES, EN_DAYNAMES, ABBR_DAYNAMES, ABBR_EN_DAYNAMES].each do |xs|
109
121
  xs.each{|x| x.freeze unless x.nil?}.freeze
110
122
  end
111
123
 
@@ -457,6 +469,10 @@ module Parsi
457
469
  define_method(n.downcase + '?'){ wday == i }
458
470
  end
459
471
 
472
+ EN_DAYNAMES.each_with_index do |n, i|
473
+ define_method(n.downcase + '?'){ wday == i }
474
+ end
475
+
460
476
  # Return a new Date object that is +n+ days later than the current one.
461
477
  #
462
478
  # +n+ may be a negative value, in which case the new Date is earlier
@@ -590,6 +606,27 @@ module Parsi
590
606
  DateTime.new! jd_to_ajd(jd, 0, 0), 0
591
607
  end
592
608
 
609
+ def to_parsi
610
+ self
611
+ end
612
+ alias :jalali :to_parsi
613
+ alias :to_jalali :to_parsi
614
+ alias :to_persian :to_parsi
615
+
616
+ # Formats time according to the directives in the given format string.
617
+ # The directives begins with a percent (%) character. Any text not listed as a
618
+ # directive will be passed through to the output string.
619
+ #
620
+ # The directive consists of a percent (%) character, zero or more flags,
621
+ # optional minimum field width, optional modifier and a conversion specifier as
622
+ # follows.
623
+ #
624
+ # %<flags><width><modifier><conversion>
625
+ #
626
+ # +flags+ and +conversion+ are as in +Time+ exept that the +E+ flag is not egnored
627
+ # any more, it forse useing English names
628
+ #
629
+ #
593
630
  def strftime format='%Y/%m/%d'
594
631
  format.
595
632
  gsub('%%', 'PERCENT_SUBSTITUTION_MARKER').
@@ -598,24 +635,34 @@ module Parsi
598
635
  gsub('%x', '%D').
599
636
  gsub('%D', '%y/%m/%d').
600
637
  gsub('%F', '%Y-%m-%d').
601
- gsub('%v', '%e-%b-%Y').
638
+ gsub('%v', '%e-%B-%Y').
602
639
  gsub('%Y', year.to_s).
603
640
  gsub('%C', (year / 100).to_s).
604
641
  gsub('%y', (year % 100).to_s).
605
642
  gsub('%m', '%02d' % month).
606
- gsub('%_m', '% 2d' % month).
643
+ gsub('%_m', '%2d' % month).
607
644
  gsub('%-m', month.to_s).
608
645
  gsub('%^B', '%B').
609
646
  gsub('%B', MONTHNAMES[month]).
647
+ gsub('%E^B', '%^EB').
648
+ gsub('%^EB', EN_MONTHNAMES[month].capitalize).
649
+ gsub('%EB', EN_MONTHNAMES[month]).
610
650
  gsub('%h', '%b').
651
+ gsub('%^h', '%^b').
611
652
  gsub('%b', ABBR_MONTHNAMES[month]).
612
653
  gsub('%^b', ABBR_MONTHNAMES[month].capitalize).
613
654
  gsub('%d', '%02d' % day).
614
- gsub('%e', '% 2d' % day).
655
+ gsub('%e', '%2d' % day).
615
656
  gsub('%-d', day.to_s).
616
657
  gsub('%j', '%03d' % yday.to_s).
617
658
  gsub('%A', DAYNAMES[wday]).
618
659
  gsub('%a', ABBR_DAYNAMES[wday]).
660
+ gsub('%EA', EN_DAYNAMES[wday]).
661
+ gsub('%Ea', ABBR_EN_DAYNAMES[wday]).
662
+ gsub('%E^A', '%^EA').
663
+ gsub('%^EA', EN_DAYNAMES[wday].capitalize).
664
+ gsub('%E^a', '%^Ea').
665
+ gsub('%^Ea', ABBR_EN_DAYNAMES[wday].capitalize).
619
666
  gsub('%w', wday.to_s).
620
667
  gsub('%n', "\n").
621
668
  gsub('%t', "\t").
@@ -693,3 +740,5 @@ class Date
693
740
  alias :to_jalali :to_parsi
694
741
  alias :to_persian :to_parsi
695
742
  end
743
+
744
+ require 'parsi-datetime'
@@ -200,3 +200,13 @@ class DateTime
200
200
  alias :to_jalali :to_parsi
201
201
  alias :to_persian :to_parsi
202
202
  end
203
+
204
+ class Time
205
+ # Returns a Parsi::DateTime object representing same date in Jalali calendar
206
+ def to_parsi
207
+ to_datetime.to_parsi
208
+ end
209
+ alias :jalali :to_parsi
210
+ alias :to_jalali :to_parsi
211
+ alias :to_persian :to_parsi
212
+ end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Parsi
2
2
  class Date
3
- VERSION = "0.2"
3
+ VERSION = "0.2.1"
4
4
  end
5
5
  end
@@ -3,23 +3,40 @@ require File.expand_path('../../spec_helper', __FILE__)
3
3
 
4
4
  describe "Date constants" do
5
5
  it "defines MONTHNAMES" do
6
- Parsi::Date::MONTHNAMES.should == [nil] + %w(فروردین اردیبهشت خرداد تیر مرداد شهریور مهر آبان آذر دی بهمن اسفند)
6
+ Parsi::Date::MONTHNAMES.should == [nil] +
7
+ %w(فروردین اردیبهشت خرداد تیر مرداد شهریور مهر آبان آذر دی بهمن اسفند)
8
+ end
9
+
10
+ it "defines EN_MONTHNAMES" do
11
+ Parsi::Date::EN_MONTHNAMES.should == [nil] +
12
+ %w(farvardin ordibehesht khordad tir mordad sharivar mehr aban azar day bahman esfand)
7
13
  end
8
14
 
9
15
  it "defines ABBR_MONTHNAMES" do
10
- Parsi::Date::ABBR_MONTHNAMES.should == [nil] + %w(Far Ord Kho Tir Mor Sha Meh Abn Azr Dey Bah Esf)
16
+ Parsi::Date::ABBR_MONTHNAMES.should == [nil] +
17
+ %w(far ord kho tir mor sha meh abn azr dey bah esf)
11
18
  end
12
19
 
13
20
  it "defines DAYNAMES" do
14
- Parsi::Date::DAYNAMES.should == %w(یک‌شنده دوشنده سه‌شنده چهارشنده چنج‌شنده جمعه شنده )
21
+ Parsi::Date::DAYNAMES.should == %w(یک‌شنده دوشنده سه‌شنده چهارشنده چنج‌شنده جمعه شنده)
22
+ end
23
+
24
+ it "defines EN_DAYNAMES" do
25
+ Parsi::Date::EN_DAYNAMES.should == %w(yekshambe doshambe seshambe chaharshambe panjshanbe jomee shanbe)
15
26
  end
16
27
 
17
28
  it "defines ABBR_DAYNAMES" do
18
29
  Parsi::Date::ABBR_DAYNAMES.should == %w(۱ش ۲ش ۳ش ۴ش ۵ش ج ش)
19
30
  end
20
31
 
21
- it "freezes MONTHNAMES, DAYNAMES, ABBR_MONTHNAMES, ABBR_DAYSNAMES" do
22
- [Parsi::Date::MONTHNAMES, Parsi::Date::DAYNAMES, Parsi::Date::ABBR_MONTHNAMES, Parsi::Date::ABBR_DAYNAMES].each do |ary|
32
+ it "defines ABBR_EN_DAYNAMES" do
33
+ Parsi::Date::ABBR_EN_DAYNAMES.should == %w(ye do se ch pj jo sh)
34
+ end
35
+
36
+ it "freezes MONTHNAMES, DAYNAMES, EN_DAYNAMES, ABBR_MONTHNAMES, ABBR_DAYSNAMES" do
37
+ [Parsi::Date::MONTHNAMES, Parsi::Date::EN_MONTHNAMES, Parsi::Date::ABBR_MONTHNAMES,
38
+ Parsi::Date::DAYNAMES, Parsi::Date::EN_DAYNAMES,
39
+ Parsi::Date::ABBR_DAYNAMES, Parsi::Date::ABBR_EN_DAYNAMES].each do |ary|
23
40
  ary.should be_frozen
24
41
  end
25
42
  end
@@ -17,11 +17,15 @@ describe "Parsi::Date#strftime" do
17
17
 
18
18
  it "should be able to print the full month name" do
19
19
  Parsi::Date.civil(1390, 4, 6).strftime("%B").should == "تیر"
20
+ Parsi::Date.civil(1390, 4, 6).strftime("%EB").should == "tir"
21
+ Parsi::Date.civil(1390, 4, 6).strftime("%^EB").should == "Tir"
20
22
  end
21
23
 
22
24
  it "should be able to print the short month name" do
23
- Parsi::Date.civil(1390, 4, 6).strftime("%b").should == "Tir"
24
- Parsi::Date.civil(1390, 4, 6).strftime("%h").should == "Tir"
25
+ Parsi::Date.civil(1390, 4, 6).strftime("%b").should == "tir"
26
+ Parsi::Date.civil(1390, 4, 6).strftime("%h").should == "tir"
27
+ Parsi::Date.civil(1390, 4, 6).strftime("%^b").should == "Tir"
28
+ Parsi::Date.civil(1390, 4, 6).strftime("%^h").should == "Tir"
25
29
  Parsi::Date.civil(1390, 4, 6).strftime("%b").should == Parsi::Date.civil(1390, 4, 6).strftime("%h")
26
30
  end
27
31
 
@@ -30,15 +34,23 @@ describe "Parsi::Date#strftime" do
30
34
  end
31
35
 
32
36
  it "should be able to print the month day with leading zeroes" do
33
- Parsi::Date.civil(1390, 4, 6).strftime("%d").should == "06"
37
+ Parsi::Date.civil(1390, 4, 6).strftime("%d").should == "06"
38
+ Parsi::Date.civil(1390, 4, 16).strftime("%d").should == "16"
34
39
  end
35
40
 
36
- it "should be able to print the month day with leading spaces" do
37
- Parsi::Date.civil(1390, 4, 6).strftime("%e").should == " 6"
41
+ it "should be able to print the month day with leading spaces and without em" do
42
+ Parsi::Date.civil(1390, 4, 6).strftime("%-d").should == "6"
43
+ Parsi::Date.civil(1390, 4, 6).strftime("%e").should == " 6"
44
+ Parsi::Date.civil(1390, 4, 16).strftime("%e").should == "16"
38
45
  end
39
46
 
40
- it "should be able to print the month with leading zeroes" do
41
- Parsi::Date.civil(1390, 4, 6).strftime("%m").should == "04"
47
+ it "should be able to print the month with leading zeroes, spaces and none" do
48
+ Parsi::Date.civil(1390, 4, 6).strftime("%m").should == "04"
49
+ Parsi::Date.civil(1390, 11, 6).strftime("%m").should == "11"
50
+ Parsi::Date.civil(1390, 4, 6).strftime("%_m").should == " 4"
51
+ Parsi::Date.civil(1390, 11, 6).strftime("%_m").should == "11"
52
+ Parsi::Date.civil(1390, 4, 6).strftime("%-m").should == "4"
53
+ Parsi::Date.civil(1390, 11, 6).strftime("%-m").should == "11"
42
54
  end
43
55
 
44
56
  it "should be able to add a newline" do
@@ -86,8 +98,8 @@ describe "Parsi::Date#strftime" do
86
98
  end
87
99
 
88
100
  it "should be able to show the commercial week" do
89
- Parsi::Date.civil(1390, 4, 9).strftime("%v").should == " 9-Tir-1390"
90
- Parsi::Date.civil(1390, 4, 9).strftime("%v").should == Parsi::Date.civil(1390, 4, 9).strftime('%e-%b-%Y')
101
+ Parsi::Date.civil(1390, 4, 9).strftime("%v").should == " 9-تیر-1390"
102
+ Parsi::Date.civil(1390, 4, 9).strftime("%v").should == Parsi::Date.civil(1390, 4, 9).strftime('%e-%B-%Y')
91
103
  end
92
104
 
93
105
  it "should be able to show YY/MM/DD" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsi-date
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: