time_jawn 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|