yard_types 0.1.1 → 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0369d77a792080e158ad1f24d780bc21a84ec3ff
4
+ data.tar.gz: 4ce73e430052d5988d0083d7c07b6b4499d2b6d7
5
+ SHA512:
6
+ metadata.gz: 155a4ae5f178b5b3b04d06a4d7c161b15d514500254dba0160006e65f3def7672e7cfd0940d98ce5e62ecd5fecb8fff690374f69f46315829436f100f6aad4c3
7
+ data.tar.gz: d94dabcce7a961141a7de4f26a00363f5112f61fb56d7b16f10a33306641d6d2066d7d6461ca41112865a621e46f0c0812fde2a19f0530a5dcefcf34dcd79867
@@ -0,0 +1,2 @@
1
+ --title "yard_types"
2
+ --markup markdown
@@ -18,7 +18,7 @@ module YardTypes
18
18
  end
19
19
  end
20
20
 
21
- # Returned from {YardTypes.validate} when a type check succeeds,
21
+ # Returned from {YardTypes.check} when a type check succeeds,
22
22
  # providing the particular type which satisfied the
23
23
  # {TypeConstraint}.
24
24
  class Success < Result
@@ -27,7 +27,7 @@ module YardTypes
27
27
  end
28
28
  end
29
29
 
30
- # Returned from {YardTypes.validate} when a type check fails,
30
+ # Returned from {YardTypes.check} when a type check fails,
31
31
  # providing a reference to the {TypeConstraint} and a means of
32
32
  # generating error messages describing the error.
33
33
  class Failure < Result
@@ -52,13 +52,12 @@ module YardTypes
52
52
  end
53
53
 
54
54
  # Parses a type identifier with {#parse}, then validates that the
55
- # given +obj+ satisfies the type constraint.
55
+ # given `obj` satisfies the type constraint.
56
56
  #
57
57
  # @param type [String, Array<String>] A YARD type description; see {#parse}.
58
58
  # @param obj [Object] Any object.
59
59
  # @return [Result] success or failure.
60
- # @todo deprecate; rename it +check+ to match everything else.
61
- def validate(type, obj)
60
+ def check(type, obj)
62
61
  constraint = parse(type)
63
62
  if constraint.check(obj)
64
63
  Success.new
@@ -13,9 +13,9 @@ module YardTypes
13
13
  end
14
14
  end
15
15
 
16
- # A +TypeConstraint+ specifies the set of acceptable types
16
+ # A `TypeConstraint` specifies the set of acceptable types
17
17
  # which can satisfy the constraint. Parsing any YARD type
18
- # description will return a +TypeConstraint+ instance.
18
+ # description will return a `TypeConstraint` instance.
19
19
  #
20
20
  # @see YardTypes.parse
21
21
  class TypeConstraint
@@ -28,7 +28,7 @@ module YardTypes
28
28
  end
29
29
 
30
30
  # @param i [Fixnum]
31
- # @return [Type] the type at index +i+
31
+ # @return [Type] the type at index `i`
32
32
  # @todo deprecate this; remnant from original TDD'd API.
33
33
  def [](i)
34
34
  accepted_types[i]
@@ -41,13 +41,13 @@ module YardTypes
41
41
  end
42
42
 
43
43
  # @param obj [Object] Any object.
44
- # @return [Type, nil] The first type which matched +obj+,
45
- # or +nil+ if none.
44
+ # @return [Type, nil] the first type which matched `obj`,
45
+ # or `nil` if none.
46
46
  def check(obj)
47
47
  accepted_types.find { |t| t.check(obj) }
48
48
  end
49
49
 
50
- # @return [String] A YARD type string describing this set of
50
+ # @return [String] a YARD type string describing this set of
51
51
  # types.
52
52
  def to_s
53
53
  accepted_types.map(&:to_s).join(', ')
@@ -96,15 +96,15 @@ module YardTypes
96
96
  end
97
97
  end
98
98
 
99
- # A {DuckType} constraint is specified as +#some_message+,
99
+ # A {DuckType} constraint is specified as `#some_message`,
100
100
  # and indicates that the object must respond to the method
101
- # +some_message+.
101
+ # `some_message`.
102
102
  class DuckType < Type
103
103
  # @return [String] The method the object must respond to;
104
- # this does not include the leading +#+ character.
104
+ # this does not include the leading `#` character.
105
105
  attr_reader :message
106
106
 
