interrogative 0.3.0 → 0.4.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 CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "interrogative"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.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"]
data/lib/interrogative.rb CHANGED
@@ -17,32 +17,35 @@ module Interrogative
17
17
  #
18
18
  # Useful when you need to postprocess questions at a higher level.
19
19
  #
20
- # @param [Question] the Question.
20
+ # @param [Question] question the `Question`.
21
+ # @return [Question] the `Question`.
21
22
  def postprocess_question(question)
22
23
  unless @_question_postprocessors.nil?
23
24
  @_question_postprocessors.each do |postprocessor|
24
25
  postprocessor.call(question)
25
26
  end
26
27
  end
28
+ question
27
29
  end
28
30
 
29
31
  # Give a new question.
30
32
  #
31
- # @param [Symbol, String] name the name (think <input name=...>) of
33
+ # @param [Symbol, String] name the name (think \<input name=...>) of
32
34
  # the question.
33
- # @param [String] label the text of the question (think <label>).
35
+ # @param [String] label the text of the question (think \<label>).
34
36
  # @param [Hash] attrs additional attributes for the question.
35
37
  # @option attrs [Boolean] :long whether the question has a long answer
36
- # (think <textarea> vs <input>).
38
+ # (think \<textarea> vs \<input>).
37
39
  # @option attrs [Boolean] :multiple whether the question could have
38
40
  # multiple answers.
39
- # @return [Question] the new Question.
41
+ # @param [Proc] instance_block a block returning option values.
42
+ # @return [Question] the new `Question`.
43
+ # @see Question#options
40
44
  def question(name, text, attrs={}, &instance_block)
41
45
  q = Question.new(name, text, self, attrs, &instance_block)
42
46
  (@_questions||=[]) << q
43
47
 
44
48
  postprocess_question(q)
45
-
46
49
  return q
47
50
  end
48
51
  end
@@ -53,10 +56,10 @@ module Interrogative
53
56
  module ClassMethods
54
57
  include BaseMethods
55
58
 
56
- # Get the array of all noted questions.
59
+ # Get the array of all noted questions for this class and its superclasses.
57
60
  #
58
61
  # @return [Array<Question>] array of all noted questions.
59
- def questions(instance=nil)
62
+ def questions
60
63
  qs = []
61
64
  qs |= superclass.questions if superclass.respond_to? :questions
62
65
  qs |= (@_questions||=[])
@@ -70,14 +73,30 @@ module Interrogative
70
73
  module InstanceMethods
71
74
  include BaseMethods
72
75
 
76
+ # Get the array of all noted questions for this instance and its class
77
+ # (and all of its superclasses), bound to this instance.
78
+ #
79
+ # All questions will be bound to the instance on which `questions`
80
+ # is called, so their `instance_block`s, if provided, will be evaluated
81
+ # in its context.
82
+ #
83
+ # @return [Array<Question>]
84
+ # @see ClassMethods#questions
85
+ # @see Question#options
73
86
  def questions
74
87
  qs = []
75
- qs |= self.class.questions(self) if self.class.respond_to? :questions
88
+ qs |= self.class.questions if self.class.respond_to? :questions
76
89
  qs |= (@_questions||=[])
77
- qs
90
+ qs.map{|q| q.for_instance(self) }
78
91
  end
79
92
  end
80
93
 
94
+ # Gives the class `base` Interrogative's class-level methods
95
+ # and gives instances of `base` Interrogative's instance-level methods.
96
+ #
97
+ # Called when `Interrogative` is included.
98
+ #
99
+ # @param [Class] base the class in which `Interrogative` has been included.
81
100
  def self.included(base)
82
101
  base.extend(Interrogative::ClassMethods)
83
102
  base.class_eval do
@@ -85,4 +104,3 @@ module Interrogative
85
104
  end
86
105
  end
87
106
  end
88
-
@@ -9,7 +9,7 @@ module Interrogative
9
9
  # betraying the fact that it's meant to transform into an HTML form
10
10
  # element.
11
11
  class Question
12
- attr_accessor :name, :text, :attrs
12
+ attr_accessor :name, :text, :attrs, :instance
13
13
 
14
14
  # @see Interrogative#question
15
15
  def initialize(name, text, owner=nil, attrs={}, &instance_block)
@@ -17,9 +17,18 @@ module Interrogative
17
17
  @text = text or raise ArgumentError, "A question must have a label."
18
18
  @owner = owner
19
19
  @attrs = attrs
20
+ @instance = nil
20
21
  @instance_block = instance_block
21
22
  end
22
23
 
24
+ # Returns a copy of this question that is bound to some object.
25
+ #
26
+ # This object will be used as the instance on which the `instance_block`,
27
+ # if provided, is `instance_eval`ed.
28
+ def for_instance(instance)
29
+ self.clone.tap{|q| q.instance = instance }
30
+ end
31
+
23
32
  # Possible answers for the question.
24
33
  #
25
34
  # If a block was passed to the initializer, then the result of
@@ -35,10 +44,10 @@ module Interrogative
35
44
  # In the case of a Hash, the format should be `{ text => value }`.
36
45
  #
37
46
  # @return [Array, Hash] the possible answers for the question.
38
- def options(instance=nil)
47
+ def options
39
48
  if (@instance_block)
40
- if not instance.nil?
41
- return instance.instance_eval &@instance_block
49
+ if not @instance.nil?
50
+ return @instance.instance_eval &@instance_block
42
51
  else
43
52
  return @instance_block.call
44
53
  end
@@ -52,26 +61,19 @@ module Interrogative
52
61
  end
53
62
  end
54
63
 
55
- # Equivalent to calling `hash_for_instance` without an instance.
56
- #
57
- # @see #hash_for_instance
58
- def to_hash
59
- hash_for_instance(nil)
60
- end
61
-
62
64
  # Returns a hash representation of the question.
63
65
  #
64
66
  # Attributes are merged into the top level, along with `:text` and
65
67
  # `:name`. Possible options are nested under `:options`.
66
68
  #
67
69
  # @return [Hash]
68
- def hash_for_instance(instance=nil)
70
+ def to_hash
69
71
  h = @attrs.merge({
70
72
  :text => text,
71
73
  :name => name,
72
74
  })
73
75
 
74
- o = options(instance)
76
+ o = options
75
77
  h[:options] = o if not o.nil?
76
78
  return h
77
79
  end
@@ -80,14 +82,7 @@ module Interrogative
80
82
  # representation.
81
83
  #
82
84
  # @return [String]
83
- # @see #hash_for_instance
84
- def json_for_instance(instance=nil, opts={})
85
- self.hash_for_instance(instance).to_json(opts)
86
- end
87
-
88
- # Equivalent to calling `json_for_instance` without an instance.
89
- #
90
- # @see #json_for_instance
85
+ # @see #to_hash
91
86
  def to_json(opts={})
92
87
  self.to_hash.to_json(opts)
93
88
  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.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-05-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
16
- requirement: &70347291288840 !ruby/object:Gem::Requirement
16
+ requirement: &70102326682260 !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: *70347291288840
24
+ version_requirements: *70102326682260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: riot
27
- requirement: &70347291287780 !ruby/object:Gem::Requirement
27
+ requirement: &70102326681220 !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: *70347291287780
35
+ version_requirements: *70102326681220
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yard
38
- requirement: &70347291287080 !ruby/object:Gem::Requirement
38
+ requirement: &70102326680580 !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: *70347291287080
46
+ version_requirements: *70102326680580
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &70347291286060 !ruby/object:Gem::Requirement
49
+ requirement: &70102326679560 !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: *70347291286060
57
+ version_requirements: *70102326679560
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: bundler
60
- requirement: &70347291301860 !ruby/object:Gem::Requirement
60
+ requirement: &70102326695340 !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: *70347291301860
68
+ version_requirements: *70102326695340
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: jeweler
71
- requirement: &70347291301240 !ruby/object:Gem::Requirement
71
+ requirement: &70102326694720 !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: *70347291301240
79
+ version_requirements: *70102326694720
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: redcarpet
82
- requirement: &70347291300180 !ruby/object:Gem::Requirement
82
+ requirement: &70102326693660 !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: *70347291300180
90
+ version_requirements: *70102326693660
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: -3466753285083621786
128
+ hash: -1066373110683406095
129
129
  required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  none: false
131
131
  requirements: