core_ext 0.0.4 → 0.0.5

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.
@@ -0,0 +1,90 @@
1
+ module CoreExt
2
+ module NumberHelper
3
+ class NumberToRoundedConverter < NumberConverter # :nodoc:
4
+ self.namespace = :precision
5
+ self.validate_float = true
6
+
7
+ def convert
8
+ precision = options.delete :precision
9
+
10
+ if precision
11
+ case number
12
+ when Float, String
13
+ @number = BigDecimal(number.to_s)
14
+ when Rational
15
+ @number = BigDecimal(number, digit_count(number.to_i) + precision)
16
+ else
17
+ @number = number.to_d
18
+ end
19
+
20
+ if options.delete(:significant) && precision > 0
21
+ digits, rounded_number = digits_and_rounded_number(precision)
22
+ precision -= digits
23
+ precision = 0 if precision < 0 # don't let it be negative
24
+ else
25
+ rounded_number = number.round(precision)
26
+ rounded_number = rounded_number.to_i if precision == 0 && rounded_number.finite?
27
+ rounded_number = rounded_number.abs if rounded_number.zero? # prevent showing negative zeros
28
+ end
29
+
30
+ formatted_string =
31
+ if BigDecimal === rounded_number && rounded_number.finite?
32
+ s = rounded_number.to_s('F') + '0'*precision
33
+ a, b = s.split('.', 2)
34
+ a + '.' + b[0, precision]
35
+ else
36
+ "%00.#{precision}f" % rounded_number
37
+ end
38
+ else
39
+ formatted_string = number
40
+ end
41
+
42
+ delimited_number = NumberToDelimitedConverter.convert(formatted_string, options)
43
+ format_number(delimited_number)
44
+ end
45
+
46
+ private
47
+
48
+ def digits_and_rounded_number(precision)
49
+ if zero?
50
+ [1, 0]
51
+ else
52
+ digits = digit_count(number)
53
+ multiplier = 10 ** (digits - precision)
54
+ rounded_number = calculate_rounded_number(multiplier)
55
+ digits = digit_count(rounded_number) # After rounding, the number of digits may have changed
56
+ [digits, rounded_number]
57
+ end
58
+ end
59
+
60
+ def calculate_rounded_number(multiplier)
61
+ (number / BigDecimal.new(multiplier.to_f.to_s)).round * multiplier
62
+ end
63
+
64
+ def digit_count(number)
65
+ number.zero? ? 1 : (Math.log10(absolute_number(number)) + 1).floor
66
+ end
67
+
68
+ def strip_insignificant_zeros
69
+ options[:strip_insignificant_zeros]
70
+ end
71
+
72
+ def format_number(number)
73
+ if strip_insignificant_zeros
74
+ escaped_separator = Regexp.escape(options[:separator])
75
+ number.sub(/(#{escaped_separator})(\d*[1-9])?0+\z/, '\1\2').sub(/#{escaped_separator}\z/, '')
76
+ else
77
+ number
78
+ end
79
+ end
80
+
81
+ def absolute_number(number)
82
+ number.respond_to?(:abs) ? number.abs : number.to_d.abs
83
+ end
84
+
85
+ def zero?
86
+ number.respond_to?(:zero?) ? number.zero? : number.to_d.zero?
87
+ end
88
+ end
89
+ end
90
+ end
@@ -1,5 +1,6 @@
1
1
  require 'core_ext/big_decimal/conversions'
2
2
  require 'core_ext/deprecation'
3
+ require 'core_ext/number_helper'
3
4
 
4
5
  module CoreExt::NumericWithFormat
5
6
 
@@ -75,6 +76,8 @@ module CoreExt::NumericWithFormat
75
76
  # 1234567.to_s(:human_size) # => 1.18 MB
76
77
  # 1234567890.to_s(:human_size) # => 1.15 GB
77
78
  # 1234567890123.to_s(:human_size) # => 1.12 TB
79
+ # 1234567890123456.to_s(:human_size) # => 1.1 PB
80
+ # 1234567890123456789.to_s(:human_size) # => 1.07 EB
78
81
  # 1234567.to_s(:human_size, precision: 2) # => 1.2 MB
79
82
  # 483989.to_s(:human_size, precision: 2) # => 470 KB
80
83
  # 1234567.to_s(:human_size, precision: 2, separator: ',') # => 1,2 MB
@@ -117,7 +120,11 @@ module CoreExt::NumericWithFormat
117
120
  when :human_size
118
121
  return CoreExt::NumberHelper.number_to_human_size(self, options)
119
122
  else
120
- super
123
+ if is_a?(Float) || format.is_a?(Symbol)
124
+ super()
125
+ else
126
+ super
127
+ end
121
128
  end
122
129
  end
123
130
 
@@ -1,4 +1,5 @@
1
- require 'date'
1
+ require 'yaml'
2
+ require 'core_ext/date'
2
3
  require 'core_ext/time/calculations'
3
4
 
4
5
  class String
@@ -56,6 +56,7 @@ module CoreExt
56
56
  include CoreExt::Testing::TaggedLogging
57
57
  include CoreExt::Testing::SetupAndTeardown
58
58
  include CoreExt::Testing::Assertions
59
+ include CoreExt::Testing::Deprecation
59
60
  include CoreExt::Testing::TimeHelpers
60
61
  include CoreExt::Testing::FileFixtures
61
62
  extend CoreExt::Testing::Declarative
@@ -1,3 +1,3 @@
1
1
  module CoreExt
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -5,7 +5,7 @@ require 'core_ext/module/delegation'
5
5
  require 'core_ext/string/inflections'
6
6
  require 'core_ext/date_time/calculations'
7
7
 
8
- module CodeExt
8
+ module CoreExt
9
9
  # = XmlMini
10
10
  #
11
11
  # To use the much faster libxml parser:
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: core_ext
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Panachi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-21 00:00:00.000000000 Z
11
+ date: 2016-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -179,11 +179,13 @@ files:
179
179
  - lib/core_ext/deprecation/method_wrappers.rb
180
180
  - lib/core_ext/deprecation/proxy_wrappers.rb
181
181
  - lib/core_ext/deprecation/reporting.rb
182
+ - lib/core_ext/descendants_tracker.rb
182
183
  - lib/core_ext/digest/uuid.rb
183
184
  - lib/core_ext/duration.rb
184
185
  - lib/core_ext/enumerable.rb
185
186
  - lib/core_ext/file.rb
186
187
  - lib/core_ext/file/atomic.rb
188
+ - lib/core_ext/gzip.rb
187
189
  - lib/core_ext/hash.rb
188
190
  - lib/core_ext/hash/compact.rb
189
191
  - lib/core_ext/hash/conversions.rb
@@ -195,6 +197,7 @@ files:
195
197
  - lib/core_ext/hash/slice.rb
196
198
  - lib/core_ext/hash/transform_values.rb
197
199
  - lib/core_ext/hash_with_indifferent_access.rb
200
+ - lib/core_ext/i18n.rb
198
201
  - lib/core_ext/inflections.rb
199
202
  - lib/core_ext/inflector.rb
200
203
  - lib/core_ext/inflector/inflections.rb
@@ -213,9 +216,9 @@ files:
213
216
  - lib/core_ext/kernel/reporting.rb
214
217
  - lib/core_ext/kernel/singleton_class.rb
215
218
  - lib/core_ext/load_error.rb
219
+ - lib/core_ext/locale/en.yml
216
220
  - lib/core_ext/logger.rb
217
221
  - lib/core_ext/logger_silence.rb
218
- - lib/core_ext/marshal.rb
219
222
  - lib/core_ext/module.rb
220
223
  - lib/core_ext/module/aliasing.rb
221
224
  - lib/core_ext/module/anonymous.rb
@@ -233,6 +236,15 @@ files:
233
236
  - lib/core_ext/multibyte/chars.rb
234
237
  - lib/core_ext/multibyte/unicode.rb
235
238
  - lib/core_ext/name_error.rb
239
+ - lib/core_ext/number_helper.rb
240
+ - lib/core_ext/number_helper/number_converter.rb
241
+ - lib/core_ext/number_helper/number_to_currency_converter.rb
242
+ - lib/core_ext/number_helper/number_to_delimited_converter.rb
243
+ - lib/core_ext/number_helper/number_to_human_converter.rb
244
+ - lib/core_ext/number_helper/number_to_human_size_converter.rb
245
+ - lib/core_ext/number_helper/number_to_percentage_converter.rb
246
+ - lib/core_ext/number_helper/number_to_phone_converter.rb
247
+ - lib/core_ext/number_helper/number_to_rounded_converter.rb
236
248
  - lib/core_ext/numeric.rb
237
249
  - lib/core_ext/numeric/bytes.rb
238
250
  - lib/core_ext/numeric/conversions.rb
@@ -301,6 +313,7 @@ files:
301
313
  - lib/core_ext/time_with_zone.rb
302
314
  - lib/core_ext/time_zone.rb
303
315
  - lib/core_ext/uri.rb
316
+ - lib/core_ext/values/unicode_tables.dat
304
317
  - lib/core_ext/version.rb
305
318
  - lib/core_ext/xml_mini.rb
306
319
  - lib/core_ext/xml_mini/jdom.rb
@@ -331,9 +344,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
331
344
  version: '0'
332
345
  requirements: []
333
346
  rubyforge_project:
334
- rubygems_version: 2.4.5
347
+ rubygems_version: 2.4.5.1
335
348
  signing_key:
336
349
  specification_version: 4
337
350
  summary: ActiveSupport's core_ext for non Rails projects
338
351
  test_files: []
339
- has_rdoc:
@@ -1,19 +0,0 @@
1
- module CoreExt
2
- module MarshalWithAutoloading # :nodoc:
3
- def load(source)
4
- super(source)
5
- rescue ArgumentError, NameError => exc
6
- if exc.message.match(%r|undefined class/module (.+)|)
7
- # try loading the class/module
8
- $1.constantize
9
- # if it is an IO we need to go back to read the object
10
- source.rewind if source.respond_to?(:rewind)
11
- retry
12
- else
13
- raise exc
14
- end
15
- end
16
- end
17
- end
18
-
19
- Marshal.singleton_class.prepend(CoreExt::MarshalWithAutoloading)