quack 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.gitignore +1 -0
- data/README.md +89 -2
- data/lib/quack/guesser.rb +21 -0
- data/lib/quack/type.rb +4 -0
- data/lib/quack/version.rb +1 -1
- data/lib/quack.rb +5 -1
- data/spec/quack/guesser_spec.rb +102 -0
- data/spec/{types → quack/types}/boolean_spec.rb +0 -0
- data/spec/{types → quack/types}/float_spec.rb +0 -0
- data/spec/{types → quack/types}/integer_spec.rb +0 -0
- data/spec/{types → quack/types}/null_spec.rb +0 -0
- data/spec/{types → quack/types}/string_spec.rb +0 -0
- data/spec/{types → quack/types}/time_spec.rb +0 -0
- data/spec/quack_spec.rb +10 -0
- metadata +24 -22
- data/lib/quack/value.rb +0 -21
- data/spec/value_spec.rb +0 -148
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZmIyMmRhNWFjZTAwNDM0ZmU4ZmM2MmE2NDE4ZjY4MDFkYThiNGZhYg==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 41b54691b6c9da7f2e7e3845fcdb59d198112e51
|
4
|
+
data.tar.gz: d7ad2d6352067154f62d95bff8551f58415fc9cd
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ZTEyZDljMzJjYjNmZGIyYjZlNTU2NDdmMTBjNzY5OTcwNjE4NjQxOThlOGEy
|
11
|
-
OTEzNWRmZTE4NGY2Y2MwMGY0OTdiYTZkMjAxYWJlZTkxZjQ4ZGM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ODdlZTIyNWE1ZjE4ZjM1ZTk4YTRkOTFkNjgyZDQzYzk2ZDQ2MjFmODI2Njkw
|
14
|
-
MjNiZTNkNTEzMjIxZmYwM2MzNzI5MjIyZWIzMmVhYWViZDU1MGUzMWQ5NmNj
|
15
|
-
NzMwYTFiYjJmZDY5ZjZiMmU4MzNmNDE1MzQyMDU5ZDhiM2IyNzY=
|
6
|
+
metadata.gz: 175ceab4331f79108bcfea7340871df4fa11414c5c9b7d0a74d969faa1d71528956ab1f768f9cbcbf1c1f99342ea8e31fbcd7a1dc3605533355fe0785ac336af
|
7
|
+
data.tar.gz: 665560693fdb34104082723afc9fb9b50564d772cd48142d9d3b8a320a69c7967cca9acb0162d1270f5533e20841fd6953c9752c3542b6d70ae921e6f50e9363
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Quack
|
2
2
|
|
3
|
-
|
3
|
+
Quack is a simple Ruby scalar type coercion library.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -18,7 +18,94 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
Quack is able to guess the following type categories and cast values to appropriate built-in type:
|
22
|
+
|
23
|
+
- `Integer`
|
24
|
+
- `Float`
|
25
|
+
- `Time`
|
26
|
+
- `Boolean`
|
27
|
+
- `Null`
|
28
|
+
- `String`
|
29
|
+
|
30
|
+
### Integer
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
value = Quack("123")
|
34
|
+
value.class
|
35
|
+
#=> Quack::Types::Integer
|
36
|
+
value.to_coerced
|
37
|
+
#=> 123
|
38
|
+
value.to_coerced.class
|
39
|
+
#=> Fixnum
|
40
|
+
```
|
41
|
+
|
42
|
+
### Float
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
value = Quack("29.4")
|
46
|
+
value.class
|
47
|
+
#=> Quack::Types::Float
|
48
|
+
value.to_coerced
|
49
|
+
#=> 29.4
|
50
|
+
value.to_coerced.class
|
51
|
+
#=> Float
|
52
|
+
```
|
53
|
+
|
54
|
+
### Time
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
value = Quack("2014-03-22T03:00:00Z")
|
58
|
+
value.class
|
59
|
+
#=> Quack::Types::Time
|
60
|
+
value.to_coerced
|
61
|
+
#=> 2014-03-22T03:00:00+00:00
|
62
|
+
value.to_coerced.class
|
63
|
+
#=> Time
|
64
|
+
```
|
65
|
+
|
66
|
+
### Boolean
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
value = Quack("true")
|
70
|
+
value.class
|
71
|
+
#=> Quack::Types::Boolean
|
72
|
+
value.to_coerced
|
73
|
+
#=> true
|
74
|
+
value.to_coerced.class
|
75
|
+
#=> TrueClass
|
76
|
+
|
77
|
+
value = Quack("false")
|
78
|
+
value.class
|
79
|
+
#=> Quack::Types::Boolean
|
80
|
+
value.to_coerced
|
81
|
+
#=> false
|
82
|
+
value.to_coerced.class
|
83
|
+
#=> FalseClass
|
84
|
+
```
|
85
|
+
|
86
|
+
### Null
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
value = Quack(nil)
|
90
|
+
value.class
|
91
|
+
#=> Quack::Types::Null
|
92
|
+
value.to_coerced
|
93
|
+
#=> nil
|
94
|
+
value.to_coerced.class
|
95
|
+
#=> NilClass
|
96
|
+
```
|
97
|
+
|
98
|
+
### String
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
value = Quack("foo")
|
102
|
+
value.class
|
103
|
+
#=> Quack::Types::String
|
104
|
+
value.to_coerced
|
105
|
+
#=> foo
|
106
|
+
value.to_coerced.class
|
107
|
+
#=> String
|
108
|
+
```
|
22
109
|
|
23
110
|
## Contributing
|
24
111
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Quack
|
2
|
+
class Guesser
|
3
|
+
attr_reader :value
|
4
|
+
|
5
|
+
def initialize(value)
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def guess
|
10
|
+
klass.new(value)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def klass
|
16
|
+
Quack::Types.select { |t|
|
17
|
+
t.matches?(value)
|
18
|
+
}.first
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/quack/type.rb
CHANGED
data/lib/quack/version.rb
CHANGED
data/lib/quack.rb
CHANGED
@@ -0,0 +1,102 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe Quack::Guesser do
|
4
|
+
describe "given a string integer" do
|
5
|
+
let(:value) { "123" }
|
6
|
+
let(:subject) { Quack::Guesser.new(value) }
|
7
|
+
|
8
|
+
it "should have Integer type" do
|
9
|
+
subject.guess.class.must_equal(Quack::Types::Integer)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "given a Fixnum integer" do
|
14
|
+
let(:value) { 123 }
|
15
|
+
let(:subject) { Quack::Guesser.new(value) }
|
16
|
+
|
17
|
+
it "should have Integer type" do
|
18
|
+
subject.guess.class.must_equal(Quack::Types::Integer)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "given a string float" do
|
23
|
+
let(:value) { "123.4" }
|
24
|
+
let(:subject) { Quack::Guesser.new(value) }
|
25
|
+
|
26
|
+
it "should have Float type" do
|
27
|
+
subject.guess.class.must_equal(Quack::Types::Float)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "given a Float" do
|
32
|
+
let(:value) { 123.4 }
|
33
|
+
let(:subject) { Quack::Guesser.new(value) }
|
34
|
+
|
35
|
+
it "should have Float type" do
|
36
|
+
subject.guess.class.must_equal(Quack::Types::Float)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "given a 'true' string" do
|
41
|
+
let(:value) { "true" }
|
42
|
+
let(:subject) { Quack::Guesser.new(value) }
|
43
|
+
|
44
|
+
it "should have Boolean type" do
|
45
|
+
subject.guess.class.must_equal(Quack::Types::Boolean)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "given a 'false' string" do
|
50
|
+
let(:value) { "false" }
|
51
|
+
let(:subject) { Quack::Guesser.new(value) }
|
52
|
+
|
53
|
+
it "should have Boolean type" do
|
54
|
+
subject.guess.class.must_equal(Quack::Types::Boolean)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "given true" do
|
59
|
+
let(:value) { true }
|
60
|
+
let(:subject) { Quack::Guesser.new(value) }
|
61
|
+
|
62
|
+
it "should have Boolean type" do
|
63
|
+
subject.guess.class.must_equal(Quack::Types::Boolean)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "given false" do
|
68
|
+
let(:value) { false }
|
69
|
+
let(:subject) { Quack::Guesser.new(value) }
|
70
|
+
|
71
|
+
it "should have Boolean type" do
|
72
|
+
subject.guess.class.must_equal(Quack::Types::Boolean)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "given an ISO 8061 UTC date" do
|
77
|
+
let(:value) { "2014-03-22T03:00:00Z" }
|
78
|
+
let(:subject) { Quack::Guesser.new(value) }
|
79
|
+
|
80
|
+
it "should have Time type" do
|
81
|
+
subject.guess.class.must_equal(Quack::Types::Time)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "given an ISO 8061 non-UTC date" do
|
86
|
+
let(:value) { "2014-03-22T03:00:00-07:00" }
|
87
|
+
let(:subject) { Quack::Guesser.new(value) }
|
88
|
+
|
89
|
+
it "should have Time type" do
|
90
|
+
subject.guess.class.must_equal(Quack::Types::Time)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "given an random string" do
|
95
|
+
let(:value) { "foo123" }
|
96
|
+
let(:subject) { Quack::Guesser.new(value) }
|
97
|
+
|
98
|
+
it "should have String type" do
|
99
|
+
subject.guess.class.must_equal(Quack::Types::String)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/spec/quack_spec.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derrick Reimer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -28,14 +28,14 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
description: A simple type coercion library
|
@@ -51,6 +51,7 @@ files:
|
|
51
51
|
- README.md
|
52
52
|
- Rakefile
|
53
53
|
- lib/quack.rb
|
54
|
+
- lib/quack/guesser.rb
|
54
55
|
- lib/quack/type.rb
|
55
56
|
- lib/quack/types.rb
|
56
57
|
- lib/quack/types/boolean.rb
|
@@ -59,17 +60,17 @@ files:
|
|
59
60
|
- lib/quack/types/null.rb
|
60
61
|
- lib/quack/types/string.rb
|
61
62
|
- lib/quack/types/time.rb
|
62
|
-
- lib/quack/value.rb
|
63
63
|
- lib/quack/version.rb
|
64
64
|
- quack.gemspec
|
65
|
+
- spec/quack/guesser_spec.rb
|
66
|
+
- spec/quack/types/boolean_spec.rb
|
67
|
+
- spec/quack/types/float_spec.rb
|
68
|
+
- spec/quack/types/integer_spec.rb
|
69
|
+
- spec/quack/types/null_spec.rb
|
70
|
+
- spec/quack/types/string_spec.rb
|
71
|
+
- spec/quack/types/time_spec.rb
|
72
|
+
- spec/quack_spec.rb
|
65
73
|
- spec/test_helper.rb
|
66
|
-
- spec/types/boolean_spec.rb
|
67
|
-
- spec/types/float_spec.rb
|
68
|
-
- spec/types/integer_spec.rb
|
69
|
-
- spec/types/null_spec.rb
|
70
|
-
- spec/types/string_spec.rb
|
71
|
-
- spec/types/time_spec.rb
|
72
|
-
- spec/value_spec.rb
|
73
74
|
homepage: https://github.com/djreimer/quack
|
74
75
|
licenses:
|
75
76
|
- MIT
|
@@ -80,26 +81,27 @@ require_paths:
|
|
80
81
|
- lib
|
81
82
|
required_ruby_version: !ruby/object:Gem::Requirement
|
82
83
|
requirements:
|
83
|
-
- -
|
84
|
+
- - '>='
|
84
85
|
- !ruby/object:Gem::Version
|
85
86
|
version: '0'
|
86
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
88
|
requirements:
|
88
|
-
- -
|
89
|
+
- - '>='
|
89
90
|
- !ruby/object:Gem::Version
|
90
91
|
version: '0'
|
91
92
|
requirements: []
|
92
93
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.
|
94
|
+
rubygems_version: 2.0.3
|
94
95
|
signing_key:
|
95
96
|
specification_version: 4
|
96
97
|
summary: Quack is a simple type coercion library for scalar Ruby objects
|
97
98
|
test_files:
|
99
|
+
- spec/quack/guesser_spec.rb
|
100
|
+
- spec/quack/types/boolean_spec.rb
|
101
|
+
- spec/quack/types/float_spec.rb
|
102
|
+
- spec/quack/types/integer_spec.rb
|
103
|
+
- spec/quack/types/null_spec.rb
|
104
|
+
- spec/quack/types/string_spec.rb
|
105
|
+
- spec/quack/types/time_spec.rb
|
106
|
+
- spec/quack_spec.rb
|
98
107
|
- spec/test_helper.rb
|
99
|
-
- spec/types/boolean_spec.rb
|
100
|
-
- spec/types/float_spec.rb
|
101
|
-
- spec/types/integer_spec.rb
|
102
|
-
- spec/types/null_spec.rb
|
103
|
-
- spec/types/string_spec.rb
|
104
|
-
- spec/types/time_spec.rb
|
105
|
-
- spec/value_spec.rb
|
data/lib/quack/value.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require "forwardable"
|
2
|
-
|
3
|
-
module Quack
|
4
|
-
class Value
|
5
|
-
extend Forwardable
|
6
|
-
attr_reader :value, :type_class, :type_instance
|
7
|
-
|
8
|
-
delegate :to_coerced => :type_instance
|
9
|
-
delegate :to_s => :type_instance
|
10
|
-
|
11
|
-
def initialize(value)
|
12
|
-
@value = value
|
13
|
-
@type_class = Quack::Types.select { |t| t.matches?(value) }.first
|
14
|
-
@type_instance = type_class.new(value)
|
15
|
-
end
|
16
|
-
|
17
|
-
def type_matches?(other)
|
18
|
-
type_class == other.type_class
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/spec/value_spec.rb
DELETED
@@ -1,148 +0,0 @@
|
|
1
|
-
require "test_helper"
|
2
|
-
|
3
|
-
describe Quack::Value do
|
4
|
-
describe "given a string integer" do
|
5
|
-
let(:value) { "123" }
|
6
|
-
let(:subject) { Quack::Value.new(value) }
|
7
|
-
|
8
|
-
it "should convert to a Fixnum" do
|
9
|
-
subject.to_coerced.must_equal(123)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should have Integer type" do
|
13
|
-
subject.type_class.must_equal(Quack::Types::Integer)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
describe "given a Fixnum integer" do
|
18
|
-
let(:value) { 123 }
|
19
|
-
let(:subject) { Quack::Value.new(value) }
|
20
|
-
|
21
|
-
it "should return the original value" do
|
22
|
-
subject.to_coerced.must_equal(123)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "should have Integer type" do
|
26
|
-
subject.type_class.must_equal(Quack::Types::Integer)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "given a string float" do
|
31
|
-
let(:value) { "123.4" }
|
32
|
-
let(:subject) { Quack::Value.new(value) }
|
33
|
-
|
34
|
-
it "should convert to a Float" do
|
35
|
-
subject.to_coerced.must_equal(123.4)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should have Float type" do
|
39
|
-
subject.type_class.must_equal(Quack::Types::Float)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "given a Float" do
|
44
|
-
let(:value) { 123.4 }
|
45
|
-
let(:subject) { Quack::Value.new(value) }
|
46
|
-
|
47
|
-
it "should return the original value" do
|
48
|
-
subject.to_coerced.must_equal(123.4)
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should have Float type" do
|
52
|
-
subject.type_class.must_equal(Quack::Types::Float)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe "given a 'true' string" do
|
57
|
-
let(:value) { "true" }
|
58
|
-
let(:subject) { Quack::Value.new(value) }
|
59
|
-
|
60
|
-
it "should return true" do
|
61
|
-
subject.to_coerced.must_equal(true)
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should have Boolean type" do
|
65
|
-
subject.type_class.must_equal(Quack::Types::Boolean)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "given a 'false' string" do
|
70
|
-
let(:value) { "false" }
|
71
|
-
let(:subject) { Quack::Value.new(value) }
|
72
|
-
|
73
|
-
it "should return false" do
|
74
|
-
subject.to_coerced.must_equal(false)
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should have Boolean type" do
|
78
|
-
subject.type_class.must_equal(Quack::Types::Boolean)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
describe "given true" do
|
83
|
-
let(:value) { true }
|
84
|
-
let(:subject) { Quack::Value.new(value) }
|
85
|
-
|
86
|
-
it "should return true" do
|
87
|
-
subject.to_coerced.must_equal(true)
|
88
|
-
end
|
89
|
-
|
90
|
-
it "should have Boolean type" do
|
91
|
-
subject.type_class.must_equal(Quack::Types::Boolean)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe "given false" do
|
96
|
-
let(:value) { false }
|
97
|
-
let(:subject) { Quack::Value.new(value) }
|
98
|
-
|
99
|
-
it "should return false" do
|
100
|
-
subject.to_coerced.must_equal(false)
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should have Boolean type" do
|
104
|
-
subject.type_class.must_equal(Quack::Types::Boolean)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
describe "given an ISO 8061 UTC date" do
|
109
|
-
let(:value) { "2014-03-22T03:00:00Z" }
|
110
|
-
let(:subject) { Quack::Value.new(value) }
|
111
|
-
|
112
|
-
it "should return the correct Time object" do
|
113
|
-
expected = Time.utc(2014, 3, 22, 3, 0, 0)
|
114
|
-
subject.to_coerced.must_equal(expected)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should have Time type" do
|
118
|
-
subject.type_class.must_equal(Quack::Types::Time)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
describe "given an ISO 8061 non-UTC date" do
|
123
|
-
let(:value) { "2014-03-22T03:00:00-07:00" }
|
124
|
-
let(:subject) { Quack::Value.new(value) }
|
125
|
-
|
126
|
-
it "should return the correct Time object" do
|
127
|
-
expected = Time.new(2014, 3, 22, 3, 0, 0, "-07:00")
|
128
|
-
subject.to_coerced.must_equal(expected)
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should have Time type" do
|
132
|
-
subject.type_class.must_equal(Quack::Types::Time)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
describe "given an random string" do
|
137
|
-
let(:value) { "foo123" }
|
138
|
-
let(:subject) { Quack::Value.new(value) }
|
139
|
-
|
140
|
-
it "should return the string" do
|
141
|
-
subject.to_coerced.must_equal(value)
|
142
|
-
end
|
143
|
-
|
144
|
-
it "should have String type" do
|
145
|
-
subject.type_class.must_equal(Quack::Types::String)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|