simple_model 1.4.2 → 1.4.3

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
  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