time_jawn 1.1.1 → 1.2.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 +8 -8
- data/lib/time_jawn/time_jawn.rb +5 -40
- data/lib/time_jawn/time_jawn_private_class_methods.rb +65 -0
- data/spec/time_jawn_spec.rb +58 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGZiZjdlNDRiOTc1YzY4NTcyM2ZiNzA5NmI0ZTNiN2EwMzVlNDg0NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDAxNTQxODRlYWY1ZDFkNTM2ZDk4MGY4YzdiMzBjYThhYmY1NTNkMw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODA1OWU3YjAyNjI4NjMyNzBiYmY5YWI2YTVhYmNhYzUzY2Y2ZTAzOGQzZjVl
|
10
|
+
NzgyYTE1ZTcwZDY1NzM1NWU4NDc4MGM5MDJhNTcyZTZjZWYxMWFiNWQ4OWY2
|
11
|
+
MWIxNGQ2NmIyNTFiNjFmZDAxNTdhNTFhZTYwYmJhZDFiMWNlMjQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MWM4MDY2OGU3Y2EwY2U3YjFhMGQxY2ZiMTMzNTAxYjY2OWE1OWRiNzI2M2Vk
|
14
|
+
YWNjNTk2NWM4YWQ3ZTg0M2RiYzBhYjFmZjc1YWI0NTFlODljNGU4Y2Y2MDli
|
15
|
+
YTlhZmVkOWM4OGE1OTMzYmRmY2Y0MTM2MjhlOGEyZGU2YzQxNDI=
|
data/lib/time_jawn/time_jawn.rb
CHANGED
@@ -1,46 +1,12 @@
|
|
1
1
|
# The base module of the TimeJawn gem. Everything in here assumes that your model has a valid time zone
|
2
2
|
# in a attribute name time_zone or has been delegating one to somewhere else.
|
3
3
|
module TimeJawn
|
4
|
+
require 'time_jawn/time_jawn_private_class_methods'
|
4
5
|
# Automatically runs and adds ClassMethods to ActiveRecord::Base
|
5
6
|
def self.included(base)
|
6
7
|
base.send :extend, ClassMethods
|
7
8
|
end
|
8
9
|
|
9
|
-
|
10
|
-
# Defines private methods necessary for TimeJawn to work.
|
11
|
-
module TimeJawnPrivateClassMethods
|
12
|
-
# Locates all of an ActiveRecord class' DateTime Attributes and returns them as an array of symbols.
|
13
|
-
def _datetime_attributes
|
14
|
-
ActiveSupport::Deprecation.warn "_datetime_attributes will be made private in a future version."
|
15
|
-
klass = name.constantize
|
16
|
-
|
17
|
-
datetime_attributes = []
|
18
|
-
klass.columns.each do |column|
|
19
|
-
datetime_attributes << column.name.to_sym if column.type == :datetime
|
20
|
-
end
|
21
|
-
return datetime_attributes
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
# generates an instance method called "local_#{attribute}" that calls the _to_local instance method.
|
27
|
-
def _generate_to_local(attribute)
|
28
|
-
define_method(:"local_#{attribute}") { _to_local(send(attribute)) }
|
29
|
-
end
|
30
|
-
|
31
|
-
# generates an instance method called "local_#{attribute}=" that calls either the _add_zone or _change_zone
|
32
|
-
# instance methods depending on teh class of the input.
|
33
|
-
def _generate_to_local_with_assignment(attribute)
|
34
|
-
define_method(:"local_#{attribute}=") do |time_or_string_value|
|
35
|
-
if time_or_string_value.is_a? String
|
36
|
-
write_attribute(attribute, _add_zone(time_or_string_value))
|
37
|
-
else
|
38
|
-
write_attribute(attribute, _change_zone(time_or_string_value))
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
10
|
# Defines methods that will attached to all ActiveRecord classes.
|
45
11
|
module ClassMethods
|
46
12
|
include TimeJawnPrivateClassMethods
|
@@ -54,14 +20,12 @@ module TimeJawn
|
|
54
20
|
# class Event<ActiveRecord::Base
|
55
21
|
# has_time_zone :this_is_my_time_zone
|
56
22
|
# end
|
57
|
-
def has_time_zone(time_zone_attribute_name=:time_zone)
|
58
|
-
|
23
|
+
def has_time_zone(time_zone_attribute_name=:time_zone, options_hash={})
|
24
|
+
_set_instance_variables(time_zone_attribute_name, options_hash)
|
59
25
|
send :include, InstanceMethods
|
60
26
|
end
|
61
27
|
end
|
62
28
|
|
63
|
-
|
64
|
-
|
65
29
|
#Defines methods that will be added to instances of classes that have previously called has_time_zone.
|
66
30
|
module InstanceMethods
|
67
31
|
# This method generates a series of methods on instances by calling the _generate_to_local and
|
@@ -97,7 +61,8 @@ module TimeJawn
|
|
97
61
|
#
|
98
62
|
# You can see examples of how these methods work in the specs folder.
|
99
63
|
def self.included(base)
|
100
|
-
|
64
|
+
date_time_attributes = base.send(:_class_date_attributes_or_arguments)
|
65
|
+
date_time_attributes.each do |attribute|
|
101
66
|
base.send(:_generate_to_local, attribute)
|
102
67
|
base.send(:_generate_to_local_with_assignment, attribute)
|
103
68
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# Defines private methods necessary for TimeJawn to work.
|
2
|
+
module TimeJawnPrivateClassMethods
|
3
|
+
# Locates all of an ActiveRecord class' DateTime Attributes and returns them as an array of symbols.
|
4
|
+
def _datetime_attributes
|
5
|
+
ActiveSupport::Deprecation.warn "_datetime_attributes will be made private in a future version."
|
6
|
+
klass = name.constantize
|
7
|
+
|
8
|
+
datetime_attributes = []
|
9
|
+
klass.columns.each do |column|
|
10
|
+
datetime_attributes << column.name.to_sym if column.type == :datetime
|
11
|
+
end
|
12
|
+
return datetime_attributes
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def _set_instance_variables(time_zone_attribute_name, options_hash)
|
18
|
+
@time_zone_attribute_name = _evaluate_time_zone_attribute_name(time_zone_attribute_name)
|
19
|
+
@time_jawn_date_time_attributes = _evaluate_time_jawn_date_time_attributes(time_zone_attribute_name, options_hash)
|
20
|
+
end
|
21
|
+
|
22
|
+
def _evaluate_time_zone_attribute_name(time_zone_attribute_name)
|
23
|
+
if time_zone_attribute_name.kind_of?(Hash)
|
24
|
+
:time_zone
|
25
|
+
else
|
26
|
+
time_zone_attribute_name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def _evaluate_time_jawn_date_time_attributes(time_zone_attribute_name, options_hash)
|
31
|
+
if options_hash.fetch(:time_attributes, false)
|
32
|
+
@time_jawn_date_time_attributes = options_hash.fetch(:time_attributes, nil)
|
33
|
+
elsif time_zone_attribute_name.kind_of?(Hash)
|
34
|
+
@time_jawn_date_time_attributes = time_zone_attribute_name.fetch(:time_attributes, nil)
|
35
|
+
else
|
36
|
+
@time_jawn_date_time_attributes = nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# generates an instance method called "local_#{attribute}" that calls the _to_local instance method.
|
41
|
+
def _generate_to_local(attribute)
|
42
|
+
define_method(:"local_#{attribute}") { _to_local(send(attribute)) }
|
43
|
+
end
|
44
|
+
|
45
|
+
# generates an instance method called "local_#{attribute}=" that calls either the _add_zone or _change_zone
|
46
|
+
# instance methods depending on teh class of the input.
|
47
|
+
def _generate_to_local_with_assignment(attribute)
|
48
|
+
define_method(:"local_#{attribute}=") do |time_or_string_value|
|
49
|
+
if time_or_string_value.is_a? String
|
50
|
+
write_attribute(attribute, _add_zone(time_or_string_value))
|
51
|
+
else
|
52
|
+
write_attribute(attribute, _change_zone(time_or_string_value))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# returns all of the date_time attributes for a class unless it is specified in the class.
|
58
|
+
def _class_date_attributes_or_arguments
|
59
|
+
if @time_jawn_date_time_attributes
|
60
|
+
@time_jawn_date_time_attributes
|
61
|
+
else
|
62
|
+
_datetime_attributes
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/spec/time_jawn_spec.rb
CHANGED
@@ -210,3 +210,61 @@ describe Event do
|
|
210
210
|
it { should respond_to :_change_zone }
|
211
211
|
end
|
212
212
|
end
|
213
|
+
|
214
|
+
describe Occurrence do
|
215
|
+
before do
|
216
|
+
@occurrence1 = Occurrence.find_by_name('Eastern Time (US & Canada)')
|
217
|
+
end
|
218
|
+
|
219
|
+
context "Ocurrence instance attribute accessor" do
|
220
|
+
describe "time_zone_attribute_name" do
|
221
|
+
it 'should respond with the time_zone attribute name as defined in the class.' do
|
222
|
+
expect( @occurrence1.class.time_zone_attribute_name ).to eq :time_zone
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context "Occurrence should have time_jawn methods, except for local_updated_at, since it is not specified in the model" do
|
228
|
+
subject { @occurrence1 }
|
229
|
+
|
230
|
+
it { should respond_to :local_start_time }
|
231
|
+
it { should respond_to :local_created_at }
|
232
|
+
it { should_not respond_to :local_updated_at }
|
233
|
+
it { should respond_to :local_start_time= }
|
234
|
+
it { should respond_to :local_created_at= }
|
235
|
+
it { should_not respond_to :local_updated_at= }
|
236
|
+
it { should respond_to :current_time }
|
237
|
+
it { should respond_to :_to_local }
|
238
|
+
it { should respond_to :_add_zone }
|
239
|
+
it { should respond_to :_change_zone }
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
describe Occasion do
|
244
|
+
before do
|
245
|
+
@occasion1 = Occasion.find_by_name('Eastern Time (US & Canada)')
|
246
|
+
end
|
247
|
+
|
248
|
+
context "Occasion instance attribute accessor" do
|
249
|
+
describe "time_zone_attribute_name" do
|
250
|
+
it 'should respond with the time_zone attribute name as defined in the class.' do
|
251
|
+
expect( @occasion1.class.time_zone_attribute_name ).to eq :t_z
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
context "Occasion should have time_jawn methods, except for local_updated_at, since it is not specified in the model, even though it has a non_conventional attribute" do
|
257
|
+
subject { @occasion1 }
|
258
|
+
|
259
|
+
it { should respond_to :local_start_time }
|
260
|
+
it { should_not respond_to :local_created_at }
|
261
|
+
it { should_not respond_to :local_updated_at }
|
262
|
+
it { should respond_to :local_start_time= }
|
263
|
+
it { should_not respond_to :local_created_at= }
|
264
|
+
it { should_not respond_to :local_updated_at= }
|
265
|
+
it { should respond_to :current_time }
|
266
|
+
it { should respond_to :_to_local }
|
267
|
+
it { should respond_to :_add_zone }
|
268
|
+
it { should respond_to :_change_zone }
|
269
|
+
end
|
270
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_jawn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Platt
|
@@ -90,6 +90,7 @@ extra_rdoc_files: []
|
|
90
90
|
files:
|
91
91
|
- lib/time_jawn.rb
|
92
92
|
- lib/time_jawn/time_jawn.rb
|
93
|
+
- lib/time_jawn/time_jawn_private_class_methods.rb
|
93
94
|
- spec/time_jawn_spec.rb
|
94
95
|
homepage: http://tammantech.com
|
95
96
|
licenses:
|