necromancer 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +14 -6
  3. data/CHANGELOG.md +35 -3
  4. data/CODE_OF_CONDUCT.md +49 -0
  5. data/Gemfile +3 -4
  6. data/README.md +116 -61
  7. data/lib/necromancer.rb +16 -18
  8. data/lib/necromancer/context.rb +14 -1
  9. data/lib/necromancer/conversion_target.rb +27 -10
  10. data/lib/necromancer/conversions.rb +33 -13
  11. data/lib/necromancer/converter.rb +3 -1
  12. data/lib/necromancer/converters/array.rb +5 -1
  13. data/lib/necromancer/converters/boolean.rb +4 -1
  14. data/lib/necromancer/converters/date_time.rb +45 -1
  15. data/lib/necromancer/converters/numeric.rb +4 -1
  16. data/lib/necromancer/converters/range.rb +4 -1
  17. data/lib/necromancer/null_converter.rb +3 -1
  18. data/lib/necromancer/version.rb +2 -2
  19. data/necromancer.gemspec +3 -1
  20. data/spec/unit/can_spec.rb +1 -3
  21. data/spec/unit/config_spec.rb +1 -3
  22. data/spec/unit/configuration/new_spec.rb +1 -3
  23. data/spec/unit/conversions/fetch_spec.rb +16 -0
  24. data/spec/unit/conversions/register_spec.rb +12 -3
  25. data/spec/unit/conversions/to_hash_spec.rb +37 -0
  26. data/spec/unit/convert_spec.rb +29 -3
  27. data/spec/unit/converters/array/array_to_boolean_spec.rb +1 -3
  28. data/spec/unit/converters/array/array_to_numeric_spec.rb +1 -3
  29. data/spec/unit/converters/array/array_to_set_spec.rb +1 -3
  30. data/spec/unit/converters/array/object_to_array_spec.rb +1 -3
  31. data/spec/unit/converters/array/string_to_array_spec.rb +1 -3
  32. data/spec/unit/converters/boolean/boolean_to_integer_spec.rb +1 -3
  33. data/spec/unit/converters/boolean/integer_to_boolean_spec.rb +1 -3
  34. data/spec/unit/converters/boolean/string_to_boolean_spec.rb +1 -3
  35. data/spec/unit/converters/date_time/string_to_date_spec.rb +5 -3
  36. data/spec/unit/converters/date_time/string_to_datetime_spec.rb +1 -3
  37. data/spec/unit/converters/date_time/string_to_time_spec.rb +28 -0
  38. data/spec/unit/converters/numeric/string_to_float_spec.rb +1 -3
  39. data/spec/unit/converters/numeric/string_to_integer_spec.rb +1 -3
  40. data/spec/unit/converters/numeric/string_to_numeric_spec.rb +1 -3
  41. data/spec/unit/converters/range/string_to_range_spec.rb +1 -3
  42. data/spec/unit/inspect_spec.rb +14 -0
  43. data/spec/unit/new_spec.rb +1 -3
  44. data/spec/unit/register_spec.rb +1 -3
  45. metadata +48 -12
  46. data/.ruby-version +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ab93f1c0f77de5f9d0643fee2136e1a18448509
4
- data.tar.gz: 44e07300b65361d813dfa3e4d36381ef44cb0d8b
3
+ metadata.gz: 8af7250cb5f7455175e816a1544b6ccbc5f9ea6f
4
+ data.tar.gz: 94ad6d982fbec3a81464cf916dd7cb08204bddc7
5
5
  SHA512:
6
- metadata.gz: 9049c66ec36a5f139de3ffd32d14232eaf95118437c9323fec32cd34054722ea0106c7e1b59d7d284fb53ab52d14a1c3dc723cad07431f541f591200a84f167e
7
- data.tar.gz: 9471c9273853b50e269e9aa96efe7f3ae87d99236a7b222d8eb95fd03371a15485d7070fe903eba95949e524b68fec516d0746e05a9b1094c588d6029b52d9c2
6
+ metadata.gz: 9f7d99a2ec16d62bd24432d632bd93953065c010e78382024a101bfabc2d11adeadf134ad4586fb88f14aa9173b91721b62849a3f730ab2741923091d93ebfff
7
+ data.tar.gz: b306b1185bced349369a93672ae55aa6099fac218770698b4a46f1c24d458919031459627b95e28c95a903f1d0bb323c61574e4a8cbddbd4e7ac10ae9c828533
@@ -1,19 +1,27 @@
1
+ ---
2
+ language: ruby
3
+ sudo: false
4
+ cache: bundler
1
5
  language: ruby
2
- bundler_args: --without yard benchmarks
3
6
  script: "bundle exec rake ci"
4
7
  rvm:
5
8
  - 1.9.3
6
9
  - 2.0.0
7
- - 2.1.0
10
+ - 2.1.10
11
+ - 2.2.6
12
+ - 2.3.3
13
+ - 2.4.0
8
14
  - ruby-head
9
- - jruby-19mode
10
- - rbx-2
15
+ - jruby-9000
16
+ - jruby-head
17
+ - rbx-3
11
18
  matrix:
12
- include:
13
- - rvm: jruby-head
14
19
  allow_failures:
15
20
  - rvm: ruby-head
16
21
  - rvm: jruby-head
22
+ - rvm: rbx-3
17
23
  fast_finish: true
18
24
  branches:
19
25
  only: master
26
+ notifications:
27
+ email: false
@@ -1,11 +1,43 @@
1
- 0.3.0 (December 14, 2014)
1
+ # Change log
2
2
 
3
+ ## [v0.4.0] - 2017-02-18
4
+
5
+ ### Added
6
+ * Add :string -> :time conversion
7
+ * Add inspection methods to Context and ConversionTarget
8
+ * Add module level Necromancer#convert for convenience and more functional style
9
+ * Add ConversionTarget#>> call for functional style converions
10
+
11
+ ### Changed
12
+ * Change fail to raise in ConversionTarget#for
13
+ * Change fail to raise in Conversions
14
+ * Change ConversionTarget#detect to handle Class type coercion
15
+
16
+ ### Fixed
17
+ * Fix bug with type detection
18
+ * Fix Ruby 2.4.0 warning about Fixnum & Bignum type
19
+
20
+ ## [v0.3.0] - 2014-12-14
21
+
22
+ ### Added
3
23
  * Add array converters for :hash, :set and :object conversions
4
24
  * Add ability to configure global conversion settings per instance
5
25
 
6
- 0.2.0 (December 7, 2014)
26
+ ## [v0.2.0] - 2014-12-07
7
27
 
28
+ ### Added
8
29
  * Add #fail_conversion_type to Converter and use in converters
9
30
  * Add DateTimeConverters
10
- * Change IntegerConverters & FloatConverters into Numeric Converters
11
31
  * Add string to numeric type conversion
32
+
33
+ ### Changed
34
+ * Change IntegerConverters & FloatConverters into Numeric Converters
35
+
36
+ ## [v0.1.0] - 2014-11-30
37
+
38
+ * Initial implementation and release
39
+
40
+ [v0.4.0]: https://github.com/piotrmurach/necromancer/compare/v0.3.0...v0.4.0
41
+ [v0.3.0]: https://github.com/piotrmurach/necromancer/compare/v0.2.0...v0.3.0
42
+ [v0.2.0]: https://github.com/piotrmurach/necromancer/compare/v0.1.0...v0.2.0
43
+ [v0.1.0]: https://github.com/piotrmurach/necromancer/compare/v0.1.0
@@ -0,0 +1,49 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, and in the interest of
4
+ fostering an open and welcoming community, we pledge to respect all people who
5
+ contribute through reporting issues, posting feature requests, updating
6
+ documentation, submitting pull requests or patches, and other activities.
7
+
8
+ We are committed to making participation in this project a harassment-free
9
+ experience for everyone, regardless of level of experience, gender, gender
10
+ identity and expression, sexual orientation, disability, personal appearance,
11
+ body size, race, ethnicity, age, religion, or nationality.
12
+
13
+ Examples of unacceptable behavior by participants include:
14
+
15
+ * The use of sexualized language or imagery
16
+ * Personal attacks
17
+ * Trolling or insulting/derogatory comments
18
+ * Public or private harassment
19
+ * Publishing other's private information, such as physical or electronic
20
+ addresses, without explicit permission
21
+ * Other unethical or unprofessional conduct
22
+
23
+ Project maintainers have the right and responsibility to remove, edit, or
24
+ reject comments, commits, code, wiki edits, issues, and other contributions
25
+ that are not aligned to this Code of Conduct, or to ban temporarily or
26
+ permanently any contributor for other behaviors that they deem inappropriate,
27
+ threatening, offensive, or harmful.
28
+
29
+ By adopting this Code of Conduct, project maintainers commit themselves to
30
+ fairly and consistently applying these principles to every aspect of managing
31
+ this project. Project maintainers who do not follow or enforce the Code of
32
+ Conduct may be permanently removed from the project team.
33
+
34
+ This code of conduct applies both within project spaces and in public spaces
35
+ when an individual is representing the project or its community.
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
+ reported by contacting a project maintainer at [email]. All
39
+ complaints will be reviewed and investigated and will result in a response that
40
+ is deemed necessary and appropriate to the circumstances. Maintainers are
41
+ obligated to maintain confidentiality with regard to the reporter of an
42
+ incident.
43
+
44
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
+ version 1.3.0, available at
46
+ [http://contributor-covenant.org/version/1/3/0/][version]
47
+
48
+ [homepage]: http://contributor-covenant.org
49
+ [version]: http://contributor-covenant.org/version/1/3/0/
data/Gemfile CHANGED
@@ -3,14 +3,13 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  group :development do
6
- gem 'rake', '~> 10.3.2'
7
- gem 'rspec', '~> 3.1.0'
8
6
  gem 'yard', '~> 0.8.7'
9
7
  gem 'benchmark-ips', '~> 2.0.0'
10
8
  end
11
9
 
12
10
  group :metrics do
13
- gem 'coveralls', '~> 0.7.0'
14
- gem 'simplecov', '~> 0.8.2'
11
+ gem 'coveralls', '~> 0.8.2'
12
+ gem 'simplecov', '~> 0.10.0'
15
13
  gem 'yardstick', '~> 0.9.9'
14
+ gem 'term-ansicolor', '=1.3.2'
16
15
  end
data/README.md CHANGED
@@ -1,17 +1,19 @@
1
1
  # Necromancer
2
- [![Gem Version](https://badge.fury.io/rb/necromancer.png)][gem]
3
- [![Build Status](https://secure.travis-ci.org/peter-murach/necromancer.png?branch=master)][travis]
4
- [![Code Climate](https://codeclimate.com/github/peter-murach/necromancer.png)][codeclimate]
5
- [![Coverage Status](https://coveralls.io/repos/peter-murach/necromancer/badge.png)][coverage]
2
+ [![Gem Version](https://badge.fury.io/rb/necromancer.svg)][gem]
3
+ [![Build Status](https://secure.travis-ci.org/piotrmurach/necromancer.svg?branch=master)][travis]
4
+ [![Code Climate](https://codeclimate.com/github/piotrmurach/necromancer/badges/gpa.svg)][codeclimate]
5
+ [![Coverage Status](https://coveralls.io/repos/github/piotrmurach/necromancer/badge.svg?branch=master)][coverage]
6
+ [![Inline docs](http://inch-ci.org/github/piotrmurach/necromancer.svg?branch=master)][inchpages]
6
7
 
7
8
  [gem]: http://badge.fury.io/rb/necromancer
8
- [travis]: http://travis-ci.org/peter-murach/necromancer
9
- [codeclimate]: https://codeclimate.com/github/peter-murach/necromancer
10
- [coverage]: https://coveralls.io/r/peter-murach/necromancer
9
+ [travis]: http://travis-ci.org/piotrmurach/necromancer
10
+ [codeclimate]: https://codeclimate.com/github/piotrmurach/necromancer
11
+ [coverage]: https://coveralls.io/github/piotrmurach/necromancer
12
+ [inchpages]: http://inch-ci.org/github/piotrmurach/necromancer
11
13
 
12
14
  > Conversion from one object type to another with a bit of black magic.
13
15
 
14
- **Necromancer** provides independent type conversion component for [TTY](https://github.com/peter-murach/tty) toolkit.
16
+ **Necromancer** provides independent type conversion component for [TTY](https://github.com/piotrmurach/tty) toolkit.
15
17
 
16
18
  ## Motivation
17
19
 
@@ -53,51 +55,58 @@ Or install it yourself as:
53
55
  * [3. Converters](#3-converters)
54
56
  * [3.1 Array](#31-array)
55
57
  * [3.2 Boolean](#32-boolean)
56
- * [3.3 Hash](#33-hash)
57
- * [3.4 Numeric](#34-numeric)
58
- * [3.5 Range](#35-range)
59
- * [3.6 Custom](#36-custom)
60
- * [3.6.1 Using an Object](#361-using-an-object)
61
- * [3.6.2 Using a Proc](#362-using-a-proc)
58
+ * [3.3 DateTime](#33-datetime)
59
+ * [3.4 Hash](#34-hash)
60
+ * [3.5 Numeric](#35-numeric)
61
+ * [3.6 Range](#36-range)
62
+ * [3.7 Custom](#37-custom)
63
+ * [3.7.1 Using an Object](#371-using-an-object)
64
+ * [3.7.2 Using a Proc](#372-using-a-proc)
62
65
 
63
66
  ## 1. Usage
64
67
 
65
- **Necromancer** requires you to instatiate it:
68
+ **Necromancer** knows how to handle conversions between various types using the `convert` method. The `convert` method takes as an argument the value to convert from. Then to perform actual coercion use the `to` or more functional style `>>` method that accepts the type for the returned value which can be `:symbol`, `object` or `ClassName`.
69
+
70
+ For example, to convert a string to a [range](#36-range) type:
66
71
 
67
72
  ```ruby
68
- converter = Necromancer.new
73
+ Necromancer.convert('1-10').to(:range) # => 1..10
74
+ Necromancer.convert('1-10') >> :range # => 1..10
75
+ Necromancer.convert('1-10') >> Range # => 1..10
69
76
  ```
70
77
 
71
- Once initialized **Necromancer** knows how to handle numerous conversions and also allows you to add your custom type [converters](#35-custom).
72
-
73
- For example, to convert a string to a [range](#34-range) type:
78
+ In order to handle [boolean](#32-boolean) conversions:
74
79
 
75
80
  ```ruby
76
- converter.convert('1-10').to(:range) # => 1..10
81
+ Necromancer.convert('t').to(:boolean) # => true
82
+ Necromancer.convert('t') >> true # => true
77
83
  ```
78
84
 
79
- In order to handle [boolean](#32-boolean) conversions:
85
+ To convert string to [numeric](#35-numeric) value:
80
86
 
81
87
  ```ruby
82
- converter.convert('t').to(:boolean) # => true
88
+ Necromancer.convert('10e1').to(:numeric) # => 100
83
89
  ```
84
90
 
85
- To convert string to [numeric](#34-numeric) value:
91
+ or convert [array](#31-array) of string values into numeric type:
86
92
 
87
93
  ```ruby
88
- converter.convert('10e1').to(:numeric) # => 100
94
+ Necromancer.convert(['1', '2.3', '3.0']).to(:numeric) # => [1, 2.3, 3.0]
89
95
  ```
90
96
 
91
- or get [array](#31-array) elements into numeric type:
97
+ To provide extra information about the conversion value type you can use `from`.
92
98
 
93
99
  ```ruby
94
- converter.convert(['1', '2.3', '3.0']).to(:numeric) # => [1, 2.3, 3.0]
100
+ Necromancer.convert(['1', '2.3', '3.0']).from(:array).to(:numeric) # => [1, 2.3, 3.0]
95
101
  ```
96
102
 
97
- However, if you want to tell **Necromancer** about source type use `from`:
103
+ **Necromancer** also allows you to add [custom](#37-custom) conversions.
104
+
105
+ Conversion isn't always possible, in which case a `Necromancer::NoTypeConversionAvailableError` is thrown indicating that `convert` doesn't know how to perform the requested conversion:
98
106
 
99
107
  ```ruby
100
- converter.convert(['1', '2.3', '3.0']).from(:array).to(:numeric) # => [1, 2.3, 3.0]
108
+ Necromancer.convert(:foo).to(:float)
109
+ # => Necromancer::NoTypeConversionAvailableError: Conversion 'foo->float' unavailable.
101
110
  ```
102
111
 
103
112
  ## 2. Interface
@@ -109,13 +118,20 @@ converter.convert(['1', '2.3', '3.0']).from(:array).to(:numeric) # => [1, 2.3, 3
109
118
  For the purpose of divination, **Necromancer** uses `convert` method to turn source type into target type. For example, in order to convert a string into a range type do:
110
119
 
111
120
  ```ruby
112
- converter.convert('1,10').to(:range) # => 1..10
121
+ Necromancer.convert('1,10').to(:range) # => 1..10
113
122
  ```
114
123
 
115
124
  Alternatively, you can use block:
116
125
 
117
126
  ```ruby
118
- converter.convert { '1,10' }.to(:range) # => 1..10
127
+ Necromancer.convert { '1,10' }.to(:range) # => 1..10
128
+ ```
129
+
130
+ Conversion isn't always possible, in which case a `Necromancer::NoTypeConversionAvailableError` is thrown indicating that `convert` doesn't know how to perform the requested conversion:
131
+
132
+ ```ruby
133
+ Necromancer.convert(:foo).to(:float)
134
+ # => Necromancer::NoTypeConversionAvailableError: Conversion 'foo->float' unavailable.
119
135
  ```
120
136
 
121
137
  ### 2.2 from
@@ -123,7 +139,7 @@ converter.convert { '1,10' }.to(:range) # => 1..10
123
139
  To specify conversion source type use `from` method:
124
140
 
125
141
  ```ruby
126
- converter.convert('1.0').from(:string).to(:numeric)
142
+ Necromancer.convert('1.0').from(:string).to(:numeric)
127
143
  ```
128
144
 
129
145
  In majority of cases you do not need to specify `from` as the type will be inferred from the `convert` method argument and then appropriate conversion will be applied to result in `target` type such as `:numeric`. However, if you do not control the input to `convert` and want to ensure consistent behaviour please use `from`.
@@ -132,24 +148,30 @@ The source parameters are:
132
148
 
133
149
  * :array
134
150
  * :boolean
151
+ * :date
152
+ * :datetime
135
153
  * :float
136
154
  * :integer
137
155
  * :numeric
138
156
  * :range
139
157
  * :string
158
+ * :time
140
159
 
141
160
  ### 2.3 to
142
161
 
143
- To convert objects between types, **Necromancer** provides several target types. The `to` method allows you to pass target as an argument to perform actual conversion:
162
+ To convert objects between types, **Necromancer** provides several target types. The `to` or functional style `>>` method allows you to pass target as an argument to perform actual conversion. The target can be one of `:symbol`, `object` or `ClassName`:
144
163
 
145
164
  ```ruby
146
- converter.convert('yes').to(:boolean) # => true
165
+ Necromancer.convert('yes').to(:boolean) # => true
166
+ Necromancer.convert('yes') >> :boolean # => true
167
+ Necromancer.convert('yes') >> true # => true
168
+ Necromancer.convert('yes') >> TrueClass # => true
147
169
  ```
148
170
 
149
171
  By default, when target conversion fails the orignal value is returned. However, you can pass `strict` as an additional argument to ensure failure when conversion cannot be performed:
150
172
 
151
173
  ```ruby
152
- converter.convert('1a').to(:integer, strict: true)
174
+ Necromancer.convert('1a').to(:integer, strict: true)
153
175
  # => raises Necromancer::ConversionTypeError
154
176
  ```
155
177
 
@@ -157,11 +179,14 @@ The target parameters are:
157
179
 
158
180
  * :array
159
181
  * :boolean
182
+ * :date
183
+ * :datetime
160
184
  * :float
161
185
  * :integer
162
186
  * :numeric
163
187
  * :range
164
188
  * :string
189
+ * :time
165
190
 
166
191
  ### 2.4 can?
167
192
 
@@ -199,46 +224,46 @@ Available configuration options are:
199
224
 
200
225
  ## 3. Converters
201
226
 
202
- **Necromancer** flexibility means you can register your own converters or use the already defined converters for such types as 'Array', 'Boolean', 'Hash', 'Numeric', 'Range'.
227
+ **Necromancer** flexibility means you can register your own converters or use the already defined converters for such types as `Array`, `Boolean`, `Hash`, `Numeric`, `Range`.
203
228
 
204
229
  ### 3.1 Array
205
230
 
206
231
  The **Necromancer** allows you to transform arbitrary object into array:
207
232
 
208
233
  ```ruby
209
- converter.convert(nil).to(:array) # => []
210
- converter.convert({x: 1}).to(:array) # => [[:x, 1]]
234
+ Necromancer.convert(nil).to(:array) # => []
235
+ Necromancer.convert({x: 1}).to(:array) # => [[:x, 1]]
211
236
  ```
212
237
 
213
238
  In addition, **Necromancer** excels at converting `,` or `-` delimited string into an array object:
214
239
 
215
240
  ```ruby
216
- converter.convert('a, b, c').to(:array) # => ['a', 'b', 'c']
241
+ Necromancer.convert('a, b, c').to(:array) # => ['a', 'b', 'c']
217
242
  ```
218
243
 
219
244
  If the string is a list of `-` or `,` separated numbers, they will be converted to their respective numeric types:
220
245
 
221
246
  ```ruby
222
- converter.convert('1 - 2 - 3').to(:array) # => [1, 2, 3]
247
+ Necromancer.convert('1 - 2 - 3').to(:array) # => [1, 2, 3]
223
248
  ```
224
249
 
225
250
  You can also convert array containing string objects to array containing numeric values:
226
251
 
227
252
  ```ruby
228
- converter.convert(['1', '2.3', '3.0']).to(:numeric)
253
+ Necromancer.convert(['1', '2.3', '3.0']).to(:numeric)
229
254
  ```
230
255
 
231
256
  When in `strict` mode the conversion will raise a `Necromancer::ConversionTypeError` error like so:
232
257
 
233
258
  ```ruby
234
- converter.convert(['1', '2.3', false]).to(:numeric, strict: true)
259
+ Necromancer.convert(['1', '2.3', false]).to(:numeric, strict: true)
235
260
  # => Necromancer::ConversionTypeError: false cannot be converted from `array` to `numeric`
236
261
  ```
237
262
 
238
263
  However, in `non-strict` mode the value will be simply returned unchanged:
239
264
 
240
265
  ```ruby
241
- converter.convert(['1', '2.3', false]).to(:numeric, strict: false)
266
+ Necromancer.convert(['1', '2.3', false]).to(:numeric, strict: false)
242
267
  # => [1, 2.3, false]
243
268
  ```
244
269
 
@@ -247,76 +272,100 @@ converter.convert(['1', '2.3', false]).to(:numeric, strict: false)
247
272
  The **Necromancer** allows you to convert a string object to boolean object. The `1`, `'1'`, `'t'`, `'T'`, `'true'`, `'TRUE'`, `'y'`, `'Y'`, `'yes'`, `'Yes'`, `'on'`, `'ON'` values are converted to `TrueClass`.
248
273
 
249
274
  ```ruby
250
- converter.convert('yes').to(:boolean) # => true
275
+ Necromancer.convert('yes').to(:boolean) # => true
251
276
  ```
252
277
 
253
278
  Similarly, the `0`, `'0'`, `'f'`, `'F'`, `'false'`, `'FALSE'`, `'n'`, `'N'`, `'no'`, `'No'`, `'off'`, `'OFF'` values are converted to `FalseClass`.
254
279
 
255
280
  ```ruby
256
- converter.convert('no').to(:boolean) # => false
281
+ Necromancer.convert('no').to(:boolean) # => false
257
282
  ```
258
283
 
259
284
  You can also convert an integer object to boolean:
260
285
 
261
286
  ```ruby
262
- converter.convert(1).to(:boolean) # => true
263
- converter.convert(0).to(:boolean) # => false
287
+ Necromancer.convert(1).to(:boolean) # => true
288
+ Necromancer.convert(0).to(:boolean) # => false
289
+ ```
290
+
291
+ ### 3.3 DateTime
292
+
293
+ **Necromancer** knows how to convert string to `date` object:
294
+
295
+ ```ruby
296
+ Necromancer.convert('1-1-2015').to(:date) # => "2015-01-01"
297
+ Necromancer.convert('01/01/2015').to(:date) # => "2015-01-01"
264
298
  ```
265
299
 
266
- ### 3.3 Hash
300
+ You can also convert string to `datetime`:
267
301
 
268
302
  ```ruby
269
- converter.convert({ x: '27.5', y: '4', z: '11'}).to(:numeric)
303
+ Necromancer.convert("1-1-2015").to(:datetime) # => "2015-01-01T00:00:00+00:00"
304
+ Necromancer.convert("1-1-2015 15:12:44").to(:datetime) # => "2015-01-01T15:12:44+00:00"
305
+ ```
306
+
307
+ To convert a string to a time instance do:
308
+
309
+ ```ruby
310
+ Necromancer.convert("01-01-2015").to(:time) # => 2015-01-01 00:00:00 +0100
311
+ Necromancer.convert("01-01-2015 08:35").to(:time) # => 2015-01-01 08:35:00 +0100
312
+ Necromancer.convert("12:35").to(:time) # => 2015-01-04 12:35:00 +0100
313
+ ```
314
+
315
+ ### 3.4 Hash
316
+
317
+ ```ruby
318
+ Necromancer.convert({ x: '27.5', y: '4', z: '11'}).to(:numeric)
270
319
  # => { x: 27.5, y: 4, z: 11}
271
320
  ```
272
321
 
273
- ### 3.4 Numeric
322
+ ### 3.5 Numeric
274
323
 
275
324
  **Necromancer** comes ready to convert all the primitive numeric values.
276
325
 
277
326
  To convert a string to a float do:
278
327
 
279
328
  ```ruby
280
- converter.convert('1.2a').to(:float) # => 1.2
329
+ Necromancer.convert('1.2a').to(:float) # => 1.2
281
330
  ```
282
331
 
283
332
  Conversion to numeric in strict mode raises `Necromancer::ConversionTypeError`:
284
333
 
285
334
  ```ruby
286
- converter.convert('1.2a').to(:float, strict: true) # => raises error
335
+ Necromancer.convert('1.2a').to(:float, strict: true) # => raises error
287
336
  ```
288
337
 
289
338
  To convert a string to an integer do:
290
339
 
291
340
  ```ruby
292
- converter.convert('1a').to(:integer) # => 1
341
+ Necromancer.convert('1a').to(:integer) # => 1
293
342
  ```
294
343
 
295
344
  However, if you want to convert string to an appropriate matching numeric type do:
296
345
 
297
346
  ```ruby
298
- converter.convert('1e1').to(:numeric) # => 10
347
+ Necromancer.convert('1e1').to(:numeric) # => 10
299
348
  ```
300
349
 
301
- ### 3.5 Range
350
+ ### 3.6 Range
302
351
 
303
352
  **Necromancer** is no stranger to figuring out ranges from strings. You can pass `,`, `-`, `..`, `...` characters to denote ranges:
304
353
 
305
354
  ```ruby
306
- converter.convert('1,10').to(:range) # => 1..10
355
+ Necromancer.convert('1,10').to(:range) # => 1..10
307
356
  ```
308
357
 
309
358
  or to create a range of letters:
310
359
 
311
360
  ```ruby
312
- converter.convert('a-z').to(:range) # => 'a'..'z'
361
+ Necromancer.convert('a-z').to(:range) # => 'a'..'z'
313
362
  ```
314
363
 
315
- ### 3.6 Custom
364
+ ### 3.7 Custom
316
365
 
317
366
  In case where provided conversions do not match your needs you can create your own and `register` with **Necromancer** by using an `Object` or a `Proc`.
318
367
 
319
- #### 3.6.1 Using an Object
368
+ #### 3.7.1 Using an Object
320
369
 
321
370
  Firstly, you need to create a converter that at minimum requires to specify `call` method that will be invoked during conversion:
322
371
 
@@ -349,7 +398,7 @@ Finally, by invoking `convert` method and specifying `:upcase` as the target for
349
398
  converter.convert('magic').to(:upcase) # => 'MAGIC'
350
399
  ```
351
400
 
352
- #### 3.6.2 Using a Proc
401
+ #### 3.7.2 Using a Proc
353
402
 
354
403
  Using a Proc object you can create and immediately register a converter. You need to pass `source` and `target` of the conversion that will be used later on to match the conversion. The `convert` allows you to specify the actual conversion in block form. For example:
355
404
 
@@ -371,12 +420,18 @@ converter.convert('magic').to(:upcase) # => 'MAGIC'
371
420
 
372
421
  ## Contributing
373
422
 
374
- 1. Fork it ( https://github.com/peter-murach/necromancer/fork )
423
+ Bug reports and pull requests are welcome on GitHub at https://github.com/piotrmurach/necromancer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
424
+
425
+ 1. Fork it ( https://github.com/piotrmurach/necromancer/fork )
375
426
  2. Create your feature branch (`git checkout -b my-new-feature`)
376
427
  3. Commit your changes (`git commit -am 'Add some feature'`)
377
428
  4. Push to the branch (`git push origin my-new-feature`)
378
429
  5. Create a new Pull Request
379
430
 
431
+ ## License
432
+
433
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
434
+
380
435
  ## Copyright
381
436
 
382
- Copyright (c) 2014 Piotr Murach. See LICENSE for further details.
437
+ Copyright (c) 2014-2017 Piotr Murach. See LICENSE for further details.