oval 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,8 +10,8 @@ TARGET=`mktemp -d`
10
10
 
11
11
  function do_build_module {
12
12
  tag=$1
13
- tgz="$TARGET/ptomulik-repos-${tag}.tar.gz"
14
- dir="ptomulik-repos-$tag/"
13
+ tgz="$TARGET/ptomulik-oval-${tag}.tar.gz"
14
+ dir="ptomulik-oval-$tag/"
15
15
  git archive --prefix $dir --output $tgz $tag
16
16
  (cd $TARGET && tar -xzf $tgz && cd $TARGET/$dir && puppet module build)
17
17
  }
data/.travis.yml CHANGED
@@ -8,15 +8,5 @@ script: "bundle exec rake spec SPEC_OPTS='--format documentation'"
8
8
  branches:
9
9
  only:
10
10
  master
11
- env:
12
- matrix:
13
- - FACTER_GEM_VERSION="~> 1.3.0"
14
- - FACTER_GEM_VERSION="~> 1.5.0"
15
- - FACTER_GEM_VERSION="~> 1.6.0"
16
- - FACTER_GEM_VERSION="~> 1.7.0"
17
- #matrix:
18
- # exclude:
19
- # - rvm: 2.0.0
20
- # env: FACTER_GEM_VERSION="~> 2.7.0"
21
11
  notifications:
22
12
  email: false
data/CHANGELOG CHANGED
@@ -1,2 +1,12 @@
1
- 2014-01-30 Pawel Tomulik <ptomulik@meil.pw.edu.pl>
1
+ 2014-02-02 Pawel Tomulik <ptomulik@meil.pw.edu.pl>
2
+ * release 0.0.2
3
+ * fixed Modulefile
4
+ * release 0.0.1
5
+ * added note to README.md
6
+ * corrected typos in README.md
7
+ * fixed .travis.yml to reduce matrix size
8
+ * fixed coveralls badge
9
+ * fixed some specs for ruby 2.0
10
+ * removed dead code from lib/oval/collection.rb
11
+ * fixed build-puppet-module script
2
12
  * initial commit
data/Modulefile CHANGED
@@ -1,8 +1,8 @@
1
- name 'ptomulik-options_validator'
2
- version '0.0.1'
3
- source 'git://github.com/ptomulik/puppet-options_validator.git'
1
+ name 'ptomulik-oval'
2
+ version '0.0.2'
3
+ source 'git://github.com/ptomulik/rubygems-oval.git'
4
4
  author 'ptomulik'
5
5
  license 'Apache License, Version 2.0'
6
6
  summary 'Simple utility to validate Hashes of options.'
7
7
  description 'Simple utility to validate Hashes of options.'
8
- project_page 'https://gitbub.com/ptomulik/puppet-options_validator'
8
+ project_page 'https://gitbub.com/ptomulik/rubygems-oval'
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  #Oval - Options Validator
2
2
 
3
3
  [![Build Status](https://travis-ci.org/ptomulik/rubygems-oval.png?branch=master)](https://travis-ci.org/ptomulik/rubygems-oval)
4
- [![Coverage Status](https://coveralls.io/options_validator/ptomulik/rubygems-oval/badge.png)](https://coveralls.io/r/ptomulik/rubygems-oval)
4
+ [![Coverage Status](https://coveralls.io/repos/ptomulik/rubygems-oval/badge.png?branch=master)](https://coveralls.io/r/ptomulik/rubygems-oval?branch=master)
5
5
  [![Code Climate](https://codeclimate.com/github/ptomulik/rubygems-oval.png)](https://codeclimate.com/github/ptomulik/rubygems-oval)
6
6
 
7
7
  ####<a id="table-of-contents"></a>Table of Contents
@@ -24,24 +24,42 @@ Validate option hashes when passed to methods.
24
24
 
25
25
  ##<a id="module-description"></a>Module Description
26
26
 
27
- Using hashes to pass options to methods is a very common ruby practice. With **Oval** method authors may restrict callers to pass only declared options that meet requirements described in a hash declaration.
27
+ Using hashes to pass options to methods is a very common ruby practice. With
28
+ **Oval** method authors may restrict callers to pass only declared options that
29
+ meet requirements described in a hash declaration.
28
30
 
29
- The shape of acceptable hashes is described by a simple grammar. The validation is then carried out by a recursive-descent parser that matches the actual values provided by caller against [declarators](#declarators) that comprise the hash declaration.
31
+ The shape of acceptable hashes is described by a simple grammar. The validation
32
+ is then carried out by a recursive-descent parser that matches the actual
33
+ values provided by caller against [declarators](#declarators) that comprise the
34
+ hash declaration.
30
35
 
31
- A declaration consists of terminal and non-terminal declarators. Non-terminal declarators are created by methods of `Oval` module which have names starting with `ov_` prefix. All other values (such as `:symbol`, `'string'`, `nil`, or `Class`) are terminals. Terminals use `==` operator to match the values provided by caller. Non-teminal use its own logic introducing more elaborate matching criteria (see for example [ov_collection](#ov_collection)).
36
+ A declaration consists of terminal and non-terminal declarators. Non-terminal
37
+ declarators are created by methods of `Oval` module which have names starting
38
+ with `ov_` prefix. All other values (such as `:symbol`, `'string'`, `nil`, or
39
+ `Class`) are terminals. Terminals use `==` operator to match the values
40
+ provided by caller. Non-terminal use its own logic introducing more elaborate
41
+ matching criteria (see for example [ov_collection](#ov_collection)).
32
42
 
33
- **Oval** raises **Oval::DeclError** if the declaration is not well-formed, that is if the description of options shape is erronrneous. This is raised from the point of declaration. Other, more common exception is the **Oval::ValueError** which is raised everytime validation fails. This one is raised from within a method which takes the options as an argument.
43
+ **Oval** raises **Oval::DeclError** if the declaration is not well-formed, that
44
+ is if the description of options shape is erroneous. This is raised from the
45
+ point of declaration. Other, more common exception is the **Oval::ValueError**
46
+ which is raised each time the validation fails. This one is raised from within
47
+ a method which takes the options as an argument.
34
48
 
35
49
  [[Table of Contents](#table-of-contents)]
36
50
 
37
51
  ##<a id="usage"></a>Usage
38
52
 
39
- The usage is basically a two-step procedure. The first step is to declare options shape. This would create a validator object. The second step is to validate options within a method using the previously constructed validator. For simple hashes the entire construction may fit to a single line. Let's start with such a simple example.
53
+ The usage is basically a two-step procedure. The first step is to declare
54
+ options shape. This would create a validator object. The second step is to
55
+ validate options within a method using the previously constructed validator.
56
+ For simple hashes the entire construction may fit to a single line. Let's start
57
+ with such a simple example.
40
58
 
41
59
  ###<a id="example-1-declaring-simple-options"></a>Example 1: Declaring Simple Options
42
60
 
43
61
  The method `foo` in the following code accepts only `{}` and `{:foo => value}`
44
- as `options`, where `value` is arbitrary:
62
+ as `ops`, where `value` is arbitrary:
45
63
 
46
64
  ```ruby
47
65
  # Options validator
@@ -62,14 +80,26 @@ C.foo :foo => 10 # should pass
62
80
  C.foo :foo => 10, :bar => 20 # Oval::ValueError "Invalid option :bar for ops. Allowed options are :foo"
63
81
  ```
64
82
 
65
- Options are declared with [ov_xxx declarators](#declarators). The [ov_options](#ov_options) method should always be at the top level. Then all the allowed options should be listed inside of `[]` square brackets. Keys may be any values convertible to strings (i.e. a key given in declaration must `respond_to? :to_s`). Values are declared recursivelly using [ov_xxx declarators](#declarators) or terminal declarators (any other ruby values).
66
-
67
- In [Example 1](#example-1-declaring-simple-options) we have declared options inside of a method for simplicity. This isn't an optimal technique. Usually options' declaration remains same for the entire lifetime of an application, so it is unnecessary to recreate the declaration each time function is called. In other words, we should move the declaration outside of the method, convert it to a singleton and only validate options inside of a function. For that purpose, t
68
- he [Example 1](#example-1-declaring-simple-options) could be modified to the following form
83
+ Options are declared with [ov_xxx declarators](#declarators). The
84
+ [ov_options](#ov_options) method should always be at the top level. Then all
85
+ the allowed options should be listed inside of `[]` square brackets. Keys may
86
+ be any values convertible to strings (i.e. a key given in declaration must
87
+ `respond_to? :to_s`). Values are declared recursively using [ov_xxx
88
+ declarators](#declarators) or terminal declarators (any other ruby values).
89
+
90
+ In [Example 1](#example-1-declaring-simple-options) we have declared options
91
+ inside of a method for simplicity. This isn't an optimal technique. Usually
92
+ options' declaration remains same for the entire lifetime of an application, so
93
+ it is unnecessary to recreate the declaration each time function is called. In
94
+ other words, we should move the declaration outside of the method, convert it
95
+ to a singleton and only validate options inside of a function. For that
96
+ purpose, the [Example 1](#example-1-declaring-simple-options) could be modified
97
+ to the following form
69
98
 
70
99
  ###<a id="example-2-separating-declaration-from-validation"></a>Example 2: Separating declaration from validation
71
100
 
72
- In this example we separate options declaration from the validation to reduce costs related to options declaration:
101
+ In this example we separate options declaration from the validation to reduce
102
+ costs related to options declaration:
73
103
 
74
104
  ```ruby
75
105
  # Options validator
@@ -93,19 +123,30 @@ end
93
123
 
94
124
  ###<a id="declarators"></a>Declarators
95
125
 
96
- A declaration of options consists entirely of what we call here **declarators**. The [ov_options](#ov_options) should be used as a root of every declaration (starting symbol in grammar terms). It accepts a Hash of the form **{optname => optdecl, ...}** as an argument. The **optname** is an option name, and **optdecl** is a declarator restricting the options's value. Each option name (key) must be convertible to a `String`. Option value declarators are non-terminal declarators (defined later in this section) or terminals (any other ruby values). The simple declaration
126
+ A declaration of options consists entirely of what we call here
127
+ **declarators**. The [ov_options](#ov_options) should be used as a root of
128
+ every declaration (starting symbol in grammar terms). It accepts a Hash of the
129
+ form **{optname => optdecl, ...}** as an argument. The **optname** is an option
130
+ name, and **optdecl** is a declarator restricting the option's value. Each
131
+ option name (key) must be convertible to a `String`. Option value declarators
132
+ are non-terminal declarators (defined later in this section) or terminals (any
133
+ other ruby values). The simple declaration
97
134
 
98
135
  ```ruby
99
136
  ov_options[ :foo => :bar ]
100
137
  ```
101
138
 
102
- uses only terminals inside of **ov_options** and literarly permits only the `{:foo => :bar}` or the empty hash `{}` as options (and nothing else). This is how terminal declarators (`:foo` and `:bar` in this example) work. More freedom may be introduced with non-terminal declarators, for example:
139
+ uses only terminals inside of **ov_options** and literary permits only the
140
+ `{:foo => :bar}` or the empty hash `{}` as options (and nothing else). This is
141
+ how terminal declarators (`:foo` and `:bar` in this example) work. More freedom
142
+ may be introduced with non-terminal declarators, for example:
103
143
 
104
144
  ```ruby
105
145
  ov_options[ :foo => ov_anything ]
106
146
  ```
107
147
 
108
- defines an option `:foo` which accepts any value. In what follows, we'll document all the core non-terminal declarators implemented in **Oval**.
148
+ defines an option `:foo` which accepts any value. In what follows, we'll
149
+ document all the core non-terminal declarators implemented in **Oval**.
109
150
 
110
151
  ####<a id="ov\_anything"></a>ov\_anything
111
152
 
@@ -140,13 +181,17 @@ defines an option `:foo` which accepts any value. In what follows, we'll documen
140
181
  ov_collection[ class_decl, item_decl ]
141
182
  ```
142
183
 
143
- - Validation - permits only collections of type **class_decl** with items matching **item_decl** declaration
184
+ - Validation - permits only collections of type **class_decl** with items
185
+ matching **item_decl** declaration
144
186
  - Allowed values for **class\_decl** are:
145
187
  - `Hash` or `Array` or any subclass of `Hash` or `Array`,
146
- - `ov_subclass_of[klass]` where **klass** is `Hash` or `Array` or a subclass of any of them.
188
+ - `ov_subclass_of[klass]` where **klass** is `Hash` or `Array` or a subclass
189
+ of any of them.
147
190
  - Allowed values for **item_decl**:
148
- - if **class\_decl** is `Array`-like, then any value is allowed as **item\_decl**,
149
- - if **class\_decl** is `Hash`-like, then **item\_decl** should be a one-element Hash in form **{ key\_decl => val\_decl }**.
191
+ - if **class\_decl** is `Array`-like, then any value is allowed as
192
+ **item\_decl**,
193
+ - if **class\_decl** is `Hash`-like, then **item\_decl** should be a
194
+ one-element Hash in form **{ key\_decl => val\_decl }**.
150
195
  - Example
151
196
 
152
197
  ```ruby
@@ -226,7 +271,8 @@ defines an option `:foo` which accepts any value. In what follows, we'll documen
226
271
  ```
227
272
 
228
273
  - Validation - permits only declared options and their values.
229
- - Allowed values for `optkey_declN` - anything that is convertible to string (namely, anything that responds to `to_s` method).
274
+ - Allowed values for `optkey_declN` - anything that is convertible to string
275
+ (namely, anything that responds to `to_s` method).
230
276
  - Example:
231
277
 
232
278
  ```ruby
@@ -277,4 +323,6 @@ The API documentation is also available
277
323
 
278
324
  ##Limitations
279
325
 
326
+ - API documentation is currently very poor,
327
+
280
328
  [[Table of Contents](#table-of-contents)]
@@ -17,7 +17,7 @@ class Oval::ArrayItem < Oval::Base
17
17
 
18
18
  attr_reader :item_decl
19
19
 
20
- protected
20
+ private
21
21
 
22
22
  def item_decl=(decl)
23
23
  @item_decl = decl
data/lib/oval/base.rb CHANGED
@@ -33,7 +33,7 @@ class Oval::Base
33
33
  def initialize(*args)
34
34
  end
35
35
 
36
- protected
36
+ private
37
37
 
38
38
  def self.for_subject(subject)
39
39
  subject ? " for #{subject}" : ""
@@ -9,7 +9,8 @@ class Oval::ClassDeclBase < Oval::Base
9
9
  self.klass = klass
10
10
  end
11
11
 
12
- protected
12
+ private
13
+
13
14
  def klass=(k)
14
15
  validate_class(k)
15
16
  @klass = k
@@ -70,10 +70,9 @@ class Oval::Collection < Oval::Base
70
70
 
71
71
  attr_reader :class_decl
72
72
  attr_reader :item_decl
73
- attr_reader :class_validator
74
73
  attr_reader :item_validator
75
74
 
76
- protected
75
+ private
77
76
 
78
77
  def class_decl=(decl)
79
78
  self.class.validate_class_decl(decl)
@@ -89,19 +88,6 @@ class Oval::Collection < Oval::Base
89
88
  @item_validator = select_item_validator[item_decl]
90
89
  end
91
90
 
92
- def select_class_validator
93
- if klass.is_a?(Class) and klass <= Hash
94
- Oval::HashClass
95
- elsif klass.is_a?(Class) and klass <= Array
96
- Oval::ArrayClass
97
- else
98
- # well, we also may have klass that is not a class, but I'm too lazy to
99
- # handle all possible exceptions,
100
- raise RuntimeError, "Invalid class #{klass.inspect} assigned to klass. " +
101
- "It seems like we have a bug in #{self.class.name}"
102
- end
103
- end
104
-
105
91
  def select_item_validator
106
92
  if klass.is_a?(Class) and klass <= Hash
107
93
  Oval::HashItem
data/lib/oval/options.rb CHANGED
@@ -16,7 +16,7 @@ class Oval::Options < Oval::Base
16
16
 
17
17
  attr_reader :decl
18
18
 
19
- protected
19
+ private
20
20
 
21
21
  def decl=(decl)
22
22
  self.class.validate_decl(decl)
data/oval.gemspec CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.name = 'oval'
6
- gem.version = '0.0.1'
6
+ gem.version = '0.0.2'
7
7
  gem.authors = ["Pawel Tomulik"]
8
8
  gem.email = ["ptomulik@meil.pw.edu.pl"]
9
9
  gem.description = %q{Validate options when passed to methods}
@@ -18,8 +18,6 @@ describe Oval::Base do
18
18
  let(:subject) { described_class[:shape0] }
19
19
  [
20
20
  :validate,
21
- :for_subject,
22
- :enumerate,
23
21
  ].each do |method|
24
22
  it { should respond_to method }
25
23
  end
@@ -15,9 +15,7 @@ describe Oval::ClassDeclBase do
15
15
  before { described_class.any_instance.stubs(:validate_class) }
16
16
  it { should be_kind_of Oval::Base }
17
17
  [
18
- :validate_class,
19
18
  :klass,
20
- :klass=,
21
19
  ].each do |method|
22
20
  it { should respond_to method }
23
21
  end
@@ -5,13 +5,6 @@ require 'oval/instance_of'
5
5
  require 'oval/kind_of'
6
6
 
7
7
  describe Oval::Collection do
8
- ## Anything = Oval::Anything
9
- ## SubclassOf = Oval::SubclassOf
10
- ## InstanceOf = Oval::InstanceOf
11
- ## KindOf = Oval::KindOf
12
- ## OneOf = Oval::OneOf
13
- ## DeclError = Oval::DeclError
14
- ## ValueError = Oval::ValueError
15
8
  describe 'the class' do
16
9
  it { described_class.should respond_to :[] }
17
10
  it { described_class.should respond_to :new }
@@ -21,10 +14,7 @@ describe Oval::Collection do
21
14
  let(:subject) { described_class[Array,nil] }
22
15
  it { should respond_to :validate }
23
16
  it { should respond_to :class_decl }
24
- it { should respond_to :class_decl= }
25
17
  it { should respond_to :item_decl }
26
- it { should respond_to :item_decl= }
27
- it { should respond_to :select_item_validator }
28
18
  end
29
19
 
30
20
  describe "[]" do
@@ -16,9 +16,9 @@ describe Oval::Options do
16
16
  before { described_class.stubs(:validate_decl).once.with(:decl0) }
17
17
  [
18
18
  :validate,
19
- :validate_option,
20
- :validate_option_name,
21
- :validate_option_value,
19
+ # :validate_option,
20
+ # :validate_option_name,
21
+ # :validate_option_value,
22
22
  ].each do |method|
23
23
  it { should respond_to method }
24
24
  end
@@ -151,11 +151,11 @@ describe Oval::Options do
151
151
 
152
152
  describe "#validate_decl" do
153
153
  context "validate_decl({:foo => :F, :bar => 4})" do
154
- it { expect { described_class.validate_decl({:foo => :F, :bar => 4}) }.to_not raise_error }
154
+ it { expect { described_class.send(:validate_decl,{:foo => :F, :bar => 4}) }.to_not raise_error }
155
155
  end
156
156
  context "validate_decl(:decl1)" do
157
157
  let(:msg) { "Invalid declaration :decl1 of type Symbol. Should be a Hash" }
158
- it { expect { described_class.validate_decl(:decl1) }.to raise_error Oval::DeclError, msg }
158
+ it { expect { described_class.send(:validate_decl,:decl1) }.to raise_error Oval::DeclError, msg }
159
159
  end
160
160
  [
161
161
  {},
@@ -167,7 +167,7 @@ describe Oval::Options do
167
167
  let(:decl) { decl }
168
168
  before { decl.keys.each {|key| described_class.expects(:validate_option_name_decl).once.with(key) } }
169
169
  it "calls validate_option_name_decl(key) once for each key from #{decl.inspect} " do
170
- expect { described_class.validate_decl(decl) }.to_not raise_error
170
+ expect { described_class.send(:validate_decl,decl) }.to_not raise_error
171
171
  end
172
172
  end
173
173
  end
@@ -177,7 +177,7 @@ describe Oval::Options do
177
177
  [ :one, 'two', 3 ].each do |decl|
178
178
  context "validate_option_name_decl(#{decl.inspect})" do
179
179
  let(:decl) { decl }
180
- it { expect { described_class.validate_option_name_decl(decl) }.to_not raise_error }
180
+ it { expect { described_class.send(:validate_option_name_decl,decl) }.to_not raise_error }
181
181
  end
182
182
  end
183
183
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oval
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -37,7 +37,7 @@ files:
37
37
  - .fixtures.yml
38
38
  - .gitignore
39
39
  - .rspec
40
- - .scripts/build-module.sh
40
+ - .scripts/build-puppet-module.sh
41
41
  - .travis.yml
42
42
  - .yardopts
43
43
  - CHANGELOG
@@ -88,7 +88,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
88
88
  version: '0'
89
89
  segments:
90
90
  - 0
91
- hash: 2694836225048202330
91
+ hash: 2044800399727504758
92
92
  required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  none: false
94
94
  requirements:
@@ -97,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
97
  version: '0'
98
98
  segments:
99
99
  - 0
100
- hash: 2694836225048202330
100
+ hash: 2044800399727504758
101
101
  requirements: []
102
102
  rubyforge_project:
103
103
  rubygems_version: 1.8.23