hellobase 0.1.4 → 0.1.9

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: 4edaf03ad055e6fac048204d52f6d33f14a5db9e458dfc186e39066ca8ccea06
4
- data.tar.gz: 9d55c88166736f17e9e8309e8cb905f48ae2f0bcdad38ccbd8750cc3edb93c9c
3
+ metadata.gz: 61c5d3e9cf754c5b79f4c40d8f81d386eefdd9b4d0cc5ac1e6e6d20c99750cba
4
+ data.tar.gz: 54c85b5b7e21630f79bff2138663a7d4075495d55b5a35d31803ffcc66aa1351
5
5
  SHA512:
6
- metadata.gz: abf79988dce3db4c20d9c4e9b901539d0ce4f71e1d4e65a4e2b68d8245dc909250ef690a59091b7b61dc1c34ddf1d896537fc926ed558914750ed491bbc75cf9
7
- data.tar.gz: f8261405b13b7e13d47a0bf0b9bcd75f3edb4a4d7d53595f440798ed4bd26ddfc03db44dc664f43a03948e2ce5a4843d85da3afe55c2077d7fc191d35fff7f2d
6
+ metadata.gz: 06263c3bf10883966e08359e07470355e587e62e35827c170f8b833b042a485f899672c135823a18333e7d2f719a67035c87d2d0dbf5a71ef7c8c8f38ee9df65
7
+ data.tar.gz: a37f2ef4a5364b2e619e484b91dcd17650973eb9433e16c9dc486e0d6fcc599dca0fbd04bfb844fd633d3a5f14709fc9701250abbe97cb098d65b899b46cdda7
@@ -1,31 +1,6 @@
1
- require 'bigdecimal'
2
- require 'date'
3
- require 'active_support/core_ext/date'
4
- require 'active_support/core_ext/date_time'
5
- require 'active_support/duration'
6
- require 'tod'
7
-
8
- require 'hellobase/array_access'
9
- require 'hellobase/date_creation'
10
- require 'hellobase/datetime_creation'
11
- require 'hellobase/divide_by_zero'
12
- require 'hellobase/string_access'
13
- require 'hellobase/time_creation'
1
+ require 'hellobase/core_ext'
2
+ require 'hellobase/formtastic'
3
+ require 'hellobase/time_zones'
14
4
 
15
5
  module Hellobase
16
- DATE_FORMAT = /^\d{4}-\d{2}-\d{2}$/
17
- TIME_FORMAT = /^\d{2}:\d{2}:\d{2}$/
18
- DATETIME_FORMAT = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/
19
-
20
- class Error < StandardError
21
- attr_reader :type, :object
22
-
23
- def initialize(type, object, *args)
24
- @type = type
25
- @object = object
26
- @args = args
27
-
28
- super "#{type}: #{object.inspect}, #{args.inspect}"
29
- end
30
- end
31
6
  end
@@ -0,0 +1,32 @@
1
+ require 'bigdecimal'
2
+ require 'date'
3
+ require 'active_support/core_ext/date'
4
+ require 'active_support/core_ext/time'
5
+ require 'active_support/duration'
6
+ require 'tod'
7
+
8
+ require 'hellobase/core_ext/array_access'
9
+ require 'hellobase/core_ext/date_creation'
10
+ require 'hellobase/core_ext/datetime_creation'
11
+ require 'hellobase/core_ext/divide_by_zero'
12
+ require 'hellobase/core_ext/duration_arithmetic'
13
+ require 'hellobase/core_ext/string_access'
14
+ require 'hellobase/core_ext/time_creation'
15
+
16
+ module Hellobase
17
+ DATE_FORMAT = /^\d{4}-\d{2}-\d{2}$/
18
+ TIME_FORMAT = /^\d{2}:\d{2}:\d{2}$/
19
+ DATETIME_FORMAT = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} UTC$/
20
+
21
+ class Error < StandardError
22
+ attr_reader :type, :object
23
+
24
+ def initialize(type, object, *args)
25
+ @type = type
26
+ @object = object
27
+ @args = args
28
+
29
+ super "#{type}: #{object.inspect}, #{args.inspect}"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,21 @@
1
+ Date.singleton_class.prepend(
2
+ Module.new do
3
+ def parse(string)
4
+ raise Hellobase::Error.new(:date_format, nil, string) unless (string =~ Hellobase::DATE_FORMAT) || string.blank?
5
+
6
+ begin
7
+ super
8
+ rescue ArgumentError
9
+ raise Hellobase::Error.new(:date_value, nil, string)
10
+ end
11
+ end
12
+
13
+ def new(*args)
14
+ begin
15
+ super
16
+ rescue ArgumentError
17
+ raise Hellobase::Error.new(:date_value, nil, *args)
18
+ end
19
+ end
20
+ end
21
+ )
@@ -0,0 +1,30 @@
1
+ Time.singleton_class.prepend(
2
+ Module.new do
3
+ def parse(string)
4
+ raise Hellobase::Error.new(:datetime_format, nil, string) unless (string =~ Hellobase::DATETIME_FORMAT) || string.blank?
5
+
6
+ begin
7
+ super
8
+ rescue ArgumentError
9
+ raise Hellobase::Error.new(:datetime_value, nil, string)
10
+ end
11
+ end
12
+
13
+ def utc(*args)
14
+ begin
15
+ super
16
+ rescue ArgumentError
17
+ raise Hellobase::Error.new(:datetime_value, nil, *args)
18
+ end
19
+ end
20
+
21
+ def new(*args)
22
+ # only allow ActiveSupport::TimeZone to use Time.new
23
+ unless caller_locations(1, 1)[0].path.end_with? 'active_support/values/time_zone.rb'
24
+ raise Hellobase::Error.new(:datetime_new, nil)
25
+ end
26
+
27
+ super
28
+ end
29
+ end
30
+ )
@@ -0,0 +1,23 @@
1
+ ActiveSupport::Duration.prepend(
2
+ Module.new do
3
+ def before(val)
4
+ raise Hellobase::Error.new(:duration_arithmetic, nil, self) if val.is_a?(Date) && has_time_parts?
5
+
6
+ super
7
+ end
8
+
9
+ def after(val)
10
+ raise Hellobase::Error.new(:duration_arithmetic, nil, self) if val.is_a?(Date) && has_time_parts?
11
+
12
+ super
13
+ end
14
+
15
+ private
16
+
17
+ def has_time_parts?
18
+ ((parts[:hours] || 0) != 0) ||
19
+ ((parts[:minutes] || 0) != 0) ||
20
+ ((parts[:seconds] || 0) != 0)
21
+ end
22
+ end
23
+ )
@@ -1,12 +1,12 @@
1
1
  Tod::TimeOfDay.singleton_class.prepend(
2
2
  Module.new do
3
3
  def parse(string)
4
- raise Hellobase::Error.new(:time_parse, nil, string) unless string =~ Hellobase::TIME_FORMAT
4
+ raise Hellobase::Error.new(:time_format, nil, string) unless (string =~ Hellobase::TIME_FORMAT) || string.blank?
5
5
 
6
6
  begin
7
7
  super
8
8
  rescue ArgumentError
9
- raise Hellobase::Error.new(:time_parse, nil, string)
9
+ raise Hellobase::Error.new(:time_value, nil, string)
10
10
  end
11
11
  end
12
12
 
@@ -14,7 +14,7 @@ Tod::TimeOfDay.singleton_class.prepend(
14
14
  begin
15
15
  super
16
16
  rescue ArgumentError
17
- raise Hellobase::Error.new(:time_new, nil, *args)
17
+ raise Hellobase::Error.new(:time_value, nil, *args)
18
18
  end
19
19
  end
20
20
  end
@@ -0,0 +1,7 @@
1
+ require 'active_support' # formtastic needs ActiveSupport::Autoload
2
+ require 'formtastic'
3
+
4
+ require 'hellobase/formtastic/content_input'
5
+ require 'hellobase/formtastic/datepicker_with_time_input'
6
+ require 'hellobase/formtastic/inline_checkbox_input'
7
+ require 'hellobase/formtastic/time_of_day_input'
@@ -0,0 +1,8 @@
1
+ class ContentInput < ::Formtastic::Inputs::StringInput
2
+ def to_html
3
+ input_wrapping do
4
+ label_html <<
5
+ template.content_tag(:span, options[:content])
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,75 @@
1
+ require 'active_admin/inputs'
2
+
3
+ class DatepickerWithTimeInput
4
+ include ::Formtastic::Inputs::Base
5
+
6
+ def to_html
7
+ init_object
8
+
9
+ datepicker_html = ActiveAdmin::Inputs::DatepickerInput.new(builder, template, object, object_name, "#{method}_date", datepicker_options).to_html
10
+ time_select_html = Formtastic::Inputs::SelectInput.new(builder, template, object, object_name, "#{method}_time", time_select_options).to_html
11
+ zone_hidden_html = Formtastic::Inputs::HiddenInput.new(builder, template, object, object_name, "#{method}_tz", {}).to_html
12
+ value_hidden_html = Formtastic::Inputs::HiddenInput.new(builder, template, object, object_name, method, {}).to_html
13
+ zone_span_html = template.content_tag(:span, time_zone)
14
+
15
+ wrapper_contents = [
16
+ replace_li_tag(datepicker_html),
17
+ replace_li_tag(time_select_html),
18
+ replace_li_tag(zone_hidden_html),
19
+ replace_li_tag(value_hidden_html),
20
+ zone_span_html,
21
+ error_html,
22
+ hint_html,
23
+ ].compact.join("\n").html_safe
24
+
25
+ template.content_tag(:li, wrapper_contents, wrapper_html_options)
26
+ end
27
+
28
+ private
29
+
30
+ def init_object
31
+ if value = object.send(method)
32
+ object.send "#{method}=", value.in_time_zone(time_zone)
33
+ end
34
+
35
+ object.class_eval <<-RUBY
36
+ define_method(:#{method}_buffer) do
37
+ @#{method}_v ||= #{method}&.in_time_zone('#{time_zone}')
38
+ end
39
+
40
+ define_method(:#{method}_tz) do
41
+ #{method}_buffer&.strftime('%z')
42
+ end
43
+
44
+ define_method(:#{method}_date) do
45
+ #{method}_buffer&.strftime('%Y-%m-%d')
46
+ end
47
+
48
+ define_method(:#{method}_time) do
49
+ #{method}_buffer&.strftime('%R')
50
+ end
51
+ RUBY
52
+ end
53
+
54
+ def datepicker_options
55
+ {
56
+ label: label_text,
57
+ }.merge(options[:datepicker_options] || {})
58
+ end
59
+
60
+ def time_select_options
61
+ {
62
+ label: false,
63
+ collection: (0..23).map {|h| (0..59).select {|m| m % 5 == 0 }.map {|m| ['%02i' % h, '%02i' % m].join(':') } }.flatten,
64
+ }.merge(options[:time_select_options] || {})
65
+ end
66
+
67
+ def time_zone
68
+ options[:time_zone] || 'UTC'
69
+ end
70
+
71
+ # formtastic inputs generate <li> with no way to override
72
+ def replace_li_tag(html)
73
+ html.strip.sub(/^<li /, '<span ').sub(/<\/li>$/, '</span>').html_safe
74
+ end
75
+ end
@@ -0,0 +1,9 @@
1
+ class InlineCheckboxInput < Formtastic::Inputs::BooleanInput
2
+ def to_html
3
+ input_wrapping do
4
+ hidden_field_html <<
5
+ label_html <<
6
+ check_box_html
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ class TimeOfDayInput < ::Formtastic::Inputs::SelectInput
2
+ def initialize(*)
3
+ super
4
+
5
+ @options[:collection] ||= build_times_collection
6
+ end
7
+
8
+ private
9
+
10
+ def build_times_collection
11
+ hours = 0..23
12
+ minutes = (0..59).select {|m| m % 5 == 0 }
13
+ seconds = (0..59).select {|m| m % 60 == 0 }
14
+ times = hours.map {|h| minutes.map {|m| seconds.map {|s| Tod::TimeOfDay.new(h, m, s) } } }.flatten
15
+
16
+ format = '%I:%M %p'
17
+ times.map {|t| [t.strftime(format), t.to_s] }
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ require 'tzinfo'
2
+
3
+ module Hellobase
4
+ class << self
5
+ def domestic_time_zone_select_values(country_code)
6
+ TZInfo::Country.get(country_code).zone_info.map {|z| [z.description || z.timezone.friendly_identifier(true), z.identifier] }
7
+ end
8
+
9
+ def foreign_time_zone_select_values(country_code)
10
+ TZInfo::Country.all.reject {|c| c.code == country_code }.map(&:zone_info).flatten.uniq.map {|z| [z.description || z.timezone.friendly_identifier(false), z.identifier] }
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Hellobase
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.9'
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hellobase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony Wang
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-12 00:00:00.000000000 Z
11
+ date: 2020-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activeadmin
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.7'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: activesupport
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,48 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '2.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '6.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '6.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '6.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '6.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: actionview
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '6.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '6.0'
41
97
  - !ruby/object:Gem::Dependency
42
98
  name: minitest
43
99
  requirement: !ruby/object:Gem::Requirement
@@ -58,6 +114,20 @@ dependencies:
58
114
  - - "<"
59
115
  - !ruby/object:Gem::Version
60
116
  version: '5.14'
117
+ - !ruby/object:Gem::Dependency
118
+ name: nokogiri
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.10'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.10'
61
131
  - !ruby/object:Gem::Dependency
62
132
  name: warning
63
133
  requirement: !ruby/object:Gem::Requirement
@@ -72,7 +142,7 @@ dependencies:
72
142
  - - "~>"
73
143
  - !ruby/object:Gem::Version
74
144
  version: '1.0'
75
- description:
145
+ description:
76
146
  email:
77
147
  - awang@hellobase.com
78
148
  executables: []
@@ -81,17 +151,25 @@ extra_rdoc_files: []
81
151
  files:
82
152
  - MIT-LICENSE
83
153
  - lib/hellobase.rb
84
- - lib/hellobase/array_access.rb
85
- - lib/hellobase/date_creation.rb
86
- - lib/hellobase/datetime_creation.rb
87
- - lib/hellobase/divide_by_zero.rb
88
- - lib/hellobase/string_access.rb
89
- - lib/hellobase/time_creation.rb
154
+ - lib/hellobase/core_ext.rb
155
+ - lib/hellobase/core_ext/array_access.rb
156
+ - lib/hellobase/core_ext/date_creation.rb
157
+ - lib/hellobase/core_ext/datetime_creation.rb
158
+ - lib/hellobase/core_ext/divide_by_zero.rb
159
+ - lib/hellobase/core_ext/duration_arithmetic.rb
160
+ - lib/hellobase/core_ext/string_access.rb
161
+ - lib/hellobase/core_ext/time_creation.rb
162
+ - lib/hellobase/formtastic.rb
163
+ - lib/hellobase/formtastic/content_input.rb
164
+ - lib/hellobase/formtastic/datepicker_with_time_input.rb
165
+ - lib/hellobase/formtastic/inline_checkbox_input.rb
166
+ - lib/hellobase/formtastic/time_of_day_input.rb
167
+ - lib/hellobase/time_zones.rb
90
168
  - lib/hellobase/version.rb
91
- homepage:
169
+ homepage:
92
170
  licenses: []
93
171
  metadata: {}
94
- post_install_message:
172
+ post_install_message:
95
173
  rdoc_options: []
96
174
  require_paths:
97
175
  - lib
@@ -106,9 +184,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
184
  - !ruby/object:Gem::Version
107
185
  version: '0'
108
186
  requirements: []
109
- rubyforge_project:
110
- rubygems_version: 2.7.10
111
- signing_key:
187
+ rubygems_version: 3.1.4
188
+ signing_key:
112
189
  specification_version: 4
113
190
  summary: Ruby runtime environment for Hellobase
114
191
  test_files: []
@@ -1,21 +0,0 @@
1
- Date.singleton_class.prepend(
2
- Module.new do
3
- def parse(string)
4
- raise Hellobase::Error.new(:date_parse, nil, string) unless string =~ Hellobase::DATE_FORMAT
5
-
6
- begin
7
- super
8
- rescue ArgumentError
9
- raise Hellobase::Error.new(:date_parse, nil, string)
10
- end
11
- end
12
-
13
- def new(*args)
14
- begin
15
- super
16
- rescue ArgumentError
17
- raise Hellobase::Error.new(:date_new, nil, *args)
18
- end
19
- end
20
- end
21
- )
@@ -1,21 +0,0 @@
1
- Time.singleton_class.prepend(
2
- Module.new do
3
- def parse(string)
4
- raise Hellobase::Error.new(:datetime_parse, nil, string) unless string =~ Hellobase::DATETIME_FORMAT
5
-
6
- begin
7
- super
8
- rescue ArgumentError
9
- raise Hellobase::Error.new(:datetime_parse, nil, string)
10
- end
11
- end
12
-
13
- def new(*args)
14
- begin
15
- super
16
- rescue ArgumentError
17
- raise Hellobase::Error.new(:datetime_new, nil, *args)
18
- end
19
- end
20
- end
21
- )