conversational 0.3.1 → 0.3.2

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/README.markdown CHANGED
@@ -86,7 +86,7 @@ Conversational also allows you to have *stateful* conversations. A stateful conv
86
86
 
87
87
  Let's build on the prevous example using stateful conversations.
88
88
 
89
- Our application so far is *stateless*. Currently if we get a friend request we have no way of accepting or rejecting it. If we were to continue building a stateless application we would simple add a couple of new commands such as:
89
+ Our application so far is *stateless*. Currently if we get a friend request we have no way of accepting or rejecting it. If we were to continue building a stateless application we would simply add a couple of new commands such as:
90
90
 
91
91
  * "afr <friend>"
92
92
  * "rfr <friend>"
@@ -146,7 +146,7 @@ Now take a look at our `FacebookAlert` class. The first thing is that we renamed
146
146
 
147
147
  There is also a new method `move_along` which looks at the message to see if the user replied with "yes" or "no" and responds appropriately. Notice it also calls `finish`.
148
148
 
149
- If we jump back and take a look at our main Conversation class we see that `finish` marks the conversation state as finished so it will be found by `find_or_create_with`. It is important that you remember to call `finish` on all conversations where you don't expect a response.
149
+ If we jump back and take a look at our main Conversation class we see that `finish` marks the conversation state as finished so it won't be found by `find_or_create_with`. It is important that you remember to call `finish` on all conversations where you don't expect a response.
150
150
 
151
151
  So how does this all tie together?
152
152
 
@@ -196,7 +196,7 @@ Now when we text in "hey jonnie", `details` will try and find a conversation def
196
196
 
197
197
  The same thing happens for a blank conversation.
198
198
 
199
- There is one more subtle issue with our application. What if we text in "facebook_alert"? The reply will be: "Invalid response. Reply with yes or no" when it should actually be "Sorry. Unknown Command". This is because if `find_or_create_with` cannot find an existing conversation it will try and create one with the topic "facebook_alert" if `FacebookAlertConversation` is defined in our application (which it is). To solve this prolem we can use `exclude`.
199
+ There is one more subtle issue with our application. What if we text in "facebook_alert"? The reply will be: "Invalid response. Reply with yes or no" when it should actually be "Sorry. Unknown Command". This is because if `find_or_create_with` cannot find an existing conversation it will try and create one with the topic "facebook_alert" if `FacebookAlertConversation` is defined in our application (which it is). To solve this problem we can use `exclude`.
200
200
 
201
201
  class Conversation
202
202
  exclude FacebookAlertConversation
@@ -231,7 +231,7 @@ Generates a migration file if you want to use Conversational with Rails
231
231
 
232
232
  ## More Examples
233
233
 
234
- Here's an [example](http://github.com/dwilkie/drinking) *stateful* conversation app about drinking
234
+ Here's an [example](http://github.com/dwilkie/drinking) *stateful* conversation app about drinking
235
235
 
236
236
  ## Notes
