isy 0.1.2 → 0.2.0

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: 1550994168afbec25a7b84884bed12df5a820c7f
4
- data.tar.gz: 4ae42990401ee896783e7faf287501d1f18e19d9
3
+ metadata.gz: c3b170f040c49a3262f8f3138321752e89f22dcf
4
+ data.tar.gz: 9e08893688c801d61ccac0de3ac2c8b6c61d81ef
5
5
  SHA512:
6
- metadata.gz: 9b3652ba2ea55251ab37446615bbc9a7233dc2566cafb2a4873c24ad001ae4d86e8ed3b1a9bf9d560b7f7afdf35fccfd3985968222d0586b796ecbd7edf941cb
7
- data.tar.gz: 2a2efc241c027f5d8a6d9cef42c7cbbcfab9ea0aa09f94612faa71199b10504bb333a0071094c2dee33db66b1a281656bfd952f0e4234c9dedc96c1b9f9ed6d2
6
+ metadata.gz: 874b089ca5916fbbfaca5d55fcd20225890fefc2ccf97368f36f511658ad9eb19f491d06c55edf599fbe5dbae5903e6c0a14fad731a4536e63be807e9dcfcc4b
7
+ data.tar.gz: f5178fa77edda673fb4a6cae89cfa8105407900bc31b4a86bcc4bc3d70f3493e60fac6a8191ac3233164170c2b5fce9334a4679165850fd9109934bbd5837ff8
data/README.md CHANGED
@@ -1,10 +1,13 @@
1
1
  # Isy
2
2
 
3
+ [![Build Status](https://travis-ci.org/acuppy/isy.svg?branch=master)](https://travis-ci.org/acuppy/isy)
4
+ [![Code Climate](https://codeclimate.com/github/acuppy/isy/badges/gpa.svg)](https://codeclimate.com/github/acuppy/isy)
5
+
3
6
  Guard clauses for argument type assertions can be messy:
4
7
 
5
8
  ```ruby
6
9
  def fullname segments=[]
7
- raise 'User#fullname expects 'segments' to be an Array' if segments.is_a? Array
10
+ raise ArgumentError, 'User#fullname expects 'segments' to be an Array' if segments.is_a? Array
8
11
  # ...
9
12
  end
10
13
  ```
@@ -35,20 +38,37 @@ The second argument is the type.
35
38
  If the subject doesn't match the provided type, then it raises a formatted exception describing
36
39
  what argument *value* was a type mismatch (as an `Isy::ArgumentTypeMismatch` exception).
37
40
 
41
+ Alternatively, you can use the predicate version for type assertion:
42
+
43
+ ```ruby
44
+ def fullname segments=[]
45
+ if isy? segments, Array
46
+ # passes
47
+ end
48
+ end
49
+ ```
50
+
51
+ In the previous example, the interface is the same: subject, arguments,
52
+ optional block. The difference is that if the assertion fails, it will
53
+ catch the `Isy::ArgumentTypeMismatch` exception and return `false`.
54
+
38
55
  ## Usage with an operation
39
56
 
40
57
  Optionally, in place of a type as the second argument, you can pass a block, and perform
41
58
  a more complex comparison operation:
42
59
 
43
60
  ```ruby
44
- def fullname segments
45
- isy segments { |seg| seg.length == 3 }
46
- end
61
+ def fullname segments
62
+ isy segments { |seg| seg.length == 3 }
63
+ # ...
64
+ end
47
65
  ```
48
66
 
49
67
  As illustrated above, `isy` yields to the operation the first argument (segments). The expectation
50
68
  is that the value returned by the operation (block) is a boolen (true => passes, false => failed).
51
69
 
70
+ *Note: predicate version has the same support*
71
+
52
72
  ## Performance
53
73
 
54
74
  It's not great against a more "native" implementation; but, where you lose a little
data/lib/isy/methods.rb CHANGED
@@ -40,14 +40,49 @@ module Isy
40
40
  'Object#isy requires either a type or evaluation block'
41
41
  end
42
42
 
43
- evaluation ||= lambda { |s| s.is_a? args[0] }
43
+ evaluation ||= ->(s) { s.is_a? args[0] }
44
+ is_valid = !!(evaluation.call subject)
44
45
 
45
- unless evaluation.call(subject)
46
+ unless is_valid
46
47
  raise Isy::ArgumentTypeMismatch.new(
47
48
  subject: subject,
48
49
  caller_method: caller_locations(1,1)[0].label
49
50
  )
50
51
  end
52
+
53
+ is_valid
54
+ end
55
+
56
+ # Isy::Methods#isy?
57
+ #
58
+ # == Usage
59
+ #
60
+ # The implementation follows the same workflow as `isy` with one exception (pun intended): returns a boolen.
61
+ #
62
+ # def fullname segments
63
+ # if isy? segments, Array
64
+ # # passes
65
+ # end
66
+ # end
67
+ #
68
+ # If the subject doesn't match the provided type, then it returns false
69
+ #
70
+ # == Usage with an operation
71
+ #
72
+ # Optionally, in place of a type as the second argument, you can pass a block, and perform
73
+ # a more complex comparison operation:
74
+ #
75
+ # def fullname segments
76
+ # isy? segments { |seg| seg.length == 3 }
77
+ # end
78
+ #
79
+ # As illustrated above, `isy?` yields to the operation the first argument (segments). The expectation
80
+ # is that the value returned by the operation (block) is a boolen (true => passes, false => failed).
81
+ #
82
+ def isy? subject, *args, &evaluation
83
+ isy subject, *args, &evaluation
84
+ rescue ArgumentTypeMismatch
85
+ false
51
86
  end
52
87
  end
53
88
  end
data/lib/isy/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Isy
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cuppy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-05-30 00:00:00.000000000 Z
11
+ date: 2016-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler