necromancer 0.1.0 → 0.2.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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +229 -19
  4. data/lib/necromancer.rb +13 -2
  5. data/lib/necromancer/context.rb +4 -0
  6. data/lib/necromancer/conversions.rb +2 -1
  7. data/lib/necromancer/converter.rb +11 -0
  8. data/lib/necromancer/converters/array.rb +29 -21
  9. data/lib/necromancer/converters/boolean.rb +40 -10
  10. data/lib/necromancer/converters/date_time.rb +33 -0
  11. data/lib/necromancer/converters/numeric.rb +88 -0
  12. data/lib/necromancer/converters/range.rb +13 -6
  13. data/lib/necromancer/version.rb +1 -1
  14. data/spec/spec_helper.rb +8 -0
  15. data/spec/unit/convert_spec.rb +31 -1
  16. data/spec/unit/converters/array/string_to_array_spec.rb +19 -1
  17. data/spec/unit/converters/boolean/boolean_to_integer_spec.rb +10 -0
  18. data/spec/unit/converters/boolean/integer_to_boolean_spec.rb +6 -0
  19. data/spec/unit/converters/boolean/string_to_boolean_spec.rb +19 -79
  20. data/spec/unit/converters/date_time/string_to_date_spec.rb +22 -0
  21. data/spec/unit/converters/date_time/string_to_datetime_spec.rb +32 -0
  22. data/spec/unit/converters/numeric/string_to_float_spec.rb +48 -0
  23. data/spec/unit/converters/{integer → numeric}/string_to_integer_spec.rb +28 -4
  24. data/spec/unit/converters/numeric/string_to_numeric_spec.rb +32 -0
  25. data/spec/unit/converters/range/string_to_range_spec.rb +25 -42
  26. data/spec/unit/register_spec.rb +17 -0
  27. metadata +17 -8
  28. data/lib/necromancer/converters/float.rb +0 -28
  29. data/lib/necromancer/converters/integer.rb +0 -48
  30. data/spec/unit/converters/float/string_to_float_spec.rb +0 -28
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Necromancer::DateTimeConverters::StringToDateConverter, '.call' do
6
+
7
+ subject(:converter) { described_class.new(:string, :date) }
8
+
9
+ it "converts '2014/12/07' to date value" do
10
+ expect(converter.call('2014/12/07')).to eq(Date.parse('2014/12/07'))
11
+ end
12
+
13
+ it "converts '2014-12-07' to date value" do
14
+ expect(converter.call('2014-12-07')).to eq(Date.parse('2014/12/07'))
15
+ end
16
+
17
+ it "fails to convert in strict mode" do
18
+ expect {
19
+ converter.call('2014 - 12 - 07', strict: true)
20
+ }.to raise_error(Necromancer::ConversionTypeError)
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Necromancer::DateTimeConverters::StringToDateTimeConverter, '.call' do
6
+
7
+ subject(:converter) { described_class.new(:string, :datetime) }
8
+
9
+ it "converts '2014/12/07' to date value" do
10
+ expect(converter.call('2014/12/07')).to eq(DateTime.parse('2014/12/07'))
11
+ end
12
+
13
+ it "converts '2014-12-07' to date value" do
14
+ expect(converter.call('2014-12-07')).to eq(DateTime.parse('2014-12-07'))
15
+ end
16
+
17
+ it "converts '7th December 2014' to datetime value" do
18
+ expect(converter.call('7th December 2014')).
19
+ to eq(DateTime.parse('2014-12-07'))
20
+ end
21
+
22
+ it "converts '7th December 2014 17:19:44' to datetime value" do
23
+ expect(converter.call('7th December 2014 17:19:44')).
24
+ to eq(DateTime.parse('2014-12-07 17:19:44'))
25
+ end
26
+
27
+ it "fails to convert in strict mode" do
28
+ expect {
29
+ converter.call('2014 - 12 - 07', strict: true)
30
+ }.to raise_error(Necromancer::ConversionTypeError)
31
+ end
32
+ end
@@ -0,0 +1,48 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Necromancer::NumericConverters::StringToFloatConverter, '.call' do
6
+
7
+ subject(:converter) { described_class.new(:string, :float) }
8
+
9
+ it "raises error for empty string in strict mode" do
10
+ expect {
11
+ converter.call('', strict: true)
12
+ }.to raise_error(Necromancer::ConversionTypeError)
13
+ end
14
+
15
+ {
16
+ '1' => 1.0,
17
+ '+1' => 1.0,
18
+ '-1' => -1.0,
19
+ '1e1' => 10.0,
20
+ '1e-1' => 0.1,
21
+ '-1e1' => -10.0,
22
+ '-1e-1' => -0.1,
23
+ '1.0' => 1.0,
24
+ '1.0e+1' => 10.0,
25
+ '1.0e-1' => 0.1,
26
+ '-1.0e+1' => -10.0,
27
+ '-1.0e-1' => -0.1,
28
+ '.1' => 0.1,
29
+ '.1e+1' => 1.0,
30
+ '.1e-1' => 0.01,
31
+ '-.1e+1' => -1.0,
32
+ '-.1e-1' => -0.01
33
+ }.each do |actual, expected|
34
+ it "converts '#{actual}' to float value" do
35
+ expect(converter.call(actual)).to eql(expected)
36
+ end
37
+ end
38
+
39
+ it "failse to convert '1.2a' in strict mode" do
40
+ expect {
41
+ converter.call('1.2a', strict: true)
42
+ }.to raise_error(Necromancer::ConversionTypeError)
43
+ end
44
+
45
+ it "converts '1.2a' in non-strict mode" do
46
+ expect(converter.call('1.2a', strict: false)).to eq(1.2)
47
+ end
48
+ end
@@ -2,9 +2,33 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- RSpec.describe Necromancer::IntegerConverters::StringToIntegerConverter, '.call' do
6
-
7
- subject(:converter) { described_class.new }
5
+ RSpec.describe Necromancer::NumericConverters::StringToIntegerConverter, '.call' do
6
+
7
+ subject(:converter) { described_class.new(:string, :integer) }
8
+
9
+ {
10
+ '1' => 1,
11
+ '+1' => 1,
12
+ '-1' => -1,
13
+ '1e+1' => 1,
14
+ '+1e-1' => 1,
15
+ '-1e1' => -1,
16
+ '-1e-1' => -1,
17
+ '1.0' => 1,
18
+ '1.0e+1' => 1,
19
+ '1.0e-1' => 1,
20
+ '-1.0e+1' => -1,
21
+ '-1.0e-1' => -1,
22
+ '.1' => 0,
23
+ '.1e+1' => 0,
24
+ '.1e-1' => 0,
25
+ '-.1e+1' => 0,
26
+ '-.1e-1' => 0
27
+ }.each do |actual, expected|
28
+ it "converts '#{actual}' to float value" do
29
+ expect(converter.call(actual)).to eql(expected)
30
+ end
31
+ end
8
32
 
9
33
  it "raises error for empty string in strict mode" do
10
34
  expect {
@@ -18,7 +42,7 @@ RSpec.describe Necromancer::IntegerConverters::StringToIntegerConverter, '.call'
18
42
 
19
43
  it "raises error for float in strict mode" do
20
44
  expect {
21
- converter.call(1.2, strict: true)
45
+ converter.call('1.2', strict: true)
22
46
  }.to raise_error(Necromancer::ConversionTypeError)
23
47
  end
24
48
 
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Necromancer::NumericConverters::StringToNumericConverter, '.call' do
6
+
7
+ subject(:converter) { described_class.new(:string, :numeric) }
8
+
9
+ {
10
+ '1' => 1,
11
+ '+1' => 1,
12
+ '-1' => -1,
13
+ '1e1' => 10.0,
14
+ '1e-1' => 0.1,
15
+ '-1e1' => -10.0,
16
+ '-1e-1' => -0.1,
17
+ '1.0' => 1.0,
18
+ '1.0e+1' => 10.0,
19
+ '1.0e-1' => 0.1,
20
+ '-1.0e+1' => -10.0,
21
+ '-1.0e-1' => -0.1,
22
+ '.1' => 0.1,
23
+ '.1e+1' => 1.0,
24
+ '.1e-1' => 0.01,
25
+ '-.1e+1' => -1.0,
26
+ '-.1e-1' => -0.01
27
+ }.each do |actual, expected|
28
+ it "converts '#{actual}' to '#{expected}'" do
29
+ expect(converter.call(actual)).to eql(expected)
30
+ end
31
+ end
32
+ end
@@ -6,47 +6,30 @@ RSpec.describe Necromancer::RangeConverters::StringToRangeConverter, '.call' do
6
6
 
7
7
  subject(:converter) { described_class.new }
8
8
 
9
- it "raises error for empty string" do
10
- expect { converter.call('') }.to raise_error(Necromancer::ConversionTypeError)
11
- end
12
-
13
- it "converts '1' to range" do
14
- expect(converter.call('1')).to eq(1..1)
15
- end
16
-
17
- it "converts '1..10' to range value" do
18
- expect(converter.call('1..10')).to eq(1..10)
19
- end
20
-
21
- it "converts '1-10' to range value" do
22
- expect(converter.call('1-10')).to eq(1..10)
23
- end
24
-
25
- it "converts '1,10' to range value" do
26
- expect(converter.call('1,10')).to eq(1..10)
27
- end
28
-
29
- it "converts '1...10' to range value" do
30
- expect(converter.call('1...10')).to eq(1...10)
31
- end
32
-
33
- it "converts '-1..10' to range value" do
34
- expect(converter.call('-1..10')).to eq(-1..10)
35
- end
36
-
37
- it "converts '1..-10' to range value" do
38
- expect(converter.call('1..-10')).to eq(1..-10)
39
- end
40
-
41
- it "converts 'a..z' to range value" do
42
- expect(converter.call('a..z')).to eq('a'..'z')
43
- end
44
-
45
- it "converts 'a-z' to range value" do
46
- expect(converter.call('a-z')).to eq('a'..'z')
47
- end
48
-
49
- it "converts 'A-Z' to range value" do
50
- expect(converter.call('A-Z')).to eq('A'..'Z')
9
+ it "raises error for empty string in strict mode" do
10
+ expect {
11
+ converter.call('', strict: true)
12
+ }.to raise_error(Necromancer::ConversionTypeError)
13
+ end
14
+
15
+ it "returns value in non-strict mode" do
16
+ expect(converter.call('', strict: false)).to eq('')
17
+ end
18
+
19
+ {
20
+ '1' => 1..1,
21
+ '1..10' => 1..10,
22
+ '1-10' => 1..10,
23
+ '1,10' => 1..10,
24
+ '1...10' => 1...10,
25
+ '-1..10' => -1..10,
26
+ '1..-10' => 1..-10,
27
+ 'a..z' => 'a'..'z',
28
+ 'a-z' => 'a'..'z',
29
+ 'A-Z' => 'A'..'Z'
30
+ }.each do |actual, expected|
31
+ it "converts '#{actual}' to range type" do
32
+ expect(converter.call(actual)).to eql(expected)
33
+ end
51
34
  end
52
35
  end
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Necromancer, '.register' do
6
+ it "allows ro register converter" do
7
+ converter = described_class.new
8
+ UpcaseConverter = Struct.new(:source, :target) do
9
+ def call(value, options)
10
+ value.to_s.upcase
11
+ end
12
+ end
13
+ upcase_converter = UpcaseConverter.new(:string, :upcase)
14
+ expect(converter.register(upcase_converter)).to eq(true)
15
+ expect(converter.convert('magic').to(:upcase)).to eq('MAGIC')
16
+ end
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: necromancer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-30 00:00:00.000000000 Z
11
+ date: 2014-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -35,6 +35,7 @@ files:
35
35
  - .rspec
36
36
  - .ruby-version
37
37
  - .travis.yml
38
+ - CHANGELOG.md
38
39
  - Gemfile
39
40
  - LICENSE.txt
40
41
  - README.md
@@ -46,8 +47,8 @@ files:
46
47
  - lib/necromancer/converter.rb
47
48
  - lib/necromancer/converters/array.rb
48
49
  - lib/necromancer/converters/boolean.rb
49
- - lib/necromancer/converters/float.rb
50
- - lib/necromancer/converters/integer.rb
50
+ - lib/necromancer/converters/date_time.rb
51
+ - lib/necromancer/converters/numeric.rb
51
52
  - lib/necromancer/converters/range.rb
52
53
  - lib/necromancer/null_converter.rb
53
54
  - lib/necromancer/version.rb
@@ -61,10 +62,14 @@ files:
61
62
  - spec/unit/converters/boolean/boolean_to_integer_spec.rb
62
63
  - spec/unit/converters/boolean/integer_to_boolean_spec.rb
63
64
  - spec/unit/converters/boolean/string_to_boolean_spec.rb
64
- - spec/unit/converters/float/string_to_float_spec.rb
65
- - spec/unit/converters/integer/string_to_integer_spec.rb
65
+ - spec/unit/converters/date_time/string_to_date_spec.rb
66
+ - spec/unit/converters/date_time/string_to_datetime_spec.rb
67
+ - spec/unit/converters/numeric/string_to_float_spec.rb
68
+ - spec/unit/converters/numeric/string_to_integer_spec.rb
69
+ - spec/unit/converters/numeric/string_to_numeric_spec.rb
66
70
  - spec/unit/converters/range/string_to_range_spec.rb
67
71
  - spec/unit/new_spec.rb
72
+ - spec/unit/register_spec.rb
68
73
  - tasks/console.rake
69
74
  - tasks/coverage.rake
70
75
  - tasks/spec.rake
@@ -102,8 +107,12 @@ test_files:
102
107
  - spec/unit/converters/boolean/boolean_to_integer_spec.rb
103
108
  - spec/unit/converters/boolean/integer_to_boolean_spec.rb
104
109
  - spec/unit/converters/boolean/string_to_boolean_spec.rb
105
- - spec/unit/converters/float/string_to_float_spec.rb
106
- - spec/unit/converters/integer/string_to_integer_spec.rb
110
+ - spec/unit/converters/date_time/string_to_date_spec.rb
111
+ - spec/unit/converters/date_time/string_to_datetime_spec.rb
112
+ - spec/unit/converters/numeric/string_to_float_spec.rb
113
+ - spec/unit/converters/numeric/string_to_integer_spec.rb
114
+ - spec/unit/converters/numeric/string_to_numeric_spec.rb
107
115
  - spec/unit/converters/range/string_to_range_spec.rb
108
116
  - spec/unit/new_spec.rb
117
+ - spec/unit/register_spec.rb
109
118
  has_rdoc:
@@ -1,28 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Necromancer
4
- module FloatConverters
5
- class StringToFloatConverter < Converter
6
- # Convert string to float value
7
- #
8
- # @example
9
- # converter.call('1.2') # => 1.2
10
- #
11
- # @api public
12
- def call(value, options = {})
13
- strict = options.fetch(:strict, false)
14
- Float(value.to_s)
15
- rescue
16
- if strict
17
- raise ConversionTypeError, "#{value} could not be converted from " \
18
- "`#{source}` into `#{target}`"
19
- else
20
- value.to_f
21
- end
22
- end
23
- end
24
-
25
- def self.load(conversions)
26
- end
27
- end # Conversion
28
- end # Necromancer
@@ -1,48 +0,0 @@
1
- # coding: utf-8
2
-
3
- module Necromancer
4
- # Container for Integer converter classes
5
- module IntegerConverters
6
- # An object that converts a String to an Integer
7
- class StringToIntegerConverter < Converter
8
- # Convert string value to integer
9
- #
10
- # @example
11
- # converter.call('1abc') # => 1
12
- #
13
- # @api public
14
- def call(value, options = {})
15
- strict = options.fetch(:strict, false)
16
- Integer(value.to_s)
17
- rescue
18
- if strict
19
- raise ConversionTypeError, "#{value} could not be converted from " \
20
- "`#{source}` into `#{target}`"
21
- else
22
- value.to_i
23
- end
24
- end
25
- end
26
-
27
- # An object that converts an Integer to a String
28
- class IntegerToStringConverter < Converter
29
- # Convert integer value to string
30
- #
31
- # @example
32
- # converter.call(1) # => '1'
33
- #
34
- # @api public
35
- def call(value, _)
36
- value.to_s
37
- end
38
- end
39
-
40
- def self.load(conversions)
41
- conversions.register StringToIntegerConverter.new(:string, :integer)
42
- conversions.register IntegerToStringConverter.new(:integer, :string)
43
- conversions.register IntegerToStringConverter.new(:fixnum, :string)
44
- conversions.register NullConverter.new(:integer, :integer)
45
- conversions.register NullConverter.new(:fixnum, :integer)
46
- end
47
- end # IntegerConverters
48
- end # Necromancer
@@ -1,28 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'spec_helper'
4
-
5
- RSpec.describe Necromancer::FloatConverters::StringToFloatConverter, '.call' do
6
-
7
- subject(:converter) { described_class.new }
8
-
9
- it "raises error for empty string in strict mode" do
10
- expect {
11
- converter.call('', strict: true)
12
- }.to raise_error(Necromancer::ConversionTypeError)
13
- end
14
-
15
- it "converts '1' to float value" do
16
- expect(converter.call('1')).to eq(1.0)
17
- end
18
-
19
- it "converts '1.2a' to float value in non-strict mode" do
20
- expect(converter.call('1.2')).to eq(1.2)
21
- end
22
-
23
- it "failse to convert '1.2a' in strict mode" do
24
- expect {
25
- converter.call('1.2a', strict: true)
26
- }.to raise_error(Necromancer::ConversionTypeError)
27
- end
28
- end