237
237
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.3.2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{conversational}
8
- s.version = "0.3.1"
8
+ s.version = "0.3.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["David Wilkie"]
12
- s.date = %q{2010-06-01}
12
+ s.date = %q{2010-08-31}
13
13
  s.email = %q{dwilkie@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.markdown"
@@ -55,7 +55,7 @@ Gem::Specification.new do |s|
55
55
  s.homepage = %q{http://github.com/dwilkie/conversational}
56
56
  s.rdoc_options = ["--charset=UTF-8"]
57
57
  s.require_paths = ["lib"]
58
- s.rubygems_version = %q{1.3.6}
58
+ s.rubygems_version = %q{1.3.7}
59
59
  s.summary = %q{Have conversations with your users over SMS}
60
60
  s.test_files = [
61
61
  "spec/conversation_spec.rb",
@@ -69,7 +69,7 @@ Gem::Specification.new do |s|
69
69
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
70
70
  s.specification_version = 3
71
71
 
72
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
72
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
73
73
  else
74
74
  end
75
75
  else
@@ -12,12 +12,12 @@ module Conversational
12
12
 
13
13
  # Returns the specific sublass of conversation based from the topic
14
14
  # Example:
15
- #
15
+ #
16
16
  # <tt>
17
17
  # Class Conversation
18
18
  # include Conversational::Conversation
19
19
  # end
20
- #
20
+ #
21
21
  # Class HelloConversation < Conversation
22
22
  # end
23
23
  #
@@ -58,6 +58,10 @@ module Conversational
58
58
  becomes(details_subclass) if details_subclass
59
59
  end
60
60
 
61
+ def topic_defined?
62
+ details_subclass = ConversationDefinition.topic_defined?(topic)
63
+ end
64
+
61
65
  protected
62
66
  # Called from a subclass to deliver the message
63
67
  def say(message)
@@ -66,7 +70,7 @@ module Conversational
66
70
 
67
71
  module InstanceAttributes
68
72
  attr_accessor :with, :topic
69
-
73
+
70
74
  def initialize(options = {})
71
75
  self.with = options[:with]
72
76
  self.topic = options[:topic]
@@ -89,15 +93,15 @@ module Conversational
89
93
  def unknown_topic_subclass=(klass)
90
94
  ConversationDefinition.unknown_topic_subclass = klass
91
95
  end
92
-
96
+
93
97
  def unknown_topic_subclass
94
98
  ConversationDefinition.unknown_topic_subclass
95
99
  end
96
-
100
+
97
101
  def blank_topic_subclass=(klass)
98
102
  ConversationDefinition.blank_topic_subclass = klass
99
103
  end
100
-
104
+
101
105
  def blank_topic_subclass
102
106
  ConversationDefinition.blank_topic_subclass
103
107
  end
@@ -127,7 +131,7 @@ module Conversational
127
131
  # <tt>
128
132
  # class AbstractConversation < Conversation
129
133
  # end
130
- #
134
+ #
131
135
  # class MonkeyConversation < AbstractConversation
132
136
  # end
133
137
  #
@@ -197,3 +201,4 @@ module Conversational
197
201
  end
198
202
  end
199
203
  end
204
+
@@ -21,7 +21,9 @@ module Conversational
21
21
  def self.find_subclass_by_topic(topic, options = {})
22
22
  subclass = nil
23
23
  if topic.nil? || topic.blank?
24
- subclass = blank_topic_subclass if blank_topic_subclass
24
+ unless options[:exclude_blank_unknown]
25
+ subclass = blank_topic_subclass if blank_topic_subclass
26
+ end
25
27
  else
26
28
  project_class_name = self.topic_subclass_name(topic)
27
29
  begin
@@ -35,16 +37,25 @@ module Conversational
35
37
  (options[:include_all] || !self.exclude?(project_class))
36
38
  subclass = project_class
37
39
  else
38
- subclass = unknown_topic_subclass if unknown_topic_subclass
40
+ unless options[:exclude_blank_unknown]
41
+ subclass = unknown_topic_subclass if unknown_topic_subclass
42
+ end
39
43
  end
40
44
  end
41
45
  subclass
42
46
  end
43
47
 
48
+ def self.topic_defined?(topic)
49
+ self.find_subclass_by_topic(
50
+ topic,
51
+ :exclude_blank_unknown => true
52
+ )
53
+ end
54
+
44
55
  def self.topic_subclass_name(topic)
45
56
  topic.classify + @@klass.to_s
46
57
  end
47
-
58
+
48
59
  private
49
60
  def self.exclude?(subclass)
50
61
  if defined?(@@excluded_classes)
@@ -57,7 +68,7 @@ module Conversational
57
68
  end
58
69
  end
59
70
  end
60
-
71
+
61
72
  def self.exclude_class?(subclass)
62
73
  if @@excluded_classes.is_a?(Class)
63
74
  @@excluded_classes == subclass
@@ -84,3 +95,4 @@ module Conversational
84
95
  end
85
96
  end
86
97
  end
98
+
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 1
9
- version: 0.3.1
8
+ - 2
9
+ version: 0.3.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - David Wilkie
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-01 00:00:00 +07:00
17
+ date: 2010-08-31 00:00:00 +07:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -73,6 +73,7 @@ rdoc_options:
73
73
  require_paths:
74
74
  - lib
75
75
  required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
76
77
  requirements:
77
78
  - - ">="
78
79
  - !ruby/object:Gem::Version
@@ -80,6 +81,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
80
81
  - 0
81
82
  version: "0"
82
83
  required_rubygems_version: !ruby/object:Gem::Requirement
84
+ none: false
83
85
  requirements:
84
86
  - - ">="
85
87
  - !ruby/object:Gem::Version
@@ -89,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
91
  requirements: []
90
92
 
91
93
  rubyforge_project:
92
- rubygems_version: 1.3.6
94
+ rubygems_version: 1.3.7
93
95
  signing_key:
94
96
  specification_version: 3
95
97
  summary: Have conversations with your users over SMS