has-meta 0.8.2 → 0.9.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
  SHA256:
3
- metadata.gz: 504fd58be892719cfe7de2beee5ac0488e7618ad4b6529c748542a6e30753897
4
- data.tar.gz: 9b4dabb7d2f7771b1876182fc14b9d98f4c2f8ad9b01e43ad5fa2f5eb2a70a12
3
+ metadata.gz: 6449bf1d52f37f801937de1aa1dc88860cf438a0d8af2327ca515bd4e7b74beb
4
+ data.tar.gz: 786bd5e56684b80b714800ae2fcf38f32477c12dc8e8ad0492f3c70a7fd1da4e
5
5
  SHA512:
6
- metadata.gz: 82479b22cf38d4eabf06f6599524180463a137c0d0129eb2cab5c2e827ac50a37a5b80e65f51eb76f65344c66a8f6173edd3d948650627fcdd213d18275d63d3
7
- data.tar.gz: 75049b8e3886b8f7fbdda6c9eca828e5792d10590024f9251097c1f86945c67ca010532d95923a14b75178200ef42ecf07b7c210469329dee846cc6872ace93e
6
+ metadata.gz: c68307d445a2da8111c8a9318e4b0e0433233d7b94074b21c8c274c300e234706a49e31ff1cb698129c43109ce69d9a03de5e001c59d9ee4d865423456ea77bb
7
+ data.tar.gz: 616fb1958da452a0fadb480b09898a8f4d886f162e40e293dd84436f24554b07a142d01237e96798f13908ca3026016655e4df421ee7e148a674f7461d48a3b7
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- has-meta (0.8.2)
4
+ has-meta (0.9.0)
5
5
  activerecord (>= 4.2.8)
6
6
 
7
7
  GEM
@@ -0,0 +1,5 @@
1
+ ###0.9.0
2
+ * Add support for storing datetimes
3
+ * Return duck-typed values (strings to dates and times)
4
+ * Allow manually setting data type via `:as` option: `#meta_set :key, value, as: :type`
5
+
@@ -0,0 +1,5 @@
1
+ class AddDatetimeValueToMetaData < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column :met_data, :datetime_value, :datetime
4
+ end
5
+ end
@@ -5,11 +5,12 @@ module HasMeta
5
5
  self.meta_data.where(key: key.to_s).try(:first).try(:value)
6
6
  end
7
7
 
8
- def meta_set key, value
8
+ def meta_set key, value, options={}
9
9
  return meta_destroy key if value.nil? or value == ''
10
10
 
11
11
  meta = self.meta_data.where(key: key.to_s).first_or_create
12
- meta.value = value
12
+ # meta.value = value
13
+ meta.send :value=, value, options
13
14
  meta
14
15
  end
15
16
 
@@ -7,11 +7,16 @@ module HasMeta
7
7
  attr_reader :data_type
8
8
 
9
9
  def value
10
- @value ||= value_attributes.compact.values.pop
10
+ @value ||= convert_type value_attributes.compact.values.pop
11
11
  end
12
12
 
13
- def value= value
14
- @data_type, @value = resolve_data_type! value
13
+ def value= value, options={}
14
+ if options[:as]
15
+ @data_type = options[:as]
16
+ @value = value
17
+ else
18
+ @data_type, @value = resolve_data_type! value
19
+ end
15
20
  set_attribute
16
21
  end
17
22
 
@@ -40,6 +45,22 @@ module HasMeta
40
45
 
41
46
  private
42
47
 
48
+ def convert_type value
49
+ begin
50
+ if value =~ /^-?\d+/ and value.to_i > 2000000000
51
+ value.to_i
52
+ elsif value =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (\+|-)\d{4}$/
53
+ value.to_time
54
+ elsif value =~ /^\d{4}-\d{2}-\d{2}$/
55
+ value.to_date
56
+ else
57
+ value
58
+ end
59
+ rescue
60
+ value
61
+ end
62
+ end
63
+
43
64
  def self.value_hash_for value
44
65
  data_type, value = resolve_data_type! value
45
66
  {"#{data_type}_value": value}
@@ -58,15 +79,39 @@ module HasMeta
58
79
  return :decimal, value
59
80
  when ->(x) {x.kind_of? Date}
60
81
  return :date, value
82
+ when ->(x) {x.acts_like? :time}
83
+ if has_datetime_column?
84
+ return :datetime, value
85
+ else
86
+ return :text, value
87
+ end
61
88
  when ->(x) {x.respond_to? :id}
62
89
  return :integer, value.id
63
90
  else
64
91
  return :integer, value.to_i if value =~ /^-?\d+$/
65
92
  return :decimal, value.to_f if value =~ /^-?\d*\.\d+$/
93
+ return :date, value.to_date if date_try_convert value
94
+ return :datetime, value.to_datetime if has_datetime_column? and datetime_try_convert(value)
66
95
  return :text, value
67
96
  end
68
97
  end
69
98
 
99
+ def self.date_try_convert value
100
+ begin
101
+ value.to_date if value =~ /^\d{4}-\d{2}-\d{2}$/
102
+ rescue
103
+ nil
104
+ end
105
+ end
106
+
107
+ def self.datetime_try_convert value
108
+ begin
109
+ value.to_datetime if value =~ /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (\+|-)\d{4}$/
110
+ rescue
111
+ nil
112
+ end
113
+ end
114
+
70
115
  def resolve_data_type! value
71
116
  self.class.resolve_data_type! value
72
117
  end
@@ -88,5 +133,8 @@ module HasMeta
88
133
  self[:"#{@data_type}_value"] = @value
89
134
  end
90
135
 
136
+ def self.has_datetime_column?
137
+ self.column_names.include? 'datetime_value'
138
+ end
91
139
  end
92
140
  end
@@ -1,3 +1,3 @@
1
1
  module HasMeta
2
- VERSION = "0.8.2"
2
+ VERSION = "0.9.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has-meta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Drust
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-06 00:00:00.000000000 Z
11
+ date: 2018-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -84,7 +84,9 @@ files:
84
84
  - Rakefile
85
85
  - bin/console
86
86
  - bin/setup
87
+ - changelog.md
87
88
  - db/migrate/1_has_meta_migration.rb
89
+ - db/migrate/2_add_datetime_value_to_meta_data.rb
88
90
  - has-meta.gemspec
89
91
  - lib/has-meta.rb
90
92
  - lib/has_meta/data_mover.rb