semantic_date_time_tags 0.0.10 → 0.1.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
  SHA1:
3
- metadata.gz: fe726c652f793a8dd9fe4544b1ce97c490f8e886
4
- data.tar.gz: 0e7ea49f7fb2c6099f34f300b148d6c3131d38d1
3
+ metadata.gz: aeed110b330e1302a7615ba2f93304b79e62a30c
4
+ data.tar.gz: cdca5a50d3f7f8e526eaf41e96edd931415d86f4
5
5
  SHA512:
6
- metadata.gz: 710ddafcf1f2284cb34c1a8505ddca911dce078d28468e1b0c9849707ece8e879c62691d3d97a63fba1daca55043ba5fd672ea423074160cfd58614c6b3a3f6d
7
- data.tar.gz: 37b06c8ec419ebef9a7742b4cd05646b00ea2cc28b0e15d582cb329fb28f1380adc56dfecd093ee321c00987e21df86ddf57a0e699df67989c6c5ea0df200981
6
+ metadata.gz: 79e1b964be9feb59c656b2737c6262fba6c6ae850cc4582e0ad77f6d458c0b2730ec0169ed470bbfc5d1d5611985965b03cb9fda99c869e9bc7d54ab81df8054
7
+ data.tar.gz: 5262805904fb6d6ce1411f4bb230b5dc7f537a777d1c20b133b04ef38003d781993d9d12e8bf79631804666cacd2202ae07c64c5db1f8ee49f0d85d03ae89a92
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- semantic_date_time_tags (0.0.10)
4
+ semantic_date_time_tags (0.1.0)
5
5
  rails (>= 3.0.0)
6
6
 
7
7
  GEM
@@ -7,6 +7,9 @@ en:
7
7
  formats:
8
8
  full: "%H:%M"
9
9
  test: "%H~%M"
10
+ in_words:
11
+ noon: noon
12
+ midnight: midnight
10
13
  date_time:
11
14
  formats:
12
15
  full: "%-d.%-m.%Y %H:%M"
@@ -7,13 +7,14 @@ module SemanticDateTimeTags
7
7
  include ActionView::Helpers::DateHelper
8
8
  include ActionView::Helpers::TagHelper
9
9
 
10
+ attr_accessor :obj
11
+ attr_accessor :options
10
12
  attr_accessor :output_buffer
11
13
 
12
14
  # =====================================================================
13
15
 
14
- def initialize obj, tag_name, options={}
16
+ def initialize obj, options={}
15
17
  @obj = obj
16
- @tag_name = tag_name
17
18
  @options = options.tap{ |opts| opts.delete(:scope) }
18
19
  end
19
20
 
@@ -31,34 +32,54 @@ module SemanticDateTimeTags
31
32
  type_class,
32
33
  current_date_class,
33
34
  current_year_class,
35
+ midnight_class,
36
+ noon_class,
34
37
  whole_hour_class,
35
38
  whole_minute_class,
36
- @options[:class]
39
+ options[:class]
37
40
  ].flatten.reject(&:blank?)
38
41
  end
39
42
 
40
43
  def type_class
41
- @obj.class.to_s.underscore
44
+ obj.class.to_s.underscore
42
45
  end
43
46
 
44
47
  def current_date_class
45
- return unless [::Date,::DateTime].any?{ |c| @obj.instance_of? c }
46
- 'current_date' if @obj.today?
48
+ return unless [::Date,::DateTime].any?{ |c| obj.instance_of? c }
49
+ 'current_date' if obj.today?
47
50
  end
48
51
 
49
52
  def current_year_class
50
- return unless [::Date,::DateTime].any?{ |c| @obj.instance_of? c }
51
- 'current_year' if @obj.year == ::Date.today.year
53
+ return unless [::Date,::DateTime].any?{ |c| obj.instance_of? c }
54
+ 'current_year' if obj.year == ::Date.today.year
52
55
  end
53
56
 
54
57
  def whole_hour_class
55
- return unless [::Time,::DateTime].any?{ |c| @obj.instance_of? c }
56
- 'whole_hour' unless @obj.min > 0
58
+ return unless [::Time,::DateTime].any?{ |c| obj.instance_of? c }
59
+ 'whole_hour' unless obj.min > 0
57
60
  end
