rtype 0.5.1 → 0.6.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.
- checksums.yaml +4 -4
- data/README.md +34 -67
- data/lib/rtype/behavior/core_ext.rb +1 -5
- data/lib/rtype/behavior.rb +1 -2
- data/lib/rtype/core_ext.rb +4 -13
- data/lib/rtype/version.rb +5 -1
- data/lib/rtype.rb +34 -38
- data/spec/rtype_spec.rb +22 -51
- metadata +2 -3
- data/lib/rtype/behavior/or.rb +0 -24
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 545e8dc3a8ac3c44aa68d87126c6dbf8d57302bb
         | 
| 4 | 
            +
              data.tar.gz: f3d34bb1fb2ecd9cb7f4b0a9315d14fa5a726940
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e39262cd99fdf372ed953a2e4c09cafcc09b7d236946d66d3d37acd03f432e72a0de4f7aaf3cd7d74e0d8997ef0178846ba35c040e209acc08a4a60b4e43f7b5
         | 
| 7 | 
            +
              data.tar.gz: e31ad200c1d08bb0077ef429cfa4d813bff2732f04f705eafc0ce4166c9dbbf0f82581a9e4655500fdb35ec09721cc22c3d29104fccf40c789fd2cdc7bd3f8b2
         | 
    
        data/README.md
    CHANGED
    
    | @@ -37,9 +37,8 @@ Test::invert(state: 0) | |
| 37 37 | 
             
              - If Java extension is used, otherwise it is not required
         | 
| 38 38 |  | 
| 39 39 | 
             
            ## Features
         | 
| 40 | 
            -
            -  | 
| 41 | 
            -
            -  | 
| 42 | 
            -
            - [Type checking for array elements](#array)
         | 
| 40 | 
            +
            - Provides type checking for arguments and return
         | 
| 41 | 
            +
            - Supports type checking for [keyword argument](#keyword-argument)
         | 
| 43 42 | 
             
            - [Type checking for hash elements](#hash)
         | 
| 44 43 | 
             
            - [Duck typing](#duck-typing)
         | 
| 45 44 | 
             
            - Custom type behavior
         | 
| @@ -81,28 +80,23 @@ then, Rtype use it. (Do not `require 'rtype-java'`) | |
| 81 80 |  | 
| 82 81 | 
             
            ### Supported Type Behaviors
         | 
| 83 82 | 
             
            - `Module`
         | 
| 84 | 
            -
              - Value must be an instance of  | 
| 83 | 
            +
              - Value must be an instance of the module/class or one of its superclasses
         | 
| 85 84 | 
             
              - `Any` : An alias for `BasicObject` (means Any Object)
         | 
| 86 85 | 
             
              - `Boolean` : `true` or `false`
         | 
| 87 86 | 
             
            - `Symbol`
         | 
| 88 | 
            -
              - Value must have(respond to) a method with  | 
| 87 | 
            +
              - Value must have(respond to) a method with the name
         | 
| 89 88 | 
             
            - `Regexp`
         | 
| 90 | 
            -
              - Value must match  | 
| 89 | 
            +
              - Value must match the regexp pattern
         | 
| 91 90 | 
             
            - `Range`
         | 
| 92 | 
            -
              - Value must be included in  | 
| 93 | 
            -
            - `Array` | 
| 94 | 
            -
              - Value  | 
| 95 | 
            -
              - Each of value's elements must be valid
         | 
| 96 | 
            -
              - Value's length must be equal to the array's length
         | 
| 97 | 
            -
              - Of course, nested array works
         | 
| 98 | 
            -
              - Example: [Array](#array)
         | 
| 99 | 
            -
              - This can be used as a tuple
         | 
| 91 | 
            +
              - Value must be included in the range
         | 
| 92 | 
            +
            - `Array`
         | 
| 93 | 
            +
              - Value can be any type in the array
         | 
| 100 94 | 
             
            - `Hash`
         | 
| 101 95 | 
             
              - Value must be an hash
         | 
| 102 96 | 
             
              - Each of value’s elements must be valid
         | 
| 103 97 | 
             
              - Value's key list must be equal to the hash's key list
         | 
| 104 98 | 
             
              - **String** key is **different** from **symbol** key
         | 
| 105 | 
            -
              - vs Keyword arguments
         | 
| 99 | 
            +
              - vs Keyword arguments (e.g.)
         | 
| 106 100 | 
             
                - `[{}]` is **not** hash type argument. it is keyword argument because its position is last
         | 
| 107 101 | 
             
                - `[{}, {}]` is empty hash type argument (first) and one empty keyword argument (second)
         | 
| 108 102 | 
             
                - `[{}, {}, {}]` is two empty hash type argument (first, second) and empty keyword argument (last)
         | 
| @@ -110,44 +104,31 @@ then, Rtype use it. (Do not `require 'rtype-java'`) | |
| 110 104 | 
             
              - Of course, nested hash works
         | 
| 111 105 | 
             
              - Example: [Hash](#hash)
         | 
| 112 106 | 
             
            - `Proc`
         | 
| 113 | 
            -
              - Value must return a truthy value for  | 
| 107 | 
            +
              - Value must return a truthy value for the proc
         | 
| 114 108 | 
             
            - `true`
         | 
| 115 109 | 
             
              - Value must be **truthy**
         | 
| 116 110 | 
             
            - `false`
         | 
| 117 111 | 
             
              - Value must be **falsy**
         | 
| 118 112 | 
             
            - `nil`
         | 
| 119 | 
            -
              -  | 
| 113 | 
            +
              - Value must be nil
         | 
| 120 114 | 
             
            - Special Behaviors
         | 
| 121 115 | 
             
              - `Rtype::and(*types)` : Ensure value is valid for all the types
         | 
| 122 | 
            -
                - `Rtype::and(*types)`
         | 
| 123 | 
            -
                - ` | 
| 124 | 
            -
                - ` | 
| 125 | 
            -
                 | 
| 126 | 
            -
             | 
| 127 | 
            -
              - `Rtype::or(*types)` : Ensure value is valid for at least one of the types
         | 
| 128 | 
            -
                - `Rtype::or(*types)`
         | 
| 129 | 
            -
                - `Rtype::Behavior::Or[*types]`
         | 
| 130 | 
            -
                - `include Rtype::Behavior; Or[...]`
         | 
| 131 | 
            -
                - `obj.or(*others)` (core extension)
         | 
| 132 | 
            -
             | 
| 116 | 
            +
                - `Rtype::and(*types)`, `Rtype::Behavior::And[*types]`, `include Rtype::Behavior; And[...]`
         | 
| 117 | 
            +
                - `Array#comb`
         | 
| 118 | 
            +
                - `Object#and(*others)`
         | 
| 119 | 
            +
                
         | 
| 133 120 | 
             
              - `Rtype::xor(*types)` : Ensure value is valid for only one of the types
         | 
| 134 | 
            -
                - `Rtype::xor(*types)`
         | 
| 135 | 
            -
                - ` | 
| 136 | 
            -
                - `include Rtype::Behavior; Xor[...]`
         | 
| 137 | 
            -
                - `obj.xor(*others)` (core extension)
         | 
| 121 | 
            +
                - `Rtype::xor(*types)`, `Rtype::Behavior::Xor[*types]`, `include Rtype::Behavior; Xor[...]`
         | 
| 122 | 
            +
                - `Object#xor(*others)`
         | 
| 138 123 |  | 
| 139 124 | 
             
              - `Rtype::not(*types)` : Ensure value is not valid for all the types
         | 
| 140 | 
            -
                - `Rtype::not(*types)`
         | 
| 141 | 
            -
                - ` | 
| 142 | 
            -
                - `include Rtype::Behavior; Not[...]`
         | 
| 143 | 
            -
                - `obj.not` (core extension)
         | 
| 125 | 
            +
                - `Rtype::not(*types)`, `Rtype::Behavior::Not[*types]`, `include Rtype::Behavior; Not[...]`
         | 
| 126 | 
            +
                - `Object#not`
         | 
| 144 127 |  | 
| 145 128 | 
             
              - `Rtype::nilable(type)` : Ensure value can be nil
         | 
| 146 | 
            -
                - `Rtype::nilable(type)`
         | 
| 147 | 
            -
                - ` | 
| 148 | 
            -
                - ` | 
| 149 | 
            -
                - `obj.nilable` (core extension)
         | 
| 150 | 
            -
                - `obj.or_nil` (core extension)
         | 
| 129 | 
            +
                - `Rtype::nilable(type)`, `Rtype::Behavior::Nilable[type]`, `include Rtype::Behavior; Nilable[...]`
         | 
| 130 | 
            +
                - `Object#nilable`
         | 
| 131 | 
            +
                - `Object#or_nil`
         | 
| 151 132 |  | 
| 152 133 | 
             
              - You can create custom behavior by extending `Rtype::Behavior::Base`
         | 
| 153 134 |  | 
| @@ -224,33 +205,19 @@ Duck.new.says("2") # duck: quack quack | |
| 224 205 | 
             
            ```
         | 
| 225 206 |  | 
| 226 207 | 
             
            #### Array
         | 
| 227 | 
            -
            This can be used as a tuple.
         | 
| 228 | 
            -
             | 
| 229 208 | 
             
            ```ruby
         | 
| 230 | 
            -
            rtype : | 
| 231 | 
            -
            def  | 
| 232 | 
            -
             | 
| 209 | 
            +
            rtype :ruby!, [[String, Integer]] => Any
         | 
| 210 | 
            +
            def ruby!(arg)
         | 
| 211 | 
            +
            	puts "ruby!"
         | 
| 233 212 | 
             
            end
         | 
| 234 213 |  | 
| 235 | 
            -
            func | 
| 236 | 
            -
             | 
| 237 | 
            -
            # Expected [1, "str"] to be an array with 2 elements:
         | 
| 238 | 
            -
            # - [0] index : Expected 1 to be a Numeric
         | 
| 239 | 
            -
            # - [1] index : Expected "str" to be a Numeric
         | 
| 240 | 
            -
             | 
| 241 | 
            -
            func [1, 2, 3]
         | 
| 242 | 
            -
            # (Rtype::ArgumentTypeError) for 1st argument:
         | 
| 243 | 
            -
            # Expected [1, 2, 3] to be an array with 2 elements:
         | 
| 244 | 
            -
            # - [0] index : Expected 1 to be a Numeric
         | 
| 245 | 
            -
            # - [1] index : Expected 2 to be a Numeric
         | 
| 214 | 
            +
            func("str") # ruby!
         | 
| 215 | 
            +
            func(123) # ruby!
         | 
| 246 216 |  | 
| 247 | 
            -
            func | 
| 217 | 
            +
            func(nil)
         | 
| 248 218 | 
             
            # (Rtype::ArgumentTypeError) for 1st argument:
         | 
| 249 | 
            -
            # Expected  | 
| 250 | 
            -
            #  | 
| 251 | 
            -
            # - [1] index : Expected nil to be a Numeric
         | 
| 252 | 
            -
             | 
| 253 | 
            -
            func [1, 2] # Your location is (1, 2). I will look for you. I will find you
         | 
| 219 | 
            +
            # Expected nil to be a String
         | 
| 220 | 
            +
            # OR Expected nil to be a Integer
         | 
| 254 221 | 
             
            ```
         | 
| 255 222 |  | 
| 256 223 | 
             
            #### Hash
         | 
| @@ -316,7 +283,7 @@ Example.new.value | |
| 316 283 | 
             
            require 'rtype'
         | 
| 317 284 |  | 
| 318 285 | 
             
            class Example
         | 
| 319 | 
            -
              rtype [String | 
| 286 | 
            +
              rtype [[String, :func].comb] => Any
         | 
| 320 287 | 
             
              # also works:
         | 
| 321 288 | 
             
              # rtype [Rtype::and(String, :func)] => Any
         | 
| 322 289 | 
             
              def and_test(arg)
         | 
| @@ -349,12 +316,12 @@ module Game | |
| 349 316 | 
             
              ENEMY = [
         | 
| 350 317 | 
             
                :name,
         | 
| 351 318 | 
             
                :level
         | 
| 352 | 
            -
              ]
         | 
| 319 | 
            +
              ].comb
         | 
| 353 320 |  | 
| 354 321 | 
             
              class Player < Entity
         | 
| 355 322 | 
             
                include Rtype::Behavior
         | 
| 356 323 |  | 
| 357 | 
            -
                rtype [ | 
| 324 | 
            +
                rtype [ENEMY] => Any
         | 
| 358 325 | 
             
                def attacks(enemy)
         | 
| 359 326 | 
             
                  "Player attacks '#{enemy.name}' (level #{enemy.level})!"
         | 
| 360 327 | 
             
                end
         | 
| @@ -565,4 +532,4 @@ Sputnik Gugja (sputnikgugja@gmail.com) | |
| 565 532 | 
             
            ## License
         | 
| 566 533 | 
             
            MIT license (@ Sputnik Gugja)
         | 
| 567 534 |  | 
| 568 | 
            -
            See `LICENSE` file.
         | 
| 535 | 
            +
            See `LICENSE` file.
         | 
    
        data/lib/rtype/behavior.rb
    CHANGED
    
    | @@ -4,9 +4,8 @@ module Rtype | |
| 4 4 | 
             
            end
         | 
| 5 5 |  | 
| 6 6 | 
             
            require_relative 'behavior/base'
         | 
| 7 | 
            -
            require_relative 'behavior/or'
         | 
| 8 7 | 
             
            require_relative 'behavior/and'
         | 
| 9 8 | 
             
            require_relative 'behavior/xor'
         | 
| 10 9 | 
             
            require_relative 'behavior/not'
         | 
| 11 10 | 
             
            require_relative 'behavior/nilable'
         | 
| 12 | 
            -
            require_relative 'behavior/core_ext'
         | 
| 11 | 
            +
            require_relative 'behavior/core_ext'
         | 
    
        data/lib/rtype/core_ext.rb
    CHANGED
    
    | @@ -83,17 +83,8 @@ class Method | |
| 83 83 | 
             
            	end
         | 
| 84 84 | 
             
            end
         | 
| 85 85 |  | 
| 86 | 
            -
            class  | 
| 87 | 
            -
            	def  | 
| 88 | 
            -
             | 
| 89 | 
            -
            			"#{self}th"
         | 
| 90 | 
            -
            	    else
         | 
| 91 | 
            -
            			case self % 10
         | 
| 92 | 
            -
            			when 1; "#{self}st"
         | 
| 93 | 
            -
            			when 2; "#{self}nd"
         | 
| 94 | 
            -
            			when 3; "#{self}rd"
         | 
| 95 | 
            -
            			else "#{self}th"
         | 
| 96 | 
            -
            			end
         | 
| 97 | 
            -
            	    end
         | 
| 86 | 
            +
            class Array
         | 
| 87 | 
            +
            	def comb
         | 
| 88 | 
            +
            		::Rtype::Behavior::And[*self]
         | 
| 98 89 | 
             
            	end
         | 
| 99 | 
            -
            end
         | 
| 90 | 
            +
            end
         | 
    
        data/lib/rtype/version.rb
    CHANGED
    
    | @@ -1,3 +1,7 @@ | |
| 1 1 | 
             
            module Rtype
         | 
| 2 | 
            -
            	VERSION = "0. | 
| 2 | 
            +
            	VERSION = "0.6.0".freeze
         | 
| 3 | 
            +
            	# rtype java extension version. nil If the extension is not used
         | 
| 4 | 
            +
            	JAVA_EXT_VERSION = nil unless defined?(JAVA_EXT_VERSION)
         | 
| 5 | 
            +
            	# rtype c extension version. nil If the extension is not used
         | 
| 6 | 
            +
            	NATIVE_EXT_VERSION = nil unless defined?(NATIVE_EXT_VERSION)
         | 
| 3 7 | 
             
            end
         | 
    
        data/lib/rtype.rb
    CHANGED
    
    | @@ -98,14 +98,13 @@ module Rtype | |
| 98 98 | 
             
            	end
         | 
| 99 99 |  | 
| 100 100 | 
             
            	def arg_message(idx)
         | 
| 101 | 
            -
            		"for #{(idx+1) | 
| 101 | 
            +
            		"for #{ordinalize_number(idx+1)} argument:"
         | 
| 102 102 | 
             
            	end
         | 
| 103 103 |  | 
| 104 104 | 
             
            	def kwarg_message(key)
         | 
| 105 105 | 
             
            		"for '#{key}' argument:"
         | 
| 106 106 | 
             
            	end
         | 
| 107 107 |  | 
| 108 | 
            -
             | 
| 109 108 | 
             
            	def type_error_message(expected, value)
         | 
| 110 109 | 
             
            		case expected
         | 
| 111 110 | 
             
            		when Rtype::Behavior::Base
         | 
| @@ -119,18 +118,8 @@ module Rtype | |
| 119 118 | 
             
            		when Range
         | 
| 120 119 | 
             
            			"Expected #{value.inspect} to be included in range #{expected.inspect}"
         | 
| 121 120 | 
             
            		when Array
         | 
| 122 | 
            -
            			 | 
| 123 | 
            -
             | 
| 124 | 
            -
            					if e.is_a?(Array) || e.is_a?(Hash)
         | 
| 125 | 
            -
            						"- [#{idx}] index : {\n" + type_error_message(e, value[idx]) + "\n}"
         | 
| 126 | 
            -
            					else
         | 
| 127 | 
            -
            						"- [#{idx}] index : " + type_error_message(e, value[idx])
         | 
| 128 | 
            -
            					end
         | 
| 129 | 
            -
            				end
         | 
| 130 | 
            -
            				"Expected #{value.inspect} to be an array with #{expected.length} elements:\n" + arr.join("\n")
         | 
| 131 | 
            -
            			else
         | 
| 132 | 
            -
            				"Expected #{value.inspect} to be an array"
         | 
| 133 | 
            -
            			end
         | 
| 121 | 
            +
            			arr = expected.map { |e| type_error_message(e, value) }
         | 
| 122 | 
            +
            			arr.join("\nOR ")
         | 
| 134 123 | 
             
            		when Hash
         | 
| 135 124 | 
             
            			if value.is_a?(Hash)
         | 
| 136 125 | 
             
            				arr = []
         | 
| @@ -208,13 +197,14 @@ module Rtype | |
| 208 197 | 
             
            		when Proc
         | 
| 209 198 | 
             
            		when true
         | 
| 210 199 | 
             
            		when false
         | 
| 200 | 
            +
            		when nil
         | 
| 211 201 | 
             
            		else
         | 
| 212 202 | 
             
            			raise TypeSignatureError, "Invalid type signature: Unknown type behavior #{sig}"
         | 
| 213 203 | 
             
            		end
         | 
| 214 204 | 
             
            	end
         | 
| 215 205 |  | 
| 216 206 | 
             
            	def assert_valid_return_type_sig(sig)
         | 
| 217 | 
            -
            		assert_valid_argument_type_sig_element(sig) | 
| 207 | 
            +
            		assert_valid_argument_type_sig_element(sig)
         | 
| 218 208 | 
             
            	end
         | 
| 219 209 |  | 
| 220 210 | 
             
            private
         | 
| @@ -233,7 +223,19 @@ private | |
| 233 223 | 
             
            		end
         | 
| 234 224 | 
             
            		nil
         | 
| 235 225 | 
             
            	end
         | 
| 236 | 
            -
             | 
| 226 | 
            +
            	
         | 
| 227 | 
            +
            	def ordinalize_number(num)
         | 
| 228 | 
            +
            	    if (11..13).include?(num % 100)
         | 
| 229 | 
            +
            			"#{num}th"
         | 
| 230 | 
            +
            	    else
         | 
| 231 | 
            +
            			case num % 10
         | 
| 232 | 
            +
            			when 1; "#{num}st"
         | 
| 233 | 
            +
            			when 2; "#{num}nd"
         | 
| 234 | 
            +
            			when 3; "#{num}rd"
         | 
| 235 | 
            +
            			else "#{num}th"
         | 
| 236 | 
            +
            			end
         | 
| 237 | 
            +
            	    end
         | 
| 238 | 
            +
            	end
         | 
| 237 239 | 
             
            public
         | 
| 238 240 | 
             
            	unless respond_to?(:valid?)
         | 
| 239 241 | 
             
            	# validate argument type
         | 
| @@ -252,10 +254,7 @@ public | |
| 252 254 | 
             
            			return false unless expected.keys == value.keys
         | 
| 253 255 | 
             
            			expected.all? { |k, v| valid?(v, value[k]) }
         | 
| 254 256 | 
             
            		when Array
         | 
| 255 | 
            -
            			 | 
| 256 | 
            -
            			return false unless expected.length == value.length
         | 
| 257 | 
            -
            			idx = -1
         | 
| 258 | 
            -
            			expected.all? { |e| idx += 1; valid?(e, value[idx]) }
         | 
| 257 | 
            +
            			expected.any? { |e| valid?(e, value) }
         | 
| 259 258 | 
             
            		when Proc
         | 
| 260 259 | 
             
            			!!expected.call(value)
         | 
| 261 260 | 
             
            		when true
         | 
| @@ -264,6 +263,8 @@ public | |
| 264 263 | 
             
            			!value
         | 
| 265 264 | 
             
            		when Rtype::Behavior::Base
         | 
| 266 265 | 
             
            			expected.valid? value
         | 
| 266 | 
            +
            		when nil
         | 
| 267 | 
            +
            			value.nil?
         | 
| 267 268 | 
             
            		else
         | 
| 268 269 | 
             
            			raise TypeSignatureError, "Invalid type signature: Unknown type behavior #{expected}"
         | 
| 269 270 | 
             
            		end
         | 
| @@ -272,14 +273,14 @@ public | |
| 272 273 |  | 
| 273 274 | 
             
            	unless respond_to?(:assert_arguments_type)
         | 
| 274 275 | 
             
            	def assert_arguments_type(expected_args, args)
         | 
| 276 | 
            +
            		e_len = expected_args.length
         | 
| 275 277 | 
             
            		# `length.times` is faster than `each_with_index`
         | 
| 276 278 | 
             
            		args.length.times do |i|
         | 
| 279 | 
            +
            			break if i >= e_len
         | 
| 277 280 | 
             
            			expected = expected_args[i]
         | 
| 278 281 | 
             
            			value = args[i]
         | 
| 279 | 
            -
            			unless expected | 
| 280 | 
            -
            				 | 
| 281 | 
            -
            					raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
         | 
| 282 | 
            -
            				end
         | 
| 282 | 
            +
            			unless valid?(expected, value)
         | 
| 283 | 
            +
            				raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
         | 
| 283 284 | 
             
            			end
         | 
| 284 285 | 
             
            		end
         | 
| 285 286 | 
             
            	end
         | 
| @@ -287,19 +288,20 @@ public | |
| 287 288 |  | 
| 288 289 | 
             
            	unless respond_to?(:assert_arguments_type_with_keywords)
         | 
| 289 290 | 
             
            	def assert_arguments_type_with_keywords(expected_args, args, expected_kwargs, kwargs)
         | 
| 291 | 
            +
            		e_len = expected_args.length
         | 
| 290 292 | 
             
            		# `length.times` is faster than `each_with_index`
         | 
| 291 293 | 
             
            		args.length.times do |i|
         | 
| 294 | 
            +
            			break if i >= e_len
         | 
| 292 295 | 
             
            			expected = expected_args[i]
         | 
| 293 296 | 
             
            			value = args[i]
         | 
| 294 | 
            -
            			unless expected | 
| 295 | 
            -
            				 | 
| 296 | 
            -
            					raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
         | 
| 297 | 
            -
            				end
         | 
| 297 | 
            +
            			unless valid?(expected, value)
         | 
| 298 | 
            +
            				raise ArgumentTypeError, "#{arg_message(i)}\n" + type_error_message(expected, value)
         | 
| 298 299 | 
             
            			end
         | 
| 299 300 | 
             
            		end
         | 
| 301 | 
            +
            		
         | 
| 300 302 | 
             
            		kwargs.each do |key, value|
         | 
| 301 | 
            -
            			 | 
| 302 | 
            -
             | 
| 303 | 
            +
            			if expected_kwargs.key?(key)
         | 
| 304 | 
            +
            				expected = expected_kwargs[key]
         | 
| 303 305 | 
             
            				unless valid?(expected, value)
         | 
| 304 306 | 
             
            					raise ArgumentTypeError, "#{kwarg_message(key)}\n" + type_error_message(expected, value)
         | 
| 305 307 | 
             
            				end
         | 
| @@ -310,14 +312,8 @@ public | |
| 310 312 |  | 
| 311 313 | 
             
            	unless respond_to?(:assert_return_type)
         | 
| 312 314 | 
             
            	def assert_return_type(expected, result)
         | 
| 313 | 
            -
            		 | 
| 314 | 
            -
            			 | 
| 315 | 
            -
            				raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
         | 
| 316 | 
            -
            			end
         | 
| 317 | 
            -
            		else
         | 
| 318 | 
            -
            			unless valid?(expected, result)
         | 
| 319 | 
            -
            				raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
         | 
| 320 | 
            -
            			end
         | 
| 315 | 
            +
            		unless valid?(expected, result)
         | 
| 316 | 
            +
            			raise ReturnTypeError, "for return:\n" + type_error_message(expected, result)
         | 
| 321 317 | 
             
            		end
         | 
| 322 318 | 
             
            	end
         | 
| 323 319 | 
             
            	end
         | 
    
        data/spec/rtype_spec.rb
    CHANGED
    
    | @@ -237,31 +237,30 @@ describe Rtype do | |
| 237 237 |  | 
| 238 238 | 
             
            		describe 'Array' do
         | 
| 239 239 | 
             
            			it "is right" do
         | 
| 240 | 
            -
            				klass.send :rtype, :return_arg, [[:to_i | 
| 241 | 
            -
            				instance.return_arg( | 
| 240 | 
            +
            				klass.send :rtype, :return_arg, [[:to_i]] => Any
         | 
| 241 | 
            +
            				instance.return_arg(123)
         | 
| 242 242 |  | 
| 243 | 
            -
            				klass.send :rtype, : | 
| 244 | 
            -
            				instance. | 
| 243 | 
            +
            				klass.send :rtype, :return_arg, [[String, Integer]] => Any
         | 
| 244 | 
            +
            				instance.return_arg("str")
         | 
| 245 | 
            +
            				instance.return_arg(123)
         | 
| 246 | 
            +
            				
         | 
| 247 | 
            +
            				klass.send :rtype, :return_arg, [] => [String, Integer]
         | 
| 248 | 
            +
            				instance.return_arg("str")
         | 
| 249 | 
            +
            				instance.return_arg(123)
         | 
| 245 250 | 
             
            			end
         | 
| 246 251 | 
             
            			it "is wrong args" do
         | 
| 247 | 
            -
            				klass.send :rtype, :return_arg, [[ | 
| 248 | 
            -
            				expect {
         | 
| 249 | 
            -
            					instance.return_arg([123, [true]])
         | 
| 250 | 
            -
            				}.to raise_error Rtype::ArgumentTypeError
         | 
| 252 | 
            +
            				klass.send :rtype, :return_arg, [[String, Integer]] => Any
         | 
| 251 253 | 
             
            				expect {
         | 
| 252 | 
            -
            					instance.return_arg( | 
| 254 | 
            +
            					instance.return_arg(nil)
         | 
| 253 255 | 
             
            				}.to raise_error Rtype::ArgumentTypeError
         | 
| 254 256 |  | 
| 255 | 
            -
            				klass.send :rtype, : | 
| 257 | 
            +
            				klass.send :rtype, :return_arg, [[String]] => Any
         | 
| 256 258 | 
             
            				expect {
         | 
| 257 | 
            -
            					instance. | 
| 258 | 
            -
            				}.to raise_error Rtype::ArgumentTypeError
         | 
| 259 | 
            -
            				expect {
         | 
| 260 | 
            -
            					instance.two_args([123], 123)
         | 
| 259 | 
            +
            					instance.return_arg(123)
         | 
| 261 260 | 
             
            				}.to raise_error Rtype::ArgumentTypeError
         | 
| 262 261 | 
             
            			end
         | 
| 263 262 | 
             
            			it "is wrong result" do
         | 
| 264 | 
            -
            				klass.send :rtype, :return_arg, [Any] => [ | 
| 263 | 
            +
            				klass.send :rtype, :return_arg, [Any] => [String, Integer]
         | 
| 265 264 | 
             
            				expect {instance.return_arg(true)}.to raise_error Rtype::ReturnTypeError
         | 
| 266 265 | 
             
            			end
         | 
| 267 266 | 
             
            		end
         | 
| @@ -335,17 +334,19 @@ describe Rtype do | |
| 335 334 | 
             
            		end
         | 
| 336 335 |  | 
| 337 336 | 
             
            		describe 'nil' do
         | 
| 338 | 
            -
            			it " | 
| 337 | 
            +
            			it "for return" do
         | 
| 339 338 | 
             
            				klass.send :rtype, :return_nil, [] => nil
         | 
| 340 339 | 
             
            				instance.return_nil(123)
         | 
| 341 340 |  | 
| 342 341 | 
             
            				klass.send :rtype, :return_arg, [] => nil
         | 
| 343 342 | 
             
            				expect {instance.return_arg(123)}.to raise_error Rtype::ReturnTypeError
         | 
| 344 343 | 
             
            			end
         | 
| 345 | 
            -
            			it " | 
| 344 | 
            +
            			it "for args" do
         | 
| 345 | 
            +
            				klass.send :rtype, :return_arg, [nil] => Any
         | 
| 346 | 
            +
            				instance.return_arg(nil)
         | 
| 346 347 | 
             
            				expect {
         | 
| 347 | 
            -
            					 | 
| 348 | 
            -
            				}.to raise_error Rtype:: | 
| 348 | 
            +
            					instance.return_arg(123)
         | 
| 349 | 
            +
            				}.to raise_error Rtype::ArgumentTypeError
         | 
| 349 350 | 
             
            			end
         | 
| 350 351 | 
             
            		end
         | 
| 351 352 |  | 
| @@ -370,29 +371,6 @@ describe Rtype do | |
| 370 371 | 
             
            				end
         | 
| 371 372 | 
             
            			end
         | 
| 372 373 |  | 
| 373 | 
            -
            			describe 'Rtype::Behavior::Or' do
         | 
| 374 | 
            -
            				it 'module singleton method' do
         | 
| 375 | 
            -
            					klass.send :rtype, :return_nil, [Rtype::or(Integer, String)] => nil
         | 
| 376 | 
            -
            					instance.return_nil(123)
         | 
| 377 | 
            -
            					instance.return_nil("abc")
         | 
| 378 | 
            -
            					expect {instance.return_nil(nil)}.to raise_error Rtype::ArgumentTypeError
         | 
| 379 | 
            -
            				end
         | 
| 380 | 
            -
             | 
| 381 | 
            -
            				it 'class singleton [] method' do
         | 
| 382 | 
            -
            					klass.send :rtype, :return_nil, [ Rtype::Behavior::Or[Integer, String] ] => nil
         | 
| 383 | 
            -
            					instance.return_nil(123)
         | 
| 384 | 
            -
            					instance.return_nil("abc")
         | 
| 385 | 
            -
            					expect {instance.return_nil(nil)}.to raise_error Rtype::ArgumentTypeError
         | 
| 386 | 
            -
            				end
         | 
| 387 | 
            -
             | 
| 388 | 
            -
            				it 'core extension method' do
         | 
| 389 | 
            -
            					klass.send :rtype, :return_nil, [ Integer.or(String) ] => nil
         | 
| 390 | 
            -
            					instance.return_nil(123)
         | 
| 391 | 
            -
            					instance.return_nil("abc")
         | 
| 392 | 
            -
            					expect {instance.return_nil(nil)}.to raise_error Rtype::ArgumentTypeError
         | 
| 393 | 
            -
            				end
         | 
| 394 | 
            -
            			end
         | 
| 395 | 
            -
             | 
| 396 374 | 
             
            			describe 'Rtype::Behavior::Nilable' do
         | 
| 397 375 | 
             
            				it 'module singleton method' do
         | 
| 398 376 | 
             
            					klass.send :rtype, :return_nil, [Rtype::nilable(Integer)] => nil
         | 
| @@ -480,13 +458,6 @@ describe Rtype do | |
| 480 458 | 
             
            				expect {instance.sum(1, 2.0)}.to raise_error Rtype::ArgumentTypeError
         | 
| 481 459 | 
             
            			end
         | 
| 482 460 |  | 
| 483 | 
            -
            			it 'two array' do
         | 
| 484 | 
            -
            				klass.send :rtype, :sum, [[Integer], [Integer]] => Any
         | 
| 485 | 
            -
            				instance.sum([1], [2])
         | 
| 486 | 
            -
            				expect {instance.sum([1], 2)}.to raise_error Rtype::ArgumentTypeError
         | 
| 487 | 
            -
            				expect {instance.sum([1], ["str"])}.to raise_error Rtype::ArgumentTypeError
         | 
| 488 | 
            -
            			end
         | 
| 489 | 
            -
             | 
| 490 461 | 
             
            			it 'two hash' do
         | 
| 491 462 | 
             
            				klass.send :rtype, :two_args, [{k: Integer}, {k: Integer}, {}] => Any
         | 
| 492 463 | 
             
            				instance.two_args({k: 123}, {k: 456}, {})
         | 
| @@ -564,9 +535,9 @@ describe Rtype do | |
| 564 535 | 
             
            				instance.return_arg("str")
         | 
| 565 536 | 
             
            			end
         | 
| 566 537 |  | 
| 567 | 
            -
            			it 'Array | 
| 538 | 
            +
            			it 'Array' do
         | 
| 568 539 | 
             
            				klass.send :rtype, :return_arg, [] => [Integer, Float]
         | 
| 569 | 
            -
            				expect {instance.return_arg( | 
| 540 | 
            +
            				expect {instance.return_arg("str")}.to raise_error Rtype::ReturnTypeError
         | 
| 570 541 | 
             
            			end
         | 
| 571 542 | 
             
            		end
         | 
| 572 543 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rtype
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.6.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Sputnik Gugja
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016- | 
| 11 | 
            +
            date: 2016-05-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake
         | 
| @@ -72,7 +72,6 @@ files: | |
| 72 72 | 
             
            - lib/rtype/behavior/core_ext.rb
         | 
| 73 73 | 
             
            - lib/rtype/behavior/nilable.rb
         | 
| 74 74 | 
             
            - lib/rtype/behavior/not.rb
         | 
| 75 | 
            -
            - lib/rtype/behavior/or.rb
         | 
| 76 75 | 
             
            - lib/rtype/behavior/xor.rb
         | 
| 77 76 | 
             
            - lib/rtype/core_ext.rb
         | 
| 78 77 | 
             
            - lib/rtype/method_annotator.rb
         | 
    
        data/lib/rtype/behavior/or.rb
    DELETED
    
    | @@ -1,24 +0,0 @@ | |
| 1 | 
            -
            module Rtype
         | 
| 2 | 
            -
            	module Behavior
         | 
| 3 | 
            -
            		class Or < Base
         | 
| 4 | 
            -
            			def initialize(*types)
         | 
| 5 | 
            -
            				@types = types
         | 
| 6 | 
            -
            			end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            			def valid?(value)
         | 
| 9 | 
            -
            				@types.any? do |e|
         | 
| 10 | 
            -
            					Rtype::valid? e, value
         | 
| 11 | 
            -
            				end
         | 
| 12 | 
            -
            			end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            			def error_message(value)
         | 
| 15 | 
            -
            				arr = @types.map { |e| Rtype::type_error_message(e, value) }
         | 
| 16 | 
            -
            				arr.join "\nOR "
         | 
| 17 | 
            -
            			end
         | 
| 18 | 
            -
            		end
         | 
| 19 | 
            -
            	end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            	def or(*args)
         | 
| 22 | 
            -
            		Behavior::Or[*args]
         | 
| 23 | 
            -
            	end
         | 
| 24 | 
            -
            end
         |