interrogative 0.1.2 → 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.
- data/VERSION +1 -1
- data/interrogative.gemspec +2 -2
- data/lib/interrogative.rb +65 -28
- data/test/interrogative_test.rb +71 -5
- metadata +17 -17
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/interrogative.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "interrogative"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Adam Lloyd"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-05-10"
|
13
13
|
s.description = " A simple interface for keeping track of HTML-form-like questions without \n feeling like you're accomodating HTML forms.\n"
|
14
14
|
s.email = "alloyd@jibe.com"
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/interrogative.rb
CHANGED
@@ -2,41 +2,78 @@ require 'interrogative/question'
|
|
2
2
|
|
3
3
|
# A mixin for curious classes.
|
4
4
|
module Interrogative
|
5
|
-
# Get the array of all noted questions.
|
6
|
-
#
|
7
|
-
# @return [Array<Question>] array of all noted questions.
|
8
|
-
def questions; @_questions; end
|
9
5
|
|
10
|
-
#
|
6
|
+
# Methods applicable on both the class and instance levels.
|
7
|
+
module BaseMethods
|
8
|
+
# Give instructions for dealing with new questions.
|
9
|
+
#
|
10
|
+
# @param [Proc] postprocessor a block to run after adding a question;
|
11
|
+
# the question is given as the argument.
|
12
|
+
def when_questioned(&postprocessor)
|
13
|
+
(@_question_postprocessors||=[]) << postprocessor
|
14
|
+
end
|
15
|
+
|
16
|
+
# Give a new question.
|
17
|
+
#
|
18
|
+
# @param [Symbol, String] name the name (think <input name=...>) of
|
19
|
+
# the question.
|
20
|
+
# @param [String] label the text of the question (think <label>).
|
21
|
+
# @param [Hash] attrs additional attributes for the question.
|
22
|
+
# @option attrs [Boolean] :long whether the question has a long answer
|
23
|
+
# (think <textarea> vs <input>).
|
24
|
+
# @option attrs [Boolean] :multiple whether the question could have
|
25
|
+
# multiple answers.
|
26
|
+
# @return [Question] the new Question.
|
27
|
+
def question(name, text, attrs={})
|
28
|
+
q = Question.new(name, text, self, attrs)
|
29
|
+
(@_questions||=[]) << q
|
30
|
+
|
31
|
+
unless @_question_postprocessors.nil?
|
32
|
+
@_question_postprocessors.each do |postprocessor|
|
33
|
+
postprocessor.call(q)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
return q
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Methods tailored to the class level.
|
11
42
|
#
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
43
|
+
# These handle inheritance of questions.
|
44
|
+
module ClassMethods
|
45
|
+
include BaseMethods
|
46
|
+
|
47
|
+
# Get the array of all noted questions.
|
48
|
+
#
|
49
|
+
# @return [Array<Question>] array of all noted questions.
|
50
|
+
def questions
|
51
|
+
qs = []
|
52
|
+
qs |= superclass.questions if superclass.respond_to? :questions
|
53
|
+
qs |= (@_questions||=[])
|
54
|
+
qs
|
55
|
+
end
|
16
56
|
end
|
17
57
|
|
18
|
-
#
|
58
|
+
# Methods tailored to the instance level.
|
19
59
|
#
|
20
|
-
#
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
def question(name, text, attrs={})
|
30
|
-
q = Question.new(name, text, self, attrs)
|
31
|
-
(@_questions||=[]) << q
|
32
|
-
|
33
|
-
unless @_question_postprocessors.nil?
|
34
|
-
@_question_postprocessors.each do |postprocessor|
|
35
|
-
postprocessor.call(q)
|
36
|
-
end
|
60
|
+
# These handle getting questions from the class level.
|
61
|
+
module InstanceMethods
|
62
|
+
include BaseMethods
|
63
|
+
|
64
|
+
def questions
|
65
|
+
qs = []
|
66
|
+
qs |= self.class.questions if self.class.respond_to? :questions
|
67
|
+
qs |= (@_questions||=[])
|
68
|
+
qs
|
37
69
|
end
|
70
|
+
end
|
38
71
|
|
39
|
-
|
72
|
+
def self.included(base)
|
73
|
+
base.extend(Interrogative::ClassMethods)
|
74
|
+
base.instance_eval do
|
75
|
+
include Interrogative::InstanceMethods
|
76
|
+
end
|
40
77
|
end
|
41
78
|
end
|
42
79
|
|
data/test/interrogative_test.rb
CHANGED
@@ -1,11 +1,77 @@
|
|
1
1
|
require 'teststrap'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
class NoQuestionsTest
|
4
|
+
include Interrogative
|
5
|
+
end
|
6
|
+
|
7
|
+
class QuestionsTest
|
8
|
+
include Interrogative
|
9
|
+
|
10
|
+
question :has_questions, "Does this have questions?"
|
11
|
+
end
|
12
|
+
|
13
|
+
class SubclassWithNoQuestionsTest < QuestionsTest
|
14
|
+
end
|
15
|
+
|
16
|
+
class SubclassWithQuestionsTest < QuestionsTest
|
17
|
+
question :is_subclass, "Is this a subclass?"
|
18
|
+
end
|
19
|
+
|
20
|
+
context "class with no questions" do
|
21
|
+
setup { NoQuestionsTest }
|
22
|
+
|
23
|
+
asserts(:questions).kind_of Array
|
24
|
+
asserts(:questions).empty
|
25
|
+
end
|
26
|
+
|
27
|
+
context "class with one question" do
|
28
|
+
context "(class)" do
|
29
|
+
setup { QuestionsTest }
|
30
|
+
|
31
|
+
denies(:questions).empty
|
32
|
+
asserts(:questions).size(1)
|
6
33
|
end
|
7
34
|
|
8
|
-
|
9
|
-
|
35
|
+
context "(an instance)" do
|
36
|
+
setup { QuestionsTest.new }
|
37
|
+
|
38
|
+
denies(:questions).empty
|
39
|
+
asserts(:questions).size(1)
|
40
|
+
end
|
41
|
+
|
42
|
+
context "(an instance with a question of its own)" do
|
43
|
+
setup do
|
44
|
+
QuestionsTest.new.tap {|q| q.question :is_instance, "Is this an instance?" }
|
45
|
+
end
|
46
|
+
|
47
|
+
asserts(:questions).size(2)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "subclass with no questions of its own" do
|
52
|
+
setup { SubclassWithNoQuestionsTest }
|
53
|
+
|
54
|
+
denies(:questions).empty
|
55
|
+
end
|
56
|
+
|
57
|
+
context "subclass with a question of its own" do
|
58
|
+
setup { SubclassWithQuestionsTest }
|
59
|
+
|
60
|
+
denies(:questions).empty
|
61
|
+
asserts(:questions).size(2)
|
62
|
+
|
63
|
+
context "(instance)" do
|
64
|
+
setup { SubclassWithQuestionsTest.new }
|
65
|
+
|
66
|
+
denies(:questions).empty
|
67
|
+
asserts(:questions).size(2)
|
68
|
+
end
|
69
|
+
|
70
|
+
context "(instance with a question of its own)" do
|
71
|
+
setup do
|
72
|
+
SubclassWithQuestionsTest.new.tap {|i| i.question :is_instance, "Is this an instance?" }
|
73
|
+
end
|
74
|
+
|
75
|
+
asserts(:questions).size(3)
|
10
76
|
end
|
11
77
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interrogative
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-05-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70273680769440 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70273680769440
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: riot
|
27
|
-
requirement: &
|
27
|
+
requirement: &70273680785160 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70273680785160
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: yard
|
38
|
-
requirement: &
|
38
|
+
requirement: &70273680784220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0.7'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70273680784220
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rdoc
|
49
|
-
requirement: &
|
49
|
+
requirement: &70273680783100 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '3.12'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70273680783100
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: bundler
|
60
|
-
requirement: &
|
60
|
+
requirement: &70273680782080 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 1.0.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70273680782080
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: jeweler
|
71
|
-
requirement: &
|
71
|
+
requirement: &70273680780860 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 1.8.3
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70273680780860
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: redcarpet
|
82
|
-
requirement: &
|
82
|
+
requirement: &70273680779660 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70273680779660
|
91
91
|
description: ! " A simple interface for keeping track of HTML-form-like questions
|
92
92
|
without \n feeling like you're accomodating HTML forms.\n"
|
93
93
|
email: alloyd@jibe.com
|
@@ -125,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash:
|
128
|
+
hash: 3214481857536529281
|
129
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|