simple_model 1.4.2 → 1.4.3

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
  SHA1:
3
- metadata.gz: 40145db9483512a0a6d4209605362c68fdac9679
4
- data.tar.gz: aaac8adad7bcbba5e3a08058c2b8b8a6df19317f
3
+ metadata.gz: 5d0480495e4e082cfe0aa97259f7267a42b14a10
4
+ data.tar.gz: d011d540617029664f7487593fd00c532de03ca4
5
5
  SHA512:
6
- metadata.gz: ab3cf5ed3c7a3213ba5bb2853da12181015e7c6a6110eebf5fb72d3043c2a3686636b3cc29431a44a458558f092498a4e8407cb35eafbe1f45d5b12cd5c35f14
7
- data.tar.gz: cd6bcd5f4e94bd2e8985a62179026401ce55efe8cc5d01359021463d352ee207d35ddb509d673702b659d6c53b79ca1a8e3e7bff88eb4fbaa50b057e32171804
6
+ metadata.gz: b12d771e2752809cc8122eaf778291c58657068377a434756074c196e59a3569e7f48d7fd21cae2ac8f11efecdc651337973c6186c43ecb68fc1b6e44fe4df56
7
+ data.tar.gz: 87486a5fbf7a4137ba4cde89cd5cc48ff7d12a0894158f8d654f79b6119c7f37e6c79a20dd0b315e80bf4da4a9ceaea0ac768cbd71f15a3c739554e2ca79dc67
@@ -0,0 +1,99 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ require 'benchmark/ips'
3
+ require 'simple_model'
4
+
5
+ puts `ruby -v`
6
+
7
+
8
+ # HotTub uses persisted blocks in several places.
9
+
10
+ # Tests performance of passing a known block to block call or yield.
11
+
12
+
13
+ us = "07/14/2011 13:43:37"
14
+ iso = "2011-07-14 13:43:37"
15
+ json = "\/Date(1310669017000)\/"
16
+
17
+ puts us.to_time
18
+ puts iso.to_time
19
+ puts json.to_time
20
+
21
+
22
+ Benchmark.ips do |x|
23
+
24
+ x.report("date iso") do
25
+ iso.to_date
26
+ end
27
+
28
+ x.report("date us") do
29
+ us.to_date
30
+ end
31
+
32
+ x.report("date json") do
33
+ json.to_date
34
+ end
35
+
36
+ x.report("time iso") do
37
+ iso.to_time
38
+ end
39
+
40
+ x.report("time us") do
41
+ us.to_time
42
+ end
43
+
44
+ x.report("time json") do
45
+ json.to_time
46
+ end
47
+
48
+ x.compare!
49
+ end
50
+
51
+ # V-1.4.3
52
+ # ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
53
+ # Calculating -------------------------------------
54
+ # date iso 12.056k i/100ms
55
+ # date us 11.120k i/100ms
56
+ # date json 9.113k i/100ms
57
+ # time iso 2.409k i/100ms
58
+ # time us 2.098k i/100ms
59
+ # time json 10.795k i/100ms
60
+ # -------------------------------------------------
61
+ # date iso 200.936k (± 2.9%) i/s - 1.013M
62
+ # date us 184.495k (± 3.3%) i/s - 922.960k
63
+ # date json 130.588k (± 1.4%) i/s - 656.136k
64
+ # time iso 27.103k (± 1.7%) i/s - 137.313k
65
+ # time us 23.126k (± 1.0%) i/s - 117.488k
66
+ # time json 187.509k (± 2.4%) i/s - 939.165k
67
+
68
+ # Comparison:
69
+ # date iso: 200935.7 i/s
70
+ # time json: 187508.9 i/s - 1.07x slower
71
+ # date us: 184494.7 i/s - 1.09x slower
72
+ # date json: 130588.2 i/s - 1.54x slower
73
+ # time iso: 27103.4 i/s - 7.41x slower
74
+ # time us: 23126.3 i/s - 8.69x slower
75
+
76
+ # V-1.4.2
77
+ # ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
78
+ # Calculating -------------------------------------
79
+ # date iso 3.499k i/100ms
80
+ # date us 2.997k i/100ms
81
+ # date json 2.391k i/100ms
82
+ # time iso 2.484k i/100ms
83
+ # time us 2.219k i/100ms
84
+ # time json 1.760k i/100ms
85
+ # -------------------------------------------------
86
+ # date iso 41.965k (± 1.9%) i/s - 209.940k
87
+ # date us 35.729k (± 1.2%) i/s - 179.820k
88
+ # date json 27.491k (± 1.5%) i/s - 138.678k
89
+ # time iso 27.247k (± 1.6%) i/s - 136.620k
90
+ # time us 23.937k (± 1.2%) i/s - 119.826k
91
+ # time json 19.031k (± 1.4%) i/s - 96.800k
92
+
93
+ # Comparison:
94
+ # date iso: 41964.9 i/s
95
+ # date us: 35729.2 i/s - 1.17x slower
96
+ # date json: 27491.2 i/s - 1.53x slower
97
+ # time iso: 27247.5 i/s - 1.54x slower
98
+ # time us: 23937.0 i/s - 1.75x slower
99
+ # time json: 19031.1 i/s - 2.21x slower
@@ -83,6 +83,8 @@ module SimpleModel
83
83
 