58
61
 
59
62
  def whole_minute_class
60
- return unless [::Time,::DateTime].any?{ |c| @obj.instance_of? c }
61
- 'whole_minute' unless @obj.sec > 0
63
+ return unless [::Time,::DateTime].any?{ |c| obj.instance_of? c }
64
+ 'whole_minute' unless obj.sec > 0
65
+ end
66
+
67
+ def noon_class
68
+ return unless [::Time,::DateTime].any?{ |c| obj.instance_of? c }
69
+ 'noon' if obj == obj.noon
70
+ end
71
+
72
+ def midnight_class
73
+ return unless [::Time,::DateTime].any?{ |c| obj.instance_of? c }
74
+ 'midnight' if obj == obj.midnight
75
+ end
76
+
77
+ # ---------------------------------------------------------------------
78
+
79
+ def dom_data
80
+ {
81
+ in_words: in_words
82
+ }
62
83
  end
63
84
 
64
85
  private # =============================================================
@@ -68,11 +89,37 @@ module SemanticDateTimeTags
68
89
  end
69
90
 
70
91
  def format
71
- @options.fetch :format, :full
92
+ options.fetch :format, :full
72
93
  end
73
94
 
95
+ # ---------------------------------------------------------------------
96
+
74
97
  def localized_obj
75
- I18n.l @obj, format: format
98
+ I18n.l obj, format: format
99
+ end
100
+
101
+ # ---------------------------------------------------------------------
102
+
103
+ def tag_name
104
+ options.fetch :tag_name, :time
105
+ end
106
+
107
+ # ---------------------------------------------------------------------
108
+
109
+ def in_words
110
+ [ noon_in_words, midnight_in_words ].reject(&:blank?).join(' ')
111
+ end
112
+
113
+ def noon_in_words
114
+ return unless [::Time,::DateTime].any?{ |c| obj.instance_of? c }
115
+ return unless obj == obj.noon
116
+ I18n.t :noon, scope: %i(time in_words)
117
+ end
118
+
119
+ def midnight_in_words
120
+ return unless [::Time,::DateTime].any?{ |c| obj.instance_of? c }
121
+ return unless obj == obj.midnight
122
+ I18n.t :midnight, scope: %i(time in_words)
76
123
  end
77
124
 
78
125
  end
@@ -4,24 +4,24 @@ module SemanticDateTimeTags
4
4
  class Tag
5
5
  class Date < Tag
6
6
 
7
- def initialize obj, tag_name, options={}
7
+ def initialize obj, options={}
8
8
  raise 'object must be Date or DateTime' unless [::Date, ::DateTime].any? { |c| obj.instance_of? c }
9
- super(obj, tag_name, options)
9
+ super(obj, options)
10
10
  end
11
11
 
12
12
  # ---------------------------------------------------------------------
13
13
 
14
14
  def to_html
15
- if @tag_name == :time
16
- datetime = @obj.acts_like?(:time) ? @obj.xmlschema : @obj.iso8601
17
- @options[:datetime] = datetime
15
+ if tag_name == :time
16
+ datetime = obj.acts_like?(:time) ? obj.xmlschema : obj.iso8601
17
+ options[:datetime] = datetime
18
18
  end
19
19
 
20
- @options[:class] = dom_classes
20
+ options[:class] = dom_classes
21
21
 
22
22
  value = SemanticDateTimeTags::FormatParser.new(format_string, localized_obj).to_html.html_safe
23
23
 
24
- content_tag(@tag_name, @options) { value }.html_safe
24
+ content_tag(tag_name, options) { value }.html_safe
25
25
  end
26
26
 
27
27
  private # =============================================================
@@ -2,6 +2,9 @@ module SemanticDateTimeTags
2
2
  class Tag
3
3
  class DateRange < Tag
4
4
 
5
+ attr_accessor :date_from
6
+ attr_accessor :date_to
7
+
5
8
  def initialize date_from, date_to=nil, options={}
6
9
  @date_from = date_from
7
10
  @date_to = date_to
@@ -11,25 +14,25 @@ module SemanticDateTimeTags
11
14
  # ---------------------------------------------------------------------
12
15
 
13
16
  def spans_years?
14
- return false if @date_to.nil?
15
- @date_from.year != @date_to.year
17
+ return false if date_to.nil?
18
+ date_from.year != date_to.year
16
19
  end
17
20
 
18
21
  def spans_months?
19
- @date_from.month != @date_to.month
22
+ date_from.month != date_to.month
20
23
  end
21
24
 
22
25
  def within_a_week?
23
- (@date_from - @date_to) <= 7
26
+ (date_from - date_to) <= 7
24
27
  end
25
28
 
26
29
  def one_day?
27
- @date_from == @date_to
30
+ date_from == date_to
28
31
  end
29
32
 
30
33
  def both_in_current_year?
31
34
  return false if spans_years?
32
- @date_from.year == ::Date.today.year
35
+ date_from.year == ::Date.today.year
33
36
  end
34
37
 
35
38
  # ---------------------------------------------------------------------
@@ -48,9 +51,9 @@ module SemanticDateTimeTags
48
51
  # ---------------------------------------------------------------------
49
52
 
50
53
  def to_html
51
- from = SemanticDateTimeTags::Tag::Date.new(@date_from, :time, class: 'from').to_html
54
+ from = SemanticDateTimeTags::Tag::Date.new(date_from, class: 'from').to_html
52
55
  sep = content_tag(:span, separator, class: 'date_range_separator')
53
- to = SemanticDateTimeTags::Tag::Date.new(@date_to, :time, class: 'to').to_html
56
+ to = SemanticDateTimeTags::Tag::Date.new(date_to, class: 'to').to_html
54
57
 
55
58
  content_tag(:span, class: dom_classes) { [ from, sep, to ].join.html_safe }.html_safe
56
59
  end
@@ -58,7 +61,7 @@ module SemanticDateTimeTags
58
61
  private # =============================================================
59
62
 
60
63
  def separator
61
- @options.fetch(:separator, ' – ')
64
+ options.fetch(:separator, ' – ')
62
65
  end
63
66
 
64
67
  end
@@ -6,22 +6,22 @@ module SemanticDateTimeTags
6
6
 
7
7
  def initialize obj, options={}
8
8
  raise 'object must be DateTime' unless obj.instance_of?(::DateTime)
9
- super(obj, :time, options)
9
+ super(obj, options)
10
10
  end
11
11
 
12
12
  # ---------------------------------------------------------------------
13
13
 
14
14
  def to_html
15
- if @tag_name == :time
16
- datetime = @obj.acts_like?(:time) ? @obj.xmlschema : @obj.iso8601
17
- @options[:datetime] = datetime
15
+ if tag_name == :time
16
+ datetime = obj.acts_like?(:time) ? obj.xmlschema : obj.iso8601
17
+ options[:datetime] = datetime
18
18
  end
19
19
 
20
- @options[:class] = dom_classes
20
+ options[:class] = dom_classes
21
21
 
22
22
  value = SemanticDateTimeTags::FormatParser.new(format_string, localized_obj).to_html.html_safe
23
23
 
24
- time_tag(@obj, @options) { value }.html_safe
24
+ time_tag(obj, options) { value }.html_safe
25
25
  end
26
26
 
27
27
  private # =============================================================
@@ -31,7 +31,7 @@ module SemanticDateTimeTags
31
31
  end
32
32
 
33
33
  def localized_obj
34
- @obj.strftime I18n.t( format, scope: scope, locale: I18n.locale )
34
+ obj.strftime I18n.t( format, scope: scope, locale: I18n.locale )
35
35
  end
36
36
 
37
37
  end
@@ -4,24 +4,25 @@ module SemanticDateTimeTags
4
4
  class Tag
5
5
  class Time < Tag
6
6
 
7
- def initialize obj, tag_name, options={}
7
+ def initialize obj, options={}
8
8
  raise 'object must be Time' unless obj.instance_of?(::Time)
9
- super(obj, tag_name, options)
9
+ super(obj, options)
10
10
  end
11
11
 
12
12
  # ---------------------------------------------------------------------
13
13
 
14
14
  def to_html
15
- if @tag_name == :time
16
- datetime = @obj.acts_like?(:time) ? @obj.xmlschema : @obj.iso8601
17
- @options[:datetime] = datetime
15
+ if tag_name == :time
16
+ datetime = obj.acts_like?(:time) ? obj.xmlschema : obj.iso8601
17
+ options[:datetime] = datetime
18
18
  end
19
19
 
20
- @options[:class] = dom_classes
20
+ options[:class] = dom_classes
21
+ options[:data] = dom_data
21
22
 
22
23
  value = SemanticDateTimeTags::FormatParser.new(format_string, localized_obj).to_html
23
24
 
24
- content_tag(@tag_name, @options) { value }.html_safe
25
+ content_tag(tag_name, options) { value }.html_safe
25
26
  end
26
27
 
27
28
  private # =============================================================
@@ -1,3 +1,3 @@
1
1
  module SemanticDateTimeTags
2
- VERSION = "0.0.10"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -23,18 +23,18 @@ module SemanticDateTimeTags
23
23
  end
24
24
 
25
25
  # accepts only datetime
26
- def semantic_date_time_tag date_time, all_day=false, options={}
26
+ def semantic_date_time_tag date_time, options={}
27
27
  SemanticDateTimeTags::Tag::DateTime.new(date_time, options).to_html
28
28
  end
29
29
 
30
30
  # accepts datetime and date
31
- def semantic_date_tag date, tag_name=:time, options={}
32
- SemanticDateTimeTags::Tag::Date.new(date, tag_name, options).to_html
31
+ def semantic_date_tag date, options={}
32
+ SemanticDateTimeTags::Tag::Date.new(date, options).to_html
33
33
  end
34
34
 
35
35
  # accepts datetime and time
36
- def semantic_time_tag time, tag_name=:time, options={}
37
- SemanticDateTimeTags::Tag::Time.new(time, tag_name, options).to_html
36
+ def semantic_time_tag time, options={}
37
+ SemanticDateTimeTags::Tag::Time.new(time, options).to_html
38
38
  end
39
39
 
40
40
  end
@@ -13,14 +13,18 @@ describe SemanticDateTimeTags::ViewHelpers do
13
13
 
14
14
  describe '#semantic_time_tag' do
15
15
  let(:time_object_hours) { time_object.strftime('%H') }
16
+ let(:time_object_midnight) { Time.new(2015, 11, 3, 24, 00) }
16
17
  let(:time_object_minutes) { time_object.strftime('%M') }
18
+ let(:time_object_noon) { Time.new(2015, 11, 3, 12, 00) }
17
19
  let(:time_object_whole_hour) { Time.new(2014, 8, 21, 15) }
18
20
  let(:time_object_whole_minute) { Time.new(2014, 8, 21, 15, 30) }
19
21
 
22
+
20
23
  it 'does not work with a date object' do
21
24
  proc { semantic_time_tag(date_object) }.must_raise RuntimeError
22
25
  end
23
26
 
27
+
24
28
  it 'returns hours wrapped in a span tag' do
25
29
  semantic_time_tag(time_object).must_match Regexp.new("<span.+?hours.+?H.+?>#{time_object_hours}</span>")
26
30
  end
@@ -29,14 +33,16 @@ describe SemanticDateTimeTags::ViewHelpers do
29
33
  semantic_time_tag(time_object).must_match Regexp.new("<span.+?minutes.+?M.+?>#{time_object_minutes}</span>")
30
34
  end
31
35
 
36
+
32
37
  it 'wraps the whole thing in a time tag by default' do
33
38
  semantic_time_tag(time_object).must_match /\A<time.+?<\/time>\z/
34
39
  end
35
40
 
36
41
  it 'wraps the whole thing in a span tag if passed as argument' do
37
- semantic_time_tag(time_object, :span).must_match /\A<span.+?<\/span>\z/
42
+ semantic_time_tag(time_object, { tag_name: :span }).must_match /\A<span.+?<\/span>\z/
38
43
  end
39
44
 
45
+
40
46
  it 'adds whole_hour class if time is whole hour' do
41
47
  semantic_time_tag(time_object_whole_hour).must_match /\A<time.+?whole_hour.+?<\/time>\z/
42
48
  end
@@ -45,8 +51,27 @@ describe SemanticDateTimeTags::ViewHelpers do
45
51
  semantic_time_tag(time_object_whole_minute).must_match /\A<time.+?whole_minute.+?<\/time>\z/
46
52
  end
47
53
 
54
+
55
+ it 'adds noon class if time is noon' do
56
+ semantic_time_tag(time_object_noon).must_match /\A<time.+?noon.+?<\/time>\z/
57
+ end
58
+
59
+ it 'adds midnight class if time is midnight' do
60
+ semantic_time_tag(time_object_midnight).must_match /\A<time.+?midnight.+?<\/time>\z/
61
+ end
62
+
63
+
64
+ it 'adds noon as data-in-words if time is noon' do
65
+ semantic_time_tag(time_object_noon).must_match /\A<time.+?data-in-words=\"noon\".+?<\/time>\z/
66
+ end
67
+
68
+ it 'adds midnight as data-in-words if time is midnight' do
69
+ semantic_time_tag(time_object_midnight).must_match /\A<time.+?data-in-words=\"midnight\".+?<\/time>\z/
70
+ end
71
+
72
+
48
73
  it 'allows to pass :format' do
49
- semantic_time_tag(time_object, :time, format: :test).must_include '~'
74
+ semantic_time_tag(time_object, format: :test).must_include '~'
50
75
  end
51
76
  end
52
77
 
@@ -57,24 +82,28 @@ describe SemanticDateTimeTags::ViewHelpers do
57
82
  let(:date_object_month) { date_object.strftime('%-m') }
58
83
  let(:date_object_year) { date_object.year }
59
84
 
85
+
60
86
  it 'should only work with a date or datetime object' do
61
87
  proc { semantic_date_tag(time_object) }.must_raise RuntimeError
62
88
  end
63
89
 
90
+
64
91
  it 'wraps everything in a time tag by default' do
65
92
  semantic_date_tag(date_object).must_match /\A<time.+?<\/time>\z/
66
93
  end
67
94
 
68
95
  it 'wraps everything in a span tag if passed as argument' do
69
- semantic_date_tag(date_object, :span).must_match /\A<span.+?<\/span>\z/
96
+ semantic_date_tag(date_object, { tag_name: :span }).must_match /\A<span.+?<\/span>\z/
70
97
  end
71
98
 
99
+
72
100
  it 'returns year, month and day wrapped in a span tags' do
73
101
  semantic_date_tag(date_object).must_match Regexp.new("<span.+?year.+?>#{date_object_year}</span>")
74
102
  semantic_date_tag(date_object).must_match Regexp.new("<span.+?month.+?>#{date_object_month}</span>")
75
103
  semantic_date_tag(date_object).must_match Regexp.new("<span.+?day.+?>#{date_object_day}</span>")
76
104
  end
77
105
 
106
+
78
107
  it 'adds current_date class if date is today' do
79
108
  semantic_date_tag(Date.today).must_include "current_date"
80
109
  semantic_date_tag(Date.today-1.day).wont_include "current_date"
@@ -85,8 +114,9 @@ describe SemanticDateTimeTags::ViewHelpers do
85
114
  semantic_date_tag(Date.today-1.year).wont_include "current_year"
86
115
  end
87
116
 
117
+
88
118
  it 'allows to pass :format' do
89
- semantic_date_tag(Date.today, :time, format: :test).must_include '~'
119
+ semantic_date_tag(Date.today, format: :test).must_include '~'
90
120
  end
91
121
  end
92
122
 
@@ -102,7 +132,7 @@ describe SemanticDateTimeTags::ViewHelpers do
102
132
  end
103
133
 
104
134
  it 'allows to pass :format' do
105
- semantic_date_time_tag(date_time_object, false, format: :test).must_include '~'
135
+ semantic_date_time_tag(date_time_object, all_day: false, format: :test).must_include '~'
106
136
  end
107
137
  end
108
138
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semantic_date_time_tags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomas Celizna
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-31 00:00:00.000000000 Z
11
+ date: 2015-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails