semantic_date_time_tags 0.0.10 → 0.1.0

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 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