84
84
  class << self
85
85
 
86
+ # a call back that runs after a call to save, update, create or destroy
87
+ # even if the action fails validation (helpful for extra logging)
86
88
  def after_any(meth=nil)
87
89
  @after_any = meth if meth
88
90
  @after_any
@@ -2,7 +2,7 @@ module SimpleModel
2
2
  class Config
3
3
  DEFAULTS = {
4
4
  :initialize_defaults => false,
5
- :attributes_store => (RUBY_VERSION =~ /^2.2/ ? :symbol : :string) # OPTIONS => :string, :symbol, :indifferent
5
+ :attributes_store => (RUBY_VERSION >= "2.2" ? :symbol : :string) # OPTIONS => :string, :symbol, :indifferent
6
6
  }.freeze
7
7
 
8
8
  ATTRIBUTE_STORES = {
@@ -53,9 +53,29 @@ module SimpleModel
53
53
  #Extend Ruby String.rb
54
54
  String.class_eval do
55
55
 
56
+ US_DATE_REGEX = (/(^[0-9]{1,2}[- \/.][0-9]{1,2}[- \/.][0-9]{4})/).freeze
57
+
58
+ JSON_DATE_REGEX = (/^(\/Date\().*(\)\/)$/).freeze
59
+
60
+ DIGIT_ONLY_REGEX = (/^+d$/).freeze
61
+
62
+ SPLIT_DATE_REGEX = (/\-|\/|\./).freeze
63
+
64
+ DATE_TR = ('/\/|\./').freeze
65
+
66
+ JSON_DATE_TR = ('/[a-zA-z\(\)\\\/]*/').freeze
67
+
68
+ EMPTY_STRING = ''.freeze
69
+
70
+ US_DATE_FORMAT = "%m-%d-%Y".freeze
71
+
72
+ ISO_DATE_FORMAT = "%Y-%m-%d".freeze
73
+
74
+ BOOLEAN_REGEX = (/^(true|t|yes|y|1)$/i).freeze
75
+
56
76
  # returns boolean value for common boolean string values
57
77
  def to_b
58
- return true if self =~ (/^(true|t|yes|y|1)$/i)
78
+ return true if self =~ BOOLEAN_REGEX
59
79
  false
60
80
  end
61
81
 
@@ -69,20 +89,10 @@ module SimpleModel
69
89
  # * safe_date_string("\/Date(1310669017000)\/") # =>
70
90
  def safe_datetime_string
71
91
  safe_date = nil
72
- if self[0..9] =~ (/^(0[1-9]|[1-9]|1[012])[- \/.]([1-9]|0[1-9]|[12][0-9]|3[01])[- \/.][0-9][0-9][0-9][0-9]/)
73
- safe_date = ""
74
- splt = split(/\-|\/|\./)
75
- time = ""
76
- if splt[2].length > 4
77
- time = splt[2][4..(splt[2].length - 1)]
78
- splt[2] = splt[2][0..3]
79
- end
80
- if splt.length == 3 && splt[2].length == 4
81
- safe_date << "#{splt[2]}-#{splt[0]}-#{splt[1]}"
82
- safe_date << "#{time}" unless time.nil? || time.to_s.length == 0
83
- end
84
- elsif self =~ /^\/Date\(/
85
- safe_date = Time.at(((self.gsub(/(\/Date\()/,"")).gsub(/\)\/$/,"").to_i) / 1000).to_s
92
+ if self =~ US_DATE_REGEX
93
+ safe_date = us_date_to_iso_str
94
+ elsif self =~ JSON_DATE_REGEX
95
+ safe_date = json_date_to_time.to_s
86
96
  else
87
97
  safe_date = self
88
98
  end
@@ -92,28 +102,56 @@ module SimpleModel
92
102
  # Use safe_datetime_string help with those pesky US date formats in Ruby 1.9
93
103
  # or to change an integer string to date
94
104
  def to_date
95
- return safe_datetime_string.to_i.to_date if self =~ /^+d$/
96
- Date.parse(safe_datetime_string)
105
+ return self.to_i.to_date if self =~ DIGIT_ONLY_REGEX
106
+ if self =~ US_DATE_REGEX
107
+ Date.strptime(self.tr(DATE_TR,'-'), US_DATE_FORMAT)
108
+ elsif self =~ JSON_DATE_REGEX
109
+ json_date_to_time.to_date
110
+ else
111
+ Date.strptime(self.tr(DATE_TR,'-'), ISO_DATE_FORMAT)
112
+ end
97
113
  end
98
114
 
99
115
  # Use safe_datetime_string help with those pesky US date formats in Ruby 1.9
100
116
  # or to change an integer string to date
101
117
  def to_time
102
- return safe_datetime_string.to_i.to_time if self =~ /^+d$/
103
- Time.parse(safe_datetime_string)
118
+ return self.to_i.to_time if self =~ DIGIT_ONLY_REGEX
119
+ if self =~ US_DATE_REGEX
120
+ Time.parse(us_date_to_iso_str)
121
+ elsif self =~ JSON_DATE_REGEX
122
+ json_date_to_time
123
+ else
124
+ Time.parse(self)
125
+ end
104
126
  end
105
127
 
106
128
  alias :core_to_f :to_f
107
129
 
130
+ SCRUB_NUMBER_REGEX = /[^0-9\.\+\-]/.freeze
131
+
108
132
  # Remove none numeric characters then run default ruby float cast
109
133
  def to_f
110
- gsub(/[^0-9\.\+\-]/, '').core_to_f
134
+ gsub(SCRUB_NUMBER_REGEX, EMPTY_STRING).core_to_f
111
135
  end
112
136
 
113
137
  alias :core_to_d :to_d
114
138
 
115
139
  def to_d
116
- gsub(/[^0-9\.\+\-]/, '').core_to_d
140
+ gsub(SCRUB_NUMBER_REGEX, EMPTY_STRING).core_to_d
141
+ end
142
+
143
+ private
144
+
145
+ def json_date_to_time
146
+ (Time.at(self.tr(JSON_DATE_TR,EMPTY_STRING).to_i / 1000))
147
+ end
148
+
149
+ def us_date_to_iso_str
150
+ date_split = split(US_DATE_REGEX)
151
+ time = date_split[2]
152
+ date = date_split[1]
153
+ date_split = date.split(SPLIT_DATE_REGEX)
154
+ "#{date_split[2]}-#{date_split[0]}-#{date_split[1]}#{time}"
117
155
  end
118
156
  end
119
157
 
@@ -124,6 +162,7 @@ module SimpleModel
124
162
  !zero?
125
163
  end
126
164
  end
165
+
127
166
  Fixnum.class_eval do
128
167
  include ToCurrencyS
129
168
 
@@ -1,3 +1,3 @@
1
1
  module SimpleModel
2
- VERSION = "1.4.2"
2
+ VERSION = "1.4.3"
3
3
  end
@@ -104,7 +104,6 @@ describe SimpleModel::Base do
104
104
  @log = "stuff"
105
105
  end
106
106
 
107
-
108
107
  def my_save_method
109
108
  true
110
109
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.2
4
+ version: 1.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua T Mckinney
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-02 00:00:00.000000000 Z
11
+ date: 2015-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -107,6 +107,7 @@ files:
107
107
  - LICENSE.txt
108
108
  - README.md
109
109
  - Rakefile
110
+ - benchmarks/extend_core.rb
110
111
  - benchmarks/simple_model.rb
111
112
  - gemfiles/3.2.gemfile
112
113
  - gemfiles/4.0.gemfile
@@ -147,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
148
  version: '0'
148
149
  requirements: []
149
150
  rubyforge_project: simple_model
150
- rubygems_version: 2.4.8
151
+ rubygems_version: 2.4.5.1
151
152
  signing_key:
152
153
  specification_version: 4
153
154
  summary: Simpifies building tableless models or models backed by webservices