107
- # @param name [String] The YARD identifier, eg +#some_message+.
107
+ # @param name [String] The YARD identifier, eg `#some_message`.
108
108
  def initialize(name)
109
109
  @name = name
110
110
  @message = name[1..-1]
@@ -116,22 +116,22 @@ module YardTypes
116
116
  end
117
117
 
118
118
  # @param (see Type#check)
119
- # @return [Boolean] +true+ if the object responds to +message+.
119
+ # @return [Boolean] `true` if the object responds to `message`.
120
120
  def check(obj)
121
121
  obj.respond_to? message
122
122
  end
123
123
  end
124
124
 
125
- # A {KindType} constraint is specified as +SomeModule+ or
126
- # +SomeClass+, and indicates that the object must be a kind of that
125
+ # A {KindType} constraint is specified as `SomeModule` or
126
+ # `SomeClass`, and indicates that the object must be a kind of that
127
127
  # module.
128
128
  class KindType < Type
129
129
  # Type checks a given object. Special consideration is given to
130
- # the pseudo-class +Boolean+, which does not actually exist in Ruby,
131
- # but is commonly used to mean +TrueClass, FalseClass+.
130
+ # the pseudo-class `Boolean`, which does not actually exist in Ruby,
131
+ # but is commonly used to mean `TrueClass, FalseClass`.
132
132
  #
133
133
  # @param (see Type#check)
134
- # @return [Boolean] +true+ if +obj.kind_of?(constant)+.
134
+ # @return [Boolean] `true` if `obj.kind_of?(constant)`.
135
135
  def check(obj)
136
136
  if name == 'Boolean'
137
137
  obj == true || obj == false
@@ -145,7 +145,7 @@ module YardTypes
145
145
  name
146
146
  end
147
147
 
148
- # @return [Module] the constant specified by +name+.
148
+ # @return [Module] the constant specified by `name`.
149
149
  # @raise [TypeError] if the constant is neither a module nor a class
150
150
  # @raise [NameError] if the specified constant could not be loaded.
151
151
  def constant
@@ -165,14 +165,14 @@ module YardTypes
165
165
  end
166
166
 
167
167
  # A {LiteralType} constraint is specified by the name of one of YARD's
168
- # supported "literals": +true+, +false+, +nil+, +void+, and +self+, and
168
+ # supported "literals": `true`, `false`, `nil`, `void`, and `self`, and
169
169
  # indicates that the object must be exactly one of those values.
170
170
  #
171
- # However, +void+ and +self+ have no particular meaning: +void+ is typically
171
+ # However, `void` and `self` have no particular meaning: `void` is typically
172
172
  # used solely to specify that a method returns no meaningful types; and
173
- # +self+ is used to specify that a method returns its receiver, generally
173
+ # `self` is used to specify that a method returns its receiver, generally
174
174
  # to indicate that calls can be chained. All values type check as valid
175
- # objects for +void+ and +self+ literals.
175
+ # objects for `void` and `self` literals.
176
176
  class LiteralType < Type
177
177
  # @return [Array<String>] the list of supported literal identifiers.
178
178
  def self.names
@@ -185,9 +185,9 @@ module YardTypes
185
185
  end
186
186
 
187
187
  # @param (see Type#check)
188
- # @return [Boolean] +true+ if the object is exactly +true+, +false+, or
189
- # +nil+ (depending on the value of +name+); for +void+ and +self+
190
- # types, this method *always* returns +true+.
188
+ # @return [Boolean] `true` if the object is exactly `true`, `false`, or
189
+ # `nil` (depending on the value of `name`); for `void` and `self`
190
+ # types, this method *always* returns `true`.
191
191
  # @raise [NotImplementedError] if an unsupported literal name is to be
192
192
  # tested against.
193
193
  def check(obj)
@@ -201,12 +201,12 @@ module YardTypes
201
201
  end
202
202
  end
203
203
 
204
- # A {CollectionType} is specified with the syntax +Kind<Some, #thing>+, and
205
- # indicates that the object is a kind of +Kind+, containing only objects which
206
- # type check against +Some+ or +#thing+.
204
+ # A {CollectionType} is specified with the syntax `Kind<Some, #thing>`, and
205
+ # indicates that the object is a kind of `Kind`, containing only objects which
206
+ # type check against `Some` or `#thing`.
207
207
  #
208
208
  # @todo The current implementation of type checking here requires that the collection
209
- # respond to +all?+; this may not be ideal.
209
+ # respond to `all?`; this may not be ideal.
210
210
  class CollectionType < Type
211
211
  include OrList
212
212
 
@@ -233,8 +233,8 @@ module YardTypes
233
233
  end
234
234
 
235
235
  # @param (see Type#check)
236
- # @return [Boolean] +true+ if the object is both a kind of +name+, and all of
237
- # its contents (if any) are of the types in +types+. Any combination, order,
236
+ # @return [Boolean] `true` if the object is both a kind of `name`, and all of
237
+ # its contents (if any) are of the types in `types`. Any combination, order,
238
238
  # and count of content types is acceptable.
239
239
  def check(obj)
240
240
  return false unless KindType.new(name).check(obj)
@@ -246,12 +246,12 @@ module YardTypes
246
246
  end
247
247
  end
248
248
 
249
- # A {TupleType} is specified with the syntax +(Some, Types, #here)+, and indicates
249
+ # A {TupleType} is specified with the syntax `(Some, Types, #here)`, and indicates
250
250
  # that the contents of the collection must be exactly that size, and each element
251
251
  # must be of the exact type specified for that index.
252
252
  #
253
253
  # @todo The current implementation of type checking here requires that the collection
254
- # respond to both +length+ and +[]+; this may not be ideal.
254
+ # respond to both `length` and `[]`; this may not be ideal.
255
255
  class TupleType < CollectionType
256
256
  def initialize(name, types)
257
257
  @name = name == '<generic-tuple>' ? nil : name
@@ -272,9 +272,9 @@ module YardTypes
272
272
  end
273
273
 
274
274
  # @param (see Type#check)
275
- # @return [Boolean] +true+ if the collection's +length+ is exactly the length of
276
- # the expected +types+, and each element with the collection is of the type
277
- # specified for that index by +types+.
275
+ # @return [Boolean] `true` if the collection's `length` is exactly the length of
276
+ # the expected `types`, and each element with the collection is of the type
277
+ # specified for that index by `types`.
278
278
  def check(obj)
279
279
  return false unless name.nil? || KindType.new(name).check(obj)
280
280
  return false unless obj.respond_to?(:length) && obj.respond_to?(:[])
@@ -287,20 +287,20 @@ module YardTypes
287
287
  end
288
288
  end
289
289
 
290
- # A {HashType} is specified with the syntax +{KeyType =>
291
- # ValueType}+, and indicates that all keys in the hash must be of
292
- # type +KeyType+, and all values must be of type +ValueType+.
290
+ # A {HashType} is specified with the syntax `{KeyType => ValueType}`,
291
+ # and indicates that all keys in the hash must be of type
292
+ # `KeyType`, and all values must be of type `ValueType`.
293
293
  #
294
- # An alternate syntax for {HashType} is also available as +Hash<A,
295
- # B>+, but its usage is not recommended; it is less capable than the
296
- # +{A => B}+ syntax, as some inner type constraints can not be
294
+ # An alternate syntax for {HashType} is also available as `Hash<A, B>`,
295
+ # but its usage is not recommended; it is less capable than the
296
+ # `{A => B}` syntax, as some inner type constraints can not be
297
297
  # parsed reliably.
298
298
  #
299
299
  # A {HashType} actually only requires that the object respond to
300
- # both +keys+ and +values+; it should be capable of type checking
300
+ # both `keys` and `values`; it should be capable of type checking
301
301
  # any object which conforms to that interface.
302
302
  #
303
- # @todo Enforce kind, eg +HashWithIndifferentAccess{#to_sym => Array}+,
303
+ # @todo Enforce kind, eg `HashWithIndifferentAccess{#to_sym => Array}`,
304
304
  # in case you _really_ care that it's indifferent. Maybe?
305
305
  class HashType < Type
306
306
  include OrList
@@ -321,7 +321,7 @@ module YardTypes
321
321
  end
322
322
 
323
323
  # Unlike the other types, {HashType} can result from two alternate syntaxes;
324
- # however, this method will *only* return the +{A => B}+ syntax.
324
+ # however, this method will *only* return the `{A => B}` syntax.
325
325
  #
326
326
  # @return (see Type#to_s)
327
327
  def to_s
@@ -340,9 +340,9 @@ module YardTypes
340
340
  end
341
341
 
342
342
  # @param (see Type#check)
343
- # @return [Boolean] +true+ if the object responds to both +keys+ and +values+,
344
- # and every key type checks against a type in +key_types+, and every value
345
- # type checks against a type in +value_types+.
343
+ # @return [Boolean] `true` if the object responds to both `keys` and `values`,
344
+ # and every key type checks against a type in `key_types`, and every value
345
+ # type checks against a type in `value_types`.
346
346
  def check(obj)
347
347
  return false unless obj.respond_to?(:keys) && obj.respond_to?(:values)
348
348
  obj.keys.all? { |key| key_types.any? { |t| t.check(key) } } &&
@@ -1,3 +1,3 @@
1
1
  module YardTypes
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -4,7 +4,7 @@ require 'set'
4
4
  describe YardTypes, 'type checking' do
5
5
  matcher :type_check do |obj|
6
6
  match do |type|
7
- result = YardTypes.validate(type, obj)
7
+ result = YardTypes.check(type, obj)
8
8
  result.success?
9
9
  end
10
10
 
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Kyle Hargraves"]
10
10
  spec.email = ["pd@krh.me"]
11
11
  spec.summary = %q{Parse and validate objects against YARD type descriptions.}
12
- spec.description = %q{Your API docs say you return Array<#to_date>, but do you really?}
12
+ spec.description = %q{Your API docs say you return an Array of Result objects, but do you really?}
13
13
  spec.homepage = "https://github.com/pd/yard_types"
14
14
  spec.license = "MIT"
15
15
 
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "simplecov", "~> 0.7.1"
25
25
  spec.add_development_dependency "pry", "> 0"
26
26
  spec.add_development_dependency "coveralls", "> 0"
27
+ spec.add_development_dependency "yard", "~> 0.8"
27
28
  end
metadata CHANGED
@@ -1,121 +1,123 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yard_types
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Kyle Hargraves
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-11-20 00:00:00.000000000 Z
11
+ date: 2014-11-21 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.5'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.5'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: '10.0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: '10.0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
47
  version: '3.0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
54
  version: '3.0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: simplecov
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
61
  version: 0.7.1
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
68
  version: 0.7.1
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: pry
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>'
73
+ - - ">"
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>'
80
+ - - ">"
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: coveralls
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>'
87
+ - - ">"
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>'
94
+ - - ">"
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
- description: Your API docs say you return Array<#to_date>, but do you really?
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.8'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.8'
111
+ description: Your API docs say you return an Array of Result objects, but do you really?
111
112
  email:
112
113
  - pd@krh.me
113
114
  executables: []
114
115
  extensions: []
115
116
  extra_rdoc_files: []
116
117
  files:
117
- - .gitignore
118
- - .travis.yml
118
+ - ".gitignore"
119
+ - ".travis.yml"
120
+ - ".yardopts"
119
121
  - Gemfile
120
122
  - LICENSE.txt
121
123
  - README.md
@@ -133,33 +135,26 @@ files:
133
135
  homepage: https://github.com/pd/yard_types
134
136
  licenses:
135
137
  - MIT
138
+ metadata: {}
136
139
  post_install_message:
137
140
  rdoc_options: []
138
141
  require_paths:
139
142
  - lib
140
143
  required_ruby_version: !ruby/object:Gem::Requirement
141
- none: false
142
144
  requirements:
143
- - - ! '>='
145
+ - - ">="
144
146
  - !ruby/object:Gem::Version
145
147
  version: '0'
146
- segments:
147
- - 0
148
- hash: 1195132354547834267
149
148
  required_rubygems_version: !ruby/object:Gem::Requirement
150
- none: false
151
149
  requirements:
152
- - - ! '>='
150
+ - - ">="
153
151
  - !ruby/object:Gem::Version
154
152
  version: '0'
155
- segments:
156
- - 0
157
- hash: 1195132354547834267
158
153
  requirements: []
159
154
  rubyforge_project:
160
- rubygems_version: 1.8.23.2
155
+ rubygems_version: 2.2.2
161
156
  signing_key:
162
- specification_version: 3
157
+ specification_version: 4
163
158
  summary: Parse and validate objects against YARD type descriptions.
164
159
  test_files:
165
160
  - spec/errors_spec.rb
@@ -167,3 +162,4 @@ test_files:
167
162
  - spec/spec_helper.rb
168
163
  - spec/type_checking_spec.rb
169
164
  - spec/types_spec.rb
165
+ has_rdoc: