typespec 0.0.0.0 → 0.1.0.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 (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -4
  3. data/lib/typespec.rb +179 -0
  4. data/lib/typespec/gem.rb +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 053cefb1c4de028a2d651f0af8680542f7a1cf68
4
- data.tar.gz: 0175bebfa51927432371af08b47ef587afefa8da
3
+ metadata.gz: 89735c9c1f915fb52dcbbf55eb6d01875b4edac2
4
+ data.tar.gz: 63067969f72f7b18b3b129e58c78c128f025f36b
5
5
  SHA512:
6
- metadata.gz: 108f33607e4f9b542ae474a88ec96dc35fd5ec8dec1dcfbf6674af45e9f031ca57717f9b8d200784181dce28194356bd72ee0476169bd91f778b6065105285f0
7
- data.tar.gz: be222fb1d2ada94fddf77c75b7a02517e14ebf0c1cde2f7a36160cbbaf1f7e9875b46a13c4f377211f33a10745753d340a0bc382e01f58b672884fdca9ac6552
6
+ metadata.gz: b7414951bc78d23b602e6b5cabf7328c7da83bf72268f28fb824643aec3de3efb17f6425e415668b4284bc2629022f7355960e72fc70f8b224cbed5948f4d50d
7
+ data.tar.gz: 1b12cb00d9639a1ace0e92b16e71b7b8ed6a49c587b1e580b4f2fd4d7adac9acdb844f742e5d2fd31ec1b75580c2a23e5fa78332f334f6201fed56c969e37fdf
data/README.md CHANGED
@@ -8,8 +8,29 @@
8
8
  :nut_and_bolt: Specify complex schema made of types or specific values.
9
9
 
10
10
  ```Ruby
11
- Typespec.hash[Typespec.string => Typespec.or[Typespec.nothing,
12
- Typespec.boolean,
13
- Typespec.number,
14
- Typespec.string]]
11
+ module Defines
12
+ def self.typespec
13
+ Typespec.hash[Typespec.string => Typespec.or[Typespec.nothing,
14
+ Typespec.boolean,
15
+ Typespec.number,
16
+ Typespec.string]]
17
+ end
18
+ end
19
+
20
+ Defines.typespec.matches?('YETI_LINKAGE' => 'YETI_LINKAGE_STATIC',
21
+ '__YETI_IS_BEING_COMPILED__' => true,
22
+ 'YETI_CONFIGURATION' => 'YETI_CONFIGURATION_DEBUG',
23
+ '_HAS_EXCEPTIONS' => false,
24
+ '_SCL_SECURE_NO_WARNINGS' => true,
25
+ '_CRT_SECURE_NO_WARNINGS' => true,
26
+ '_CRT_SECURE_NO_DEPRECATE' => true,
27
+ '_SECURE_SCL_THROWS' => false,
28
+ '_SILENCE_DEPRECATION_OF_SECURE_SCL_THROWS' => true,
29
+ '_USING_V110_SDK71_' => true,
30
+ '_DEBUG' => true,
31
+ '_HAS_ITERATOR_DEBUGGING' => true,
32
+ '_SECURE_SCL' => true)
33
+
34
+ #=> true
15
35
  ```
36
+
data/lib/typespec.rb CHANGED
@@ -1,2 +1,181 @@
1
+ # ...
1
2
  module Typespec
3
+ # TODO(mtwilliams): Perform sanity checks.
4
+ # TODO(mtwilliams): Raise (custom) exceptions.
5
+ # TODO(mtwilliams): Explain the Type-Value-Or sysem.
6
+ # TODO(mtwilliams): Provide an example on how to rewrite exceptions.
7
+ # TODO(mtwilliams): Document this monstrosity.
8
+
9
+ # ...
10
+ def self.any; Typespec::Any; end
11
+
12
+ # ...
13
+ class Any
14
+ def self.valid?(_); true; end
15
+ end
16
+
17
+ # ...
18
+ def self.t; Typespec::Type; end
19
+
20
+ # ...
21
+ class Type
22
+ def initialize(type); @type = type; end
23
+ def self.[](type); self.new(type); end
24
+ def valid?(value); value.is_a?(@type); end
25
+ end
26
+
27
+ # ...
28
+ def self.expects; Typespec::Value; end
29
+
30
+ # ...
31
+ class Value
32
+ def initialize(value); @value = value; end
33
+ def self.[](value); self.new(value); end
34
+ def valid?(value) value.eql?(@value); end
35
+ end
36
+
37
+ # ...
38
+ def self.or; Typespec::Or; end
39
+
40
+ # ...
41
+ class Or
42
+ def initialize(expects); @expects = [*expects]; end
43
+ def valid?(value); @expects.any?{|expects| expects.valid?(value)}; end
44
+ end
45
+
46
+ # ...
47
+ def self.nil; Typespec.t[NilClass]; end
48
+
49
+ # ...
50
+ def self.boolean; Typespec.or[Typespec.t[TrueClass], Typespec.t[FalseClass]]; end
51
+
52
+ # ...
53
+ def self.number; Typespec.t[Numeric]; end
54
+
55
+ # ...
56
+ def self.integer; Typespec.t[Integer]; end
57
+
58
+ # ...
59
+ def self.float; Typespec.t[Float]; end
60
+
61
+ # ...
62
+ def self.rational; Typespec.t[Rational]; end
63
+
64
+ # ...
65
+ def self.string; Typespec.t[String]; end
66
+
67
+ # ...
68
+ def self.symbol; Typespec.t[Symbol]; end
69
+
70
+ # ...
71
+ def self.array; Typespec::Array; end
72
+
73
+ # ...
74
+ class Array
75
+ def initialize(*elements)
76
+ @element = Typespec.or[*elements]
77
+ end
78
+
79
+ def self.[](*elements)
80
+ Typespec::Array.new(*elements)
81
+ end
82
+
83
+ def valid?(value)
84
+ if value.is_a? Array
85
+ value.all?{|element| @element.valid?(element)}
86
+ else
87
+ false
88
+ end
89
+ end
90
+ end
91
+
92
+ # ...
93
+ def self.hash; Typespec::Hash; end
94
+
95
+ # ...
96
+ class Hash
97
+ def initialize(**pairs)
98
+ @pairs = pairs
99
+ @pairs ||= {Typespec.any => Typespec.any}
100
+ end
101
+
102
+ def self.[](**pairs)
103
+ Typespec::Hash.new(**pairs)
104
+ end
105
+
106
+ def valid?(value)
107
+ if value.is_a? Hash
108
+ value.all? do |k, v|
109
+ @pairs.any? do |pair|
110
+ pair.zip([k,v]).all? {|typespec, value| typespec.valid?(value)}
111
+ end
112
+ end
113
+ else
114
+ false
115
+ end
116
+ end
117
+ end
118
+
119
+ # ...
120
+ def self.struct; Typespec::Struct; end
121
+
122
+ # ...
123
+ class Struct
124
+ def initialize(*properties, **properties_with_spec)
125
+ if !properties.empty?
126
+ @properties = Hash[properties.map{|name| [name, Typespec.any]}]
127
+ elsif properties_with_spec
128
+ @properties = properties_with_spec
129
+ else
130
+ @properties = {}
131
+ end
132
+ end
133
+
134
+ def self.[](*properties, **properties_with_spec)
135
+ Typespec::Struct.new(*properties, **properties_with_spec)
136
+ end
137
+
138
+ def valid?(struct, opts={})
139
+ if struct.instance_of? Object
140
+ ignore_if_not_in_spec = opts.fetch(:ignore_if_not_in_spec, false)
141
+ struct.instance_variables.all? do |property|
142
+ undecorated = property.to_s[1..-1].to_sym
143
+ if @properties.include?(undecorated)
144
+ value = struct.instance_variable_get(property)
145
+ @properties[undecorated].valid?(value)
146
+ else
147
+ ignore_if_not_in_spec
148
+ end
149
+ end
150
+ else
151
+ false
152
+ end
153
+ end
154
+ end
155
+
156
+ # ...
157
+ def self.object; Typespec::Object; end
158
+
159
+ # ...
160
+ class Object < Struct
161
+ def self.[](*properties, **properties_with_spec)
162
+ Typespec::Object.new(*properties, **properties_with_spec)
163
+ end
164
+
165
+ def valid?(object, opts={})
166
+ super(object, opts.merge({:ignore_if_not_in_spec => true}))
167
+ end
168
+ end
169
+
170
+ # ...
171
+ def self.enum; Typespec::Enum; end
172
+
173
+ # ...
174
+ class Enum
175
+ def initialize(*can_take_on) @can_take_on = [*can_take_on] end
176
+ def self.[](*can_take_on); Typespec::Enum.new(can_take_on); end
177
+ def valid?(can_take_on) can_take_on.include?(@can_take_on); end
178
+ end
2
179
  end
180
+
181
+
data/lib/typespec/gem.rb CHANGED
@@ -41,7 +41,7 @@ module Typespec
41
41
  end
42
42
 
43
43
  module VERSION #:nodoc:
44
- MAJOR, MINOR, PATCH, PRE = [0, 0, 0, 0]
44
+ MAJOR, MINOR, PATCH, PRE = [0, 1, 0, 0]
45
45
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
46
46
  end
47
47
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typespec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.0
4
+ version: 0.1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-09 00:00:00.000000000 Z
11
+ date: 2015-11-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Typespec is a way to specify complex schema made of types or specific
14
14
  values and validate against them.