necromancer 0.3.0 → 0.4.0

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