lotus-utils 0.3.0 → 0.3.1

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: 1d04858b6a58f09fa11b7067a9f10b4b936e724b
4
- data.tar.gz: 0e7c601a620a91a58516869b34de12013c86d599
3
+ metadata.gz: 3bdc8a61bce6ac30e4889fc50aa7272f14b8b960
4
+ data.tar.gz: 22817bdd0799c56964c5a27c74df73ee268ed073
5
5
  SHA512:
6
- metadata.gz: 50dd0f5ae40cec11a6e3b06275988fb1a1535ce42007aaccdf84ba6ec12ff000f9e6ddc67bfb90dab041e5565769cf8c116ffd227f3cdff804cdfeb4ce13101a
7
- data.tar.gz: 4136424d1f2efa2082b58adc347ffecedbc4f14200e7cf03609222364a870722e50c2f1e891bddf154bb075fdd0ac1d5072ab67718ca1920430010d52ad29e96
6
+ metadata.gz: d13c9c20d2c91da1c235b9feb742c8bca7baed56de1cc9f7e2f96213ea452b7df77160190e3d1c69a4170fd0829af3377f212e9530756c0212e7025ff1ee6eeb
7
+ data.tar.gz: 8913ccc6cc7d62dd996071112054380a9454f8f1b4a8a37451b602c3568c2107b0c735646822398b4a585619a9d73b571e5270b236c885f84b936e4ac6547dd7
data/CHANGELOG.md CHANGED
@@ -1,123 +1,97 @@
1
- ## v0.3.0
2
- ### Oct 23, 2014
3
-
4
- 4f7a8cf 2014-10-22 **Luca Guidi** Use 1/3 less objects when using Lotus::Utils::Kernel.Array
5
-
6
- a82437d 2014-10-20 **Luca Guidi** Improved error message for Utils::Class.load!
7
-
8
- 2a7134d 2014-10-17 **Tom Kadwill** Improved error NameError message by passing in the whole constant name
9
-
10
- 52c9fe2 2014-10-16 **Luca Guidi** Utils::Hash#to_h return instances of ::Hash in case of nested symbolized data structure
11
-
12
- 6b9ba7b 2014-09-23 **Luca Guidi** Raise TypeError if nil is passed for PathPrefix#relative_join
13
-
14
- 28d119f 2014-08-19 **Celso Fernandes** Add BigDecimal coercion to Lotus::Utils::Kernel
15
-
16
- a1b7213 2014-08-18 **Luca Guidi** Ensure PathPrefix#relative_join will raise a meaningful error
17
-
18
- 139c4d5 2014-08-03 **Luca Guidi** Define Boolean, if missing :airplane:
19
-
20
- 520c021 2014-07-29 **Peter Suschlik** Speedup Lotus::Utils::String#tokenize
21
-
22
- 2380d62 2014-07-29 **Peter Suschlik** Define Lotus::Utils::Hash#respond_to_missing?
23
-
24
- 1c300af 2014-07-29 **Peter Suschlik** Define Lotus::Utils::String#responds_to_missing?
25
-
26
- 46b39e3 2014-07-25 **Luca Guidi** Let Utils::Hash#inspect output to be the same of ::Hash#inspect
27
-
28
- 5b3e790 2014-07-25 **Luca Guidi** Use composition over inheritance for Lotus::Utils::PathPrefix
29
-
30
- 6333287 2014-07-09 **Luca Guidi** Specify ::Hash in Lotus::Utils::Kernel.Hash
31
-
32
- 25e101e 2014-07-09 **Luca Guidi** Use composition over inheritance for Lotus::Utils::Hash
33
-
34
- dea7e6b 2014-07-07 **Luca Guidi** Lotus::Utils::String is now a wrapper around a string, instead of inheriting from String.
35
-
36
- ## v0.2.0
37
- ### Jun 23, 2014
38
-
39
- a969fda 2014-06-12 **Luca Guidi** Implemented Lotus::Utils::Kernel.Symbol
40
-
41
- 13532f5 2014-06-13 **Luca Guidi** [breaking] Implemented Lotus::Utils::Callbacks::Chain#freeze in order to prevent modification after the object has been frozen
42
-
43
- e438da8 2014-06-13 **Luca Guidi** [breaking] All the Utils::Kernel methods will raise TypeError in case of failed coercion.
44
-
45
- 7fd90d1 2014-06-13 **Luca Guidi** Make Kernel.Pathname to raise an error when nil is passed as argument
46
-
47
- 6437791 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Time to raise an error when nil is passed as argument
48
-
49
- c7f428b 2014-06-13 **Luca Guidi** [breaking] Make Kernel.DateTime to raise an error when nil is passed as argument
50
-
51
- ab0dc0c 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Date to raise an error when nil is passed as argument
52
-
53
- 11d5c1c 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Boolean to return false when nil is passed as argument
54
-
55
- c3bcaea 2014-06-13 **Luca Guidi** [breaking] Make Kernel.String to return an empty string when nil is passed as argument
56
-
57
- 0bd3826 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Float to return 0.0 when nil is passed as argument
58
-
59
- 7ce8018 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Integer to return 0 when nil is passed as argument
60
-
61
- 0377326 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Hash to return an empty hash when nil is passed as argument
62
-
63
- d3b0e2a 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Set to return an empty set when nil is passed as argument
64
-
65
- cd2d1b8 2014-06-13 **Luca Guidi** [breaking] Make Kernel.Array to return an empty array when nil is passed as argument
66
-
67
- 32c15d6 2014-06-09 **Luca Guidi** Implemented Lotus::Utils::LoadPaths#freeze in order to prevent modification after the object has been frozen
68
-
69
- 2b8d8d5 2014-06-09 **Luca Guidi** Implemented Lotus::Utils::LoadPaths#initialize_copy in order to safely dup and clone
70
-
71
- 9a91222 2014-06-09 **Luca Guidi** Implemented Lotus::Utils::LoadPaths#push, also aliased as #<<
72
-
73
- 1d3d986 2014-06-08 **Luca Guidi** Use composition over inheritance for Lotus::Utils::LoadPaths
74
-
75
- 82d0af3 2014-06-08 **Luca Guidi** [breaking] Use composition over inheritance for Lotus::Utils::Callbacks::Chain
76
-
77
- 442175b 2014-06-04 **Luca Guidi** Introduced Lotus::Utils::LoadPaths
78
-
79
- 2734a87 2014-05-28 **Luca Guidi** Introduced Lotus::Utils::String#namespace, in order to return the top level Ruby namespace for the given string
80
-
81
- a2a19e9 2014-05-10 **Luca Guidi** Support for Ruby 2.1.2
82
-
83
- 07146a1 2014-05-08 **Luca Guidi** Implemented Lotus::Utils::Kernel.Pathname
84
-
85
- ## v0.1.1
86
- ### Apr 23, 2014
87
-
88
- c125e0c _2014-04-18_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Time
89
-
90
- b366672 _2014-04-18_ **Luca Guidi** Implemented Lotus::Utils::Kernel.DateTime
91
-
92
- 37a010f _2014-04-17_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Date
93
-
94
- 484ec9d _2014-04-17_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Float
95
-
96
- 69dd6eb _2014-04-16_ **Christopher Keele** Add missing stdlib Set require to ClassAttribute.
97
-
98
- 82c0f54 _2014-04-12_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Boolean
99
-
100
- 48ba6fb _2014-04-11_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Hash
101
-
102
- c10d561 _2014-04-11_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Set
103
-
104
- 5582e72 _2014-04-11_ **Karl Freeman** add Github contributing guidelines
105
-
106
- 012f266 _2014-04-11_ **Luca Guidi** Implemented Lotus::Utils::Kernel.String
107
-
108
- e1a35e2 _2014-04-08_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Integer
109
-
110
- 152c856 _2014-04-08_ **Luca Guidi** Implemented Lotus::Utils::Kernel.Array
111
-
112
- ## v0.1.0
113
- ### Jan 23, 2014
114
-
115
- 1212e9d _2014-01-16_ **Luca Guidi** Introduced Lotus::Utils::String#demodulize
116
-
117
- f9badc2 _2014-01-16_ **Luca Guidi** Fix for ClassAttribute: ensure class attributes to be inherited even the subclass is defined into a different namespace
118
-
119
- c19d26b _2014-01-07_ **Luca Guidi** Introducing Lotus::Utils::IO
120
-
121
- 0453716 _2013-08-08_ **Luca Guidi** Added Class loading mechanism
122
-
123
- 272304b _2013-08-07_ **Luca Guidi** Initial mess
1
+ # Lotus::Utils
2
+ Ruby core extentions and class utilities for Lotus
3
+
4
+ ## v0.3.1 - 2014-11-23
5
+ ### Added
6
+ - [Luca Guidi] Allow `Utils::Class.load!` to accept any object that implements `#to_s`
7
+ - [Trung Lê] Allow `Utils::Class.load!` to accept a class
8
+ - [Luca Guidi] Introduced `Utils::Class.load_from_pattern!`
9
+ - [Luca Guidi] Introduced `Utils.jruby?` and `Utils.rubinius?`
10
+ - [Luca Guidi] Introduced `Utils::Deprecation`
11
+ - [Luca Guidi] Official support for Rubinius 2.3+
12
+ - [Luca Guidi] Official support for JRuby 1.7+ (with 2.0 mode)
13
+ - [Janko Marohnić] Implemented `Utils::PathPrefix` relativness and absolutness
14
+ - [Luca Guidi] Made `Utils::PathPrefix` `#join` and `#relative_join` to return a new instance of that class
15
+ - [Luca Guidi] Implemented `Utils::Hash#deep_dup`
16
+ - [Luca Guidi] Made `Utils::PathPrefix#join` to accept multiple argument
17
+
18
+ ### Fixed
19
+ - [Luca Guidi] Made `Utils::PathPrefix#join` remove trailing occurrences for `@separator` from the output
20
+ - [Luca Guidi] Made `Utils::PathPrefix#relative_join` to correctly replace all the instances of `@separator` from the output
21
+
22
+ ### Deprecated
23
+ - [Luca Guidi] Deprecated `Utils::Class.load!` with a pattern like `Articles(Controller|::Controller)`, use `Utils::Class.load_from_pattern!` instead
24
+
25
+ ## v0.3.0 - 2014-10-23
26
+ ### Added
27
+ - [Celso Fernandes] Add BigDecimal coercion to Lotus::Utils::Kernel
28
+ - [Luca Guidi] Define `Boolean` constant, if missing
29
+ - [Luca Guidi] Use composition over inheritance for `Lotus::Utils::PathPrefix`
30
+ - [Luca Guidi] Use composition over inheritance for `Lotus::Utils::Hash`
31
+ - [Luca Guidi] Use composition over inheritance for `Lotus::Utils::String`
32
+
33
+ ### Fixed
34
+ - [Luca Guidi] Improved error message for `Utils::Class.load!`
35
+ - [Tom Kadwill] Improved error `NameError` message by passing in the whole constant name to `Utils::Class.load!`
36
+ - [Luca Guidi] `Utils::Hash#to_h` return instances of `::Hash` in case of nested symbolized data structure
37
+ - [Luca Guidi] Raise `TypeError` if `nil` is passed to `PathPrefix#relative_join`
38
+ - [Peter Suschlik] Define `Lotus::Utils::Hash#respond_to_missing?`
39
+ - [Peter Suschlik] Define `Lotus::Utils::String#responds_to_missing?`
40
+ - [Luca Guidi] Ensure `Utils::Hash#inspect` output to be the same of `::Hash#inspect`
41
+
42
+ ## v0.2.0 - 2014-06-23
43
+ ### Added
44
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Symbol`
45
+ - [Luca Guidi] Made `Kernel.Pathname` to raise an error when `nil` is passed as argument
46
+ - [Luca Guidi] Implemented `Lotus::Utils::LoadPaths#freeze` in order to prevent modification after the object has been frozen
47
+ - [Luca Guidi] Implemented Lotus::Utils::LoadPaths#push, also aliased as #<<
48
+ - [Luca Guidi] Use composition over inheritance for `Lotus::Utils::LoadPaths`
49
+ - [Luca Guidi] Introduced `Lotus::Utils::LoadPaths`
50
+ - [Luca Guidi] Introduced `Lotus::Utils::String#namespace`, in order to return the top level Ruby namespace for the given string
51
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Pathname`
52
+
53
+ ### Fixed
54
+ - [Luca Guidi] Implemented `Lotus::Utils::LoadPaths#initialize_copy` in order to safely `#dup` and `#clone`
55
+
56
+ ### Changed
57
+ - [Luca Guidi] Implemented `Lotus::Utils::Callbacks::Chain#freeze` in order to prevent modification after the object has been frozen
58
+ - [Luca Guidi] All the `Utils::Kernel` methods will raise `TypeError` in case of failed coercion.
59
+ - [Luca Guidi] Made `Kernel.Time` to raise an error when `nil` is passed as argument
60
+ - [Luca Guidi] Made `Kernel.DateTime` to raise an error when `nil` is passed as argument
61
+ - [Luca Guidi] Made `Kernel.Date` to raise an error when `nil` is passed as argument
62
+ - [Luca Guidi] Made `Kernel.Boolean` to return false when `nil` is passed as argument
63
+ - [Luca Guidi] Made `Kernel.String` to return an empty string when `nil` is passed as argument
64
+ - [Luca Guidi] Made `Kernel.Float` to return `0.0` when `nil` is passed as argument
65
+ - [Luca Guidi] Made `Kernel.Integer` to return `0` when `nil` is passed as argument
66
+ - [Luca Guidi] Made `Kernel.Hash` to return an empty `Hash` when `nil` is passed as argument
67
+ - [Luca Guidi] Made `Kernel.Set` to return an empty `Set` when `nil` is passed as argument
68
+ - [Luca Guidi] Made `Kernel.Array` to return an empty `Array` when `nil` is passed as argument
69
+ - [Luca Guidi] Use composition over inheritance for `Lotus::Utils::Callbacks::Chain`
70
+
71
+ ## v0.1.1 - 2014-04-23
72
+ ### Added
73
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Time`
74
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.DateTime`
75
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Date`
76
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Float`
77
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Boolean`
78
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Hash`
79
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Set`
80
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.String`
81
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Integer`
82
+ - [Luca Guidi] Implemented `Lotus::Utils::Kernel.Array`
83
+
84
+ ### Fixed
85
+ - [Christopher Keele] Add missing stdlib `Set` require to `Utils::ClassAttribute`
86
+
87
+ ## v0.1.0 - 2014-01-23
88
+ ### Added
89
+ - [Luca Guidi] Introduced `Lotus::Utils::String#demodulize`
90
+ - [Luca Guidi] Introduced `Lotus::Utils::IO.silence_warnings`
91
+ - [Luca Guidi] Introduced class loading mechanism from a string: `Utils::Class.load!`
92
+ - [Luca Guidi] Introduced callbacks support for classes
93
+ - [Luca Guidi] Introduced inheritable class level attributes
94
+ - [Luca Guidi] Introduced `Utils::Hash`
95
+ - [Luca Guidi] Introduced `Utils::String`
96
+ - [Luca Guidi] Introduced `Utils::PathPrefix`
97
+ - [Luca Guidi] Official support for MRI 2.0+
data/README.md CHANGED
@@ -22,7 +22,7 @@ Ruby core extentions and class utilities for [Lotus](http://lotusrb.org)
22
22
 
23
23
  ## Rubies
24
24
 
25
- __Lotus::Utils__ supports Ruby (MRI) 2+ and JRuby 1.7 (with 2.0 mode).
25
+ __Lotus::Utils__ supports Ruby (MRI) 2+, JRuby 1.7+ (with 2.0 mode) and Rubinius 2.3.0+.
26
26
 
27
27
  ## Installation
28
28
 
@@ -1,22 +1,64 @@
1
1
  require 'lotus/utils/string'
2
+ require 'lotus/utils/deprecation'
2
3
 
3
4
  module Lotus
4
5
  module Utils
5
6
  # Class utilities
6
7
  # @since 0.1.0
7
8
  class Class
8
- # Loads a class for the given string or pattern.
9
- #
10
- # @param name [String] the specific class name or pattern for the class that we want to load
9
+ # Loads a class for the given name.
11
10
  #
11
+ # @param name [String, Class] the specific class name
12
12
  # @param namespace [Class, Module] the Ruby namespace where we want to perform the lookup.
13
- #
14
13
  # @return [Class, Module] the found Ruby constant.
15
14
  #
16
15
  # @raise [NameError] if no constant can be found.
17
16
  #
18
17
  # @since 0.1.0
19
18
  #
19
+ # @example
20
+ # require 'lotus/utils/class'
21
+ #
22
+ # module App
23
+ # module Service
24
+ # class Endpoint
25
+ # end
26
+ # end
27
+ #
28
+ # class ServiceEndpoint
29
+ # end
30
+ # end
31
+ #
32
+ # # basic usage
33
+ # Lotus::Utils::Class.load!('App::Service') # => App::Service
34
+ # Lotus::Utils::Class.load!(App::Service) # => App::Service
35
+ #
36
+ # # with explicit namespace
37
+ # Lotus::Utils::Class.load!('Service', App) # => App::Service
38
+ #
39
+ # # with missing constant
40
+ # Lotus::Utils::Class.load!('Unknown') # => raises NameError
41
+ def self.load!(name, namespace = Object)
42
+ name = name.to_s
43
+
44
+ if name.match(/\|/)
45
+ Utils::Deprecation.new("Using Lotus::Utils::Class.load! with a pattern is deprecated, please use Lotus::Utils::Class.load_from_pattern!: #{ name }, #{ namespace }")
46
+ return load_from_pattern!(name, namespace)
47
+ end
48
+
49
+ namespace.const_get(name)
50
+ end
51
+
52
+ # Loads a class from the given pattern name and namespace
53
+ #
54
+ # @param pattern [String] the class name pattern
55
+ # @param namespace [Class, Module] the Ruby namespace where we want to perform the lookup.
56
+ # @return [Class, Module] the found Ruby constant.
57
+ #
58
+ # @raise [NameError] if no constant can be found.
59
+ #
60
+ # @since x.x.x
61
+ #
20
62
  # @see Lotus::Utils::String#tokenize
21
63
  #
22
64
  # @example
@@ -44,15 +86,15 @@ module Lotus
44
86
  #
45
87
  # # with missing constant
46
88
  # Lotus::Utils::Class.load!('Unknown') # => raises NameError
47
- def self.load!(name, namespace = Object)
48
- String.new(name).tokenize do |token|
89
+ def self.load_from_pattern!(pattern, namespace = Object)
90
+ String.new(pattern).tokenize do |token|
49
91
  begin
50
92
  return namespace.const_get(token)
51
93
  rescue NameError
52
94
  end
53
95
  end
54
96
 
55
- full_name = [ (namespace == Object ? nil : namespace), name ].compact.join('::')
97
+ full_name = [ (namespace == Object ? nil : namespace), pattern ].compact.join('::')
56
98
  raise NameError.new("uninitialized constant #{ full_name }")
57
99
  end
58
100
  end
@@ -0,0 +1,70 @@
1
+ require 'lotus/utils'
2
+
3
+ module Lotus
4
+ module Utils
5
+ # Prints a deprecation warning when initialized
6
+ #
7
+ # @since x.x.x
8
+ class Deprecation
9
+ # Initialize a deprecation message and prints it to standard error.
10
+ #
11
+ # @param message [#to_s] a deprecation message
12
+ #
13
+ # @since x.x.x
14
+ #
15
+ # @example Direct usage
16
+ # require 'lotus/utils/deprecation'
17
+ #
18
+ # class Engine
19
+ # def old_method
20
+ # Lotus::Utils::Deprecation.new('old_method is deprecated, please use new_method')
21
+ # new_method
22
+ # end
23
+ #
24
+ # def new_method
25
+ # puts 'started'
26
+ # end
27
+ # end
28
+ #
29
+ # Engine.new.old_method
30
+ # # => old_method is deprecated, please use new_method - called from: test.rb:14:in `<main>'.
31
+ # # => started
32
+ #
33
+ # @example Indirect usage
34
+ # require 'lotus/utils/deprecation'
35
+ #
36
+ # class Engine
37
+ # def old_method
38
+ # Lotus::Utils::Deprecation.new('old_method is deprecated, please use new_method')
39
+ # new_method
40
+ # end
41
+ #
42
+ # def new_method
43
+ # puts 'started'
44
+ # end
45
+ # end
46
+ #
47
+ # class Car
48
+ # def initialize
49
+ # @engine = Engine.new
50
+ # end
51
+ #
52
+ # def start
53
+ # @engine.old_method
54
+ # end
55
+ # end
56
+ #
57
+ # Car.new.start
58
+ # # => old_method is deprecated, please use new_method - called from: test.rb:20:in `start'.
59
+ # # => started
60
+ def initialize(message)
61
+ ::Kernel.warn("#{ message } - called from: #{ caller[caller_index] }.")
62
+ end
63
+
64
+ private
65
+ def caller_index
66
+ Utils.jruby? || Utils.rubinius? ? 1 : 2
67
+ end
68
+ end
69
+ end
70
+ end
@@ -57,6 +57,73 @@ module Lotus
57
57
  self
58
58
  end
59
59
 
60
+ # Return a deep copy of the current Lotus::Utils::Hash
61
+ #
62
+ # @return [Hash] a deep duplicated self
63
+ #
64
+ # @since x.x.x
65
+ #
66
+ # @example
67
+ # require 'lotus/utils/hash'
68
+ #
69
+ # hash = Lotus::Utils::Hash.new(
70
+ # 'nil' => nil,
71
+ # 'false' => false,
72
+ # 'true' => true,
73
+ # 'symbol' => :foo,
74
+ # 'fixnum' => 23,
75
+ # 'bignum' => 13289301283 ** 2,
76
+ # 'float' => 1.0,
77
+ # 'complex' => Complex(0.3),
78
+ # 'bigdecimal' => BigDecimal.new('12.0001'),
79
+ # 'rational' => Rational(0.3),
80
+ # 'string' => 'foo bar',
81
+ # 'hash' => { a: 1, b: 'two', c: :three },
82
+ # 'u_hash' => Lotus::Utils::Hash.new({ a: 1, b: 'two', c: :three })
83
+ # )
84
+ #
85
+ # duped = hash.deep_dup
86
+ #
87
+ # hash.class # => Lotus::Utils::Hash
88
+ # duped.class # => Lotus::Utils::Hash
89
+ #
90
+ # hash.object_id # => 70147385937100
91
+ # duped.object_id # => 70147385950620
92
+ #
93
+ # # unduplicated values
94
+ # duped['nil'] # => nil
95
+ # duped['false'] # => false
96
+ # duped['true'] # => true
97
+ # duped['symbol'] # => :foo
98
+ # duped['fixnum'] # => 23
99
+ # duped['bignum'] # => 176605528590345446089
100
+ # duped['float'] # => 1.0
101
+ # duped['complex'] # => (0.3+0i)
102
+ # duped['bigdecimal'] # => #<BigDecimal:7f9ffe6e2fd0,'0.120001E2',18(18)>
103
+ # duped['rational'] # => 5404319552844595/18014398509481984)
104
+ #
105
+ # # it duplicates values
106
+ # duped['string'].reverse!
107
+ # duped['string'] # => "rab oof"
108
+ # hash['string'] # => "foo bar"
109
+ #
110
+ # # it deeply duplicates Hash, by preserving the class
111
+ # duped['hash'].class # => Hash
112
+ # duped['hash'].delete(:a)
113
+ # hash['hash'][:a] # => 1
114
+ #
115
+ # duped['hash'][:b].upcase!
116
+ # duped['hash'][:b] # => "TWO"
117
+ # hash['hash'][:b] # => "two"
118
+ #
119
+ # # it deeply duplicates Lotus::Utils::Hash, by preserving the class
120
+ # duped['u_hash'].class # => Lotus::Utils::Hash
121
+ def deep_dup
122
+ Hash.new.tap do |result|
123
+ @hash.each {|k, v| result[k] = duplicate(v) }
124
+ end
125
+ end
126
+
60
127
  # Returns a new array populated with the keys from this hash
61
128
  #
62
129
  # @return [Array] the keys
@@ -182,6 +249,22 @@ module Lotus
182
249
  def respond_to_missing?(m, include_private=false)
183
250
  @hash.respond_to?(m, include_private)
184
251
  end
252
+
253
+ private
254
+ # @api private
255
+ # @since x.x.x
256
+ def duplicate(value)
257
+ case value
258
+ when NilClass, FalseClass, TrueClass, Symbol, Numeric
259
+ value
260
+ when Hash
261
+ value.deep_dup
262
+ when ::Hash
263
+ Hash.new(value).deep_dup.to_h
264
+ else
265
+ value.dup
266
+ end
267
+ end
185
268
  end
186
269
  end
187
270
  end
@@ -3,6 +3,7 @@ require 'date'
3
3
  require 'time'
4
4
  require 'pathname'
5
5
  require 'bigdecimal'
6
+ require 'lotus/utils'
6
7
 
7
8
  # Define top level constant Boolean, so it can be easily used by other libraries
8
9
  # in coercions DSLs
@@ -623,11 +624,26 @@ module Lotus
623
624
  # # Missing #to_s or #to_str
624
625
  # input = BaseObject.new
625
626
  # Lotus::Utils::Kernel.String(input) # => TypeError
626
- def self.String(arg)
627
- arg = arg.to_str if arg.respond_to?(:to_str)
628
- super(arg)
629
- rescue NoMethodError
630
- raise TypeError.new "can't convert into String"
627
+ if Utils.rubinius?
628
+ def self.String(arg)
629
+ case arg
630
+ when ->(a) { a.respond_to?(:to_str) }
631
+ arg.to_str
632
+ when ->(a) { a.respond_to?(:to_s) }
633
+ arg.to_s
634
+ else
635
+ super(arg)
636
+ end
637
+ rescue NoMethodError
638
+ raise TypeError.new "can't convert into String"
639
+ end
640
+ else
641
+ def self.String(arg)
642
+ arg = arg.to_str if arg.respond_to?(:to_str)
643
+ super(arg)
644
+ rescue NoMethodError
645
+ raise TypeError.new "can't convert into String"
646
+ end
631
647
  end
632
648
 
633
649
  # Coerces the argument to be a Date.
@@ -1,9 +1,18 @@
1
+ require 'lotus/utils/string'
2
+ require 'lotus/utils/kernel'
3
+
1
4
  module Lotus
2
5
  module Utils
3
6
  # Prefixed string
4
7
  #
5
8
  # @since 0.1.0
6
- class PathPrefix
9
+ class PathPrefix < Lotus::Utils::String
10
+ # Path separator
11
+ #
12
+ # @since x.x.x
13
+ # @api private
14
+ DEFAULT_SEPARATOR = '/'.freeze
15
+
7
16
  # Initialize the path prefix
8
17
  #
9
18
  # @param string [::String] the prefix value
@@ -12,9 +21,11 @@ module Lotus
12
21
  # @return [PathPrefix] self
13
22
  #
14
23
  # @since 0.1.0
15
- def initialize(string = nil, separator = '/')
24
+ #
25
+ # @see Lotus::Utils::PathPrefix::DEFAULT_SEPARATOR
26
+ def initialize(string = nil, separator = DEFAULT_SEPARATOR)
27
+ super(string)
16
28
  @separator = separator
17
- @string = string.to_s
18
29
  end
19
30
 
20
31
  # Joins self with the given token.
@@ -22,22 +33,29 @@ module Lotus
22
33
  #
23
34
  # @param string [::String] the token we want to join
24
35
  #
25
- # @return [::String] the joined string
36
+ # @return [Lotus::Utils::PathPrefix] the joined string
26
37
  #
27
38
  # @since 0.1.0
28
39
  #
29
- # @example
40
+ # @example Single string
30
41
  # require 'lotus/utils/path_prefix'
31
42
  #
32
- # path_prefix = Lotus::Utils::PathPrefix.new '/posts'
33
- # path_prefix.join 'new' # => '/posts/new'
34
- # path_prefix.join '/new' # => '/posts/new'
43
+ # path_prefix = Lotus::Utils::PathPrefix.new('/posts')
44
+ # path_prefix.join('new').to_s # => "/posts/new"
45
+ # path_prefix.join('/new').to_s # => "/posts/new"
35
46
  #
36
- # path_prefix = Lotus::Utils::PathPrefix.new 'posts'
37
- # path_prefix.join 'new' # => '/posts/new'
38
- # path_prefix.join '/new' # => '/posts/new'
39
- def join(string)
40
- absolutize relative_join(string)
47
+ # path_prefix = Lotus::Utils::PathPrefix.new('posts')
48
+ # path_prefix.join('new').to_s # => "/posts/new"
49
+ # path_prefix.join('/new').to_s # => "/posts/new"
50
+ #
51
+ # @example Multiple strings
52
+ # require 'lotus/utils/path_prefix'
53
+ #
54
+ # path_prefix = Lotus::Utils::PathPrefix.new('myapp')
55
+ # path_prefix.join('/assets', 'application.js').to_s
56
+ # # => "/myapp/assets/application.js"
57
+ def join(*strings)
58
+ relative_join(strings).absolute!
41
59
  end
42
60
 
43
61
  # Joins self with the given token, without prefixing it with `separator`.
@@ -46,7 +64,7 @@ module Lotus
46
64
  # @param string [::String] the token we want to join
47
65
  # @param separator [::String] the separator used between tokens
48
66
  #
49
- # @return [::String] the joined string
67
+ # @return [Lotus::Utils::PathPrefix] the joined string
50
68
  #
51
69
  # @raise [TypeError] if one of the argument can't be treated as a
52
70
  # string
@@ -57,62 +75,69 @@ module Lotus
57
75
  # require 'lotus/utils/path_prefix'
58
76
  #
59
77
  # path_prefix = Lotus::Utils::PathPrefix.new 'posts'
60
- # path_prefix.relative_join 'new' # => 'posts/new'
61
- # path_prefix.relative_join 'new', '_' # => 'posts_new'
62
- def relative_join(string, separator = @separator)
78
+ # path_prefix.relative_join('new').to_s # => 'posts/new'
79
+ # path_prefix.relative_join('new', '_').to_s # => 'posts_new'
80
+ def relative_join(strings, separator = @separator)
63
81
  raise TypeError if separator.nil?
64
- relativize [@string, string].join(separator), separator
82
+ prefix = @string.gsub(@separator, separator)
83
+
84
+ self.class.new(
85
+ Utils::Kernel.Array([prefix, strings]).join(separator),
86
+ separator
87
+ ).relative!
65
88
  end
66
89
 
67
- # Returns the hash of the internal string
90
+ protected
91
+
92
+ # Modifies the path prefix to have a prepended separator.
93
+ #
94
+ # @return [self]
68
95
  #
69
- # @return [Fixnum]
96
+ # @since x.x.x
97
+ # @api private
70
98
  #
71
- # @since 0.3.0
72
- def hash
73
- @string.hash
99
+ # @see #absolute
100
+ def absolute!
101
+ @string.prepend(separator) unless absolute?
102
+
103
+ self
74
104
  end
75
105
 
76
- # Returns a string representation
106
+ # Returns whether the path prefix starts with its separator.
107
+ #
108
+ # @return [TrueClass,FalseClass]
77
109
  #
78
- # @return [String]
110
+ # @since x.x.x
111
+ # @api private
79
112
  #
80
- # @since 0.3.0
81
- def to_s
82
- @string
113
+ # @example
114
+ # require 'lotus/utils/path_prefix'
115
+ #
116
+ # Lotus::Utils::PathPrefix.new('/posts').absolute? #=> true
117
+ # Lotus::Utils::PathPrefix.new('posts').absolute? #=> false
118
+ def absolute?
119
+ @string.start_with?(separator)
83
120
  end
84
121
 
85
- alias_method :to_str, :to_s
86
-
87
- # Equality
122
+ # Modifies the path prefix to remove the leading separator.
88
123
  #
89
- # @return [TrueClass,FalseClass]
124
+ # @return [self]
90
125
  #
91
- # @since 0.3.0
92
- def ==(other)
93
- to_s == other
94
- end
126
+ # @since x.x.x
127
+ # @api private
128
+ #
129
+ # @see #relative
130
+ def relative!
131
+ @string.gsub!(%r{(?<!:)#{ separator * 2 }}, separator)
132
+ @string.sub!(%r{\A#{ separator }}, '')
95
133
 
96
- alias_method :eql?, :==
134
+ self
135
+ end
97
136
 
98
137
  private
138
+ # @since 0.1.0
139
+ # @api private
99
140
  attr_reader :separator
100
-
101
- def absolutize(string)
102
- string.tap do |s|
103
- s.prepend(separator) unless absolute?(s)
104
- end
105
- end
106
-
107
- def absolute?(string)
108
- string.start_with?(separator)
109
- end
110
-
111
- def relativize(string, separator = @separator)
112
- string.
113
- gsub(%r{(?<!:)#{ separator * 2 }}, separator).
114
- gsub(%r{\A#{ separator }}, '')
115
- end
116
141
  end
117
142
  end
118
143
  end
@@ -1,5 +1,5 @@
1
1
  module Lotus
2
2
  module Utils
3
- VERSION = '0.3.0'.freeze
3
+ VERSION = '0.3.1'.freeze
4
4
  end
5
5
  end
data/lib/lotus/utils.rb CHANGED
@@ -2,6 +2,35 @@ require 'lotus/utils/version'
2
2
 
3
3
  module Lotus
4
4
  # Ruby core extentions and Lotus utilities
5
+ #
6
+ # @since 0.1.0
5
7
  module Utils
8
+ # @since x.x.x
9
+ # @api private
10
+ LOTUS_JRUBY = 'java'.freeze
11
+
12
+ # @since x.x.x
13
+ # @api private
14
+ LOTUS_RUBINIUS = 'rbx'.freeze
15
+
16
+ # Checks if the current VM is JRuby
17
+ #
18
+ # @return [TrueClass,FalseClass] return if the VM is JRuby or not
19
+ #
20
+ # @since x.x.x
21
+ # @api private
22
+ def self.jruby?
23
+ RUBY_PLATFORM == LOTUS_JRUBY
24
+ end
25
+
26
+ # Checks if the current VM is Rubinius
27
+ #
28
+ # @return [TrueClass,FalseClass] return if the VM is Rubinius or not
29
+ #
30
+ # @since x.x.x
31
+ # @api private
32
+ def self.rubinius?
33
+ RUBY_ENGINE == LOTUS_RUBINIUS
34
+ end
6
35
  end
7
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lotus-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-23 00:00:00.000000000 Z
11
+ date: 2014-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,7 @@ files:
66
66
  - lib/lotus/utils/callbacks.rb
67
67
  - lib/lotus/utils/class.rb
68
68
  - lib/lotus/utils/class_attribute.rb
69
+ - lib/lotus/utils/deprecation.rb
69
70
  - lib/lotus/utils/hash.rb
70
71
  - lib/lotus/utils/io.rb
71
72
  - lib/lotus/utils/kernel.rb