colloquy 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +15 -0
  2. data/README.md +160 -0
  3. data/TODO.md +256 -0
  4. data/bin/colloquy +14 -0
  5. data/examples/config/flows.yaml +22 -0
  6. data/examples/config/logger.yaml +2 -0
  7. data/examples/config/messages.yaml +3 -0
  8. data/examples/config/mysql.yaml +18 -0
  9. data/examples/config/redis.yaml +9 -0
  10. data/examples/config/scribe.yaml +2 -0
  11. data/examples/config/settings.yaml +2 -0
  12. data/examples/config/test.yaml +8 -0
  13. data/examples/config/urls.yaml +18 -0
  14. data/examples/flows/active_record_flow.rb +42 -0
  15. data/examples/flows/art_of_war_flow.rb +27 -0
  16. data/examples/flows/calculator_flow.rb +71 -0
  17. data/examples/flows/crossover_flow.rb +17 -0
  18. data/examples/flows/database_flow.rb +33 -0
  19. data/examples/flows/hangman_flow.rb +82 -0
  20. data/examples/flows/metadata_flow.rb +11 -0
  21. data/examples/flows/pagination_flow.rb +23 -0
  22. data/examples/flows/pass_flow.rb +29 -0
  23. data/examples/flows/prefix_menu_flow.rb +24 -0
  24. data/examples/flows/scribe_flow.rb +26 -0
  25. data/examples/flows/settings_flow.rb +23 -0
  26. data/examples/flows/special/special_redis_flow.rb +28 -0
  27. data/examples/flows/url_flow.rb +27 -0
  28. data/examples/log/renderer.log +198381 -0
  29. data/examples/log/urls.log +3269 -0
  30. data/examples/messages/active_record.yaml +2 -0
  31. data/examples/messages/art_of_war.yaml +1 -0
  32. data/examples/messages/calculator.yaml +2 -0
  33. data/examples/messages/database.yaml +1 -0
  34. data/examples/messages/hangman.yaml +0 -0
  35. data/examples/messages/prefix_menu.yaml +3 -0
  36. data/examples/models/activations.rb +5 -0
  37. data/lib/colloquy.rb +39 -0
  38. data/lib/colloquy/exceptions.rb +64 -0
  39. data/lib/colloquy/flow_parser.rb +315 -0
  40. data/lib/colloquy/flow_pool.rb +21 -0
  41. data/lib/colloquy/helpers.rb +15 -0
  42. data/lib/colloquy/helpers/mysql.rb +110 -0
  43. data/lib/colloquy/helpers/redis.rb +103 -0
  44. data/lib/colloquy/helpers/scribe.rb +103 -0
  45. data/lib/colloquy/helpers/settings.rb +111 -0
  46. data/lib/colloquy/helpers/url.rb +10 -0
  47. data/lib/colloquy/input.rb +14 -0
  48. data/lib/colloquy/logger.rb +11 -0
  49. data/lib/colloquy/menu.rb +128 -0
  50. data/lib/colloquy/message_builder.rb +54 -0
  51. data/lib/colloquy/node.rb +67 -0
  52. data/lib/colloquy/paginator.rb +59 -0
  53. data/lib/colloquy/paginator/menu.rb +79 -0
  54. data/lib/colloquy/paginator/prompt.rb +32 -0
  55. data/lib/colloquy/prompt.rb +35 -0
  56. data/lib/colloquy/renderer.rb +423 -0
  57. data/lib/colloquy/response.rb +4 -0
  58. data/lib/colloquy/runner.rb +93 -0
  59. data/lib/colloquy/server.rb +157 -0
  60. data/lib/colloquy/session_store.rb +46 -0
  61. data/lib/colloquy/session_store/memory.rb +14 -0
  62. data/lib/colloquy/session_store/redis.rb +24 -0
  63. data/lib/colloquy/simulator.rb +114 -0
  64. data/lib/colloquy/spec_helpers.rb +21 -0
  65. metadata +459 -0
@@ -0,0 +1,15 @@
1
+
2
+ module Colloquy::Helpers
3
+ require_relative 'helpers/url'
4
+ require_relative 'helpers/mysql'
5
+ require_relative 'helpers/redis'
6
+ require_relative 'helpers/scribe'
7
+ require_relative 'helpers/settings'
8
+
9
+ include Colloquy::Helpers::Url
10
+ include Colloquy::Helpers::MySQL
11
+ include Colloquy::Helpers::Redis
12
+ include Colloquy::Helpers::Scribe
13
+ include Colloquy::Helpers::Settings
14
+ end
15
+
@@ -0,0 +1,110 @@
1
+ require 'singleton'
2
+ require 'yaml'
3
+ require 'active_support/core_ext/hash'
4
+
5
+ class Colloquy::MySQLConfigurationNotFoundException < Exception
6
+ end
7
+
8
+ class Colloquy::MySQLGemsNotFoundException < Exception
9
+ end
10
+
11
+ class Colloquy::MySQLConnectionNotFoundException < Exception
12
+ end
13
+
14
+ module Colloquy::Helpers::MySQL
15
+ def self.included(klass)
16
+ klass.class_eval do
17
+ include InstanceMethods
18
+ end
19
+ end
20
+
21
+ class MySQLProxy
22
+ DEFAULT_OPTIONS = { :host => "localhost", :port => 3306, :socket => "/tmp/mysql.sock", :username => "root", :password => "", :reconnect => true, :pool => 5}
23
+
24
+ include Singleton
25
+
26
+ def initialize
27
+ @configured = false
28
+ end
29
+
30
+ def configure
31
+ return if configured?
32
+ configure!
33
+ end
34
+
35
+ def configure!
36
+ unless mysql_configuration_file.exist?
37
+ raise Colloquy::MySQLConfigurationNotFoundException, "Cannot find #{mysql_configuration_file}"
38
+ end
39
+
40
+ begin
41
+ require_mysql_libraries
42
+ rescue LoadError
43
+ raise Colloquy::MySQLGemsNotFoundException, "Cannot load the mysql2 gem."
44
+ end
45
+
46
+ @mysql_db_connections ||= {}
47
+ mysql_configuration_load
48
+
49
+ @configured = true
50
+ end
51
+
52
+ def configured?
53
+ @configured
54
+ end
55
+
56
+ def require_mysql_libraries
57
+ require "em-synchrony/mysql2"
58
+ end
59
+
60
+ def [](identifier)
61
+ unless @mysql_db_connections[identifier.to_sym]
62
+ raise Colloquy::MySQLConnectionNotFoundException, "A connection for #{identifier} was not found, did you mis-spell or forget to configure it?"
63
+ end
64
+
65
+ @mysql_db_connections[identifier.to_sym]
66
+ end
67
+
68
+ def configuration
69
+ @mysql_configuration_entries
70
+ end
71
+
72
+ private
73
+
74
+ def mysql_configuration_file
75
+ Colloquy.root.join('config', 'mysql.yaml')
76
+ end
77
+
78
+ def mysql_configuration_load
79
+ return unless mysql_configuration_exists?
80
+
81
+ @mysql_configuration_entries = File.open(mysql_configuration_file, "r") { |f| YAML.load(f.read) }
82
+ @mysql_configuration_entries.to_options!
83
+
84
+ if @mysql_configuration_entries
85
+ @mysql_configuration_entries.each do |identifier, params|
86
+ params.to_options!.merge!(DEFAULT_OPTIONS) { |key, v1, v2| v1 }
87
+ @mysql_db_connections[identifier.to_sym] = mysql_connection(params)
88
+ end
89
+ else
90
+ raise Colloquy::MySQLConfigurationNotFoundException, "Cannot find configuration in #{mysql_configuration_file}. Is it empty?"
91
+ end
92
+ end
93
+
94
+ def mysql_connection(params)
95
+ Mysql2::EM::Client.new(params)
96
+ end
97
+
98
+ def mysql_configuration_exists?
99
+ mysql_configuration_file.exist?
100
+ end
101
+ end
102
+
103
+ module InstanceMethods
104
+ def mysql
105
+ MySQLProxy.instance.configure
106
+
107
+ MySQLProxy.instance
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,103 @@
1
+ require 'singleton'
2
+ require 'yaml'
3
+
4
+ class Colloquy::RedisConfigurationNotFoundException < Exception
5
+ end
6
+
7
+ class Colloquy::RedisGemsNotFoundException < Exception
8
+ end
9
+
10
+ class Colloquy::RedisConnectionNotFoundException < Exception
11
+ end
12
+
13
+ module Colloquy::Helpers::Redis
14
+ def self.included(klass)
15
+ klass.class_eval do
16
+ include InstanceMethods
17
+ end
18
+ end
19
+
20
+ class RedisProxy
21
+ include Singleton
22
+
23
+ def initialize
24
+ @configured = false
25
+ end
26
+
27
+ def configure
28
+ return if configured?
29
+ configure!
30
+ end
31
+
32
+ def configure!
33
+ unless redis_configuration_file.exist?
34
+ raise Colloquy::RedisConfigurationNotFoundException, "Cannot find #{redis_configuration_file}"
35
+ end
36
+
37
+ begin
38
+ require_redis_libraries
39
+ rescue LoadError
40
+ raise Colloquy::RedisGemsNotFoundException, "Cannot load the em-redis gem."
41
+ end
42
+
43
+ @redis_connections ||= {}
44
+ redis_configuration_load
45
+
46
+ @configured = true
47
+ end
48
+
49
+ def configured?
50
+ @configured
51
+ end
52
+
53
+ def require_redis_libraries
54
+ require "em-redis"
55
+ require "em-synchrony"
56
+ require "em-synchrony/em-redis"
57
+ end
58
+
59
+ def [](identifier)
60
+ unless @redis_connections[identifier.to_sym]
61
+ raise Colloquy::RedisConnectionNotFoundException, "A Redis connection for #{identifier} was not found, did you mis-spell or forget to configure it?"
62
+ end
63
+
64
+ @redis_connections[identifier.to_sym]
65
+ end
66
+
67
+ private
68
+
69
+ def redis_configuration_file
70
+ Colloquy.root.join('config', 'redis.yaml')
71
+ end
72
+
73
+ def redis_configuration_load
74
+ return unless redis_configuration_exists?
75
+
76
+ redis_configuration = File.open(redis_configuration_file, "r") { |f| YAML.load(f.read) }
77
+
78
+ if redis_configuration
79
+ redis_configuration.each do |identifier, params|
80
+ @redis_connections[identifier.to_sym] = redis_connection(params.to_options)
81
+ end
82
+ else
83
+ raise Colloquy::RedisConfigurationNotFoundException, "Cannot find configuration in #{redis_configuration_file}. Is it empty?"
84
+ end
85
+ end
86
+
87
+ def redis_connection(params = {})
88
+ EM::Protocols::Redis.connect(params)
89
+ end
90
+
91
+ def redis_configuration_exists?
92
+ redis_configuration_file.exist?
93
+ end
94
+ end
95
+
96
+ module InstanceMethods
97
+ def redis
98
+ RedisProxy.instance.configure
99
+
100
+ RedisProxy.instance
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,103 @@
1
+ require 'singleton'
2
+ require 'yaml'
3
+
4
+ class Colloquy::ScribeConfigurationNotFoundException < Exception
5
+ end
6
+
7
+ class Colloquy::ScribeGemsNotFoundException < Exception
8
+ end
9
+
10
+ class Colloquy::ScribeConnectionNotFoundException < Exception
11
+ end
12
+
13
+ module Colloquy::Helpers::Scribe
14
+ def self.included(klass)
15
+ klass.class_eval do
16
+ include InstanceMethods
17
+ end
18
+ end
19
+
20
+ class ScribeProxy
21
+ include Singleton
22
+
23
+ def initialize
24
+ @configured = false
25
+ end
26
+
27
+ def configure
28
+ return if configured?
29
+ configure!
30
+ end
31
+
32
+ def configure!
33
+ unless scribe_configuration_file.exist?
34
+ raise Colloquy::ScribeConfigurationNotFoundException, "Cannot find #{scribe_configuration_file}"
35
+ end
36
+
37
+ begin
38
+ require_scribe_libraries
39
+ rescue LoadError
40
+ raise Colloquy::ScribeGemsNotFoundException, "Cannot load the scribe gem."
41
+ end
42
+
43
+ @scribe_connections ||= {}
44
+ scribe_configuration_load
45
+
46
+ @configured = true
47
+ end
48
+
49
+ def configured?
50
+ @configured
51
+ end
52
+
53
+ def connections
54
+ @scribe_connections
55
+ end
56
+
57
+ def [](identifier)
58
+ unless @scribe_connections[identifier.to_sym]
59
+ raise Colloquy::ScribeConnectionNotFoundException, "A connection for #{identifier} was not found, did you mis-spell or forget to configure it?"
60
+ end
61
+
62
+ @scribe_connections[identifier.to_sym]
63
+ end
64
+
65
+ def require_scribe_libraries
66
+ require 'scribe-logger'
67
+ end
68
+
69
+ def scribe_configuration_file
70
+ Colloquy.root.join('config', 'scribe.yaml')
71
+ end
72
+
73
+ def scribe_configuration_load
74
+ return unless scribe_configuration_exists?
75
+
76
+ scribe_configuration = File.open(scribe_configuration_file, "r") { |f| YAML.load(f.read) }
77
+
78
+ if scribe_configuration
79
+ scribe_configuration.each do |identifier, params|
80
+ @scribe_connections[identifier.to_sym] = scribe_connection(params)
81
+ end
82
+ else
83
+ raise Colloquy::ScribeConfigurationNotFoundException, "Cannot find configuration in #{scribe_configuration_file}. Is it empty?"
84
+ end
85
+ end
86
+
87
+ def scribe_connection(params)
88
+ Scribe.loggers(params)
89
+ end
90
+
91
+ def scribe_configuration_exists?
92
+ scribe_configuration_file.exist?
93
+ end
94
+ end
95
+
96
+ module InstanceMethods
97
+ def scribe
98
+ ScribeProxy.instance.configure
99
+ ScribeProxy.instance
100
+ end
101
+ end
102
+
103
+ end
@@ -0,0 +1,111 @@
1
+ require 'singleton'
2
+ require 'yaml'
3
+
4
+ class Colloquy::SettingsConfigurationNotFoundException < Exception
5
+ end
6
+
7
+ class Colloquy::SettingsGemsNotFoundException < Exception
8
+ end
9
+
10
+ module Colloquy::Helpers::Settings
11
+ def self.included(klass)
12
+ klass.class_eval do
13
+ include InstanceMethods
14
+ end
15
+ end
16
+
17
+ class SettingsProxy
18
+ include Singleton
19
+
20
+ def configure
21
+ return if configured?
22
+ configure!
23
+ end
24
+
25
+ def configured?
26
+ @configured
27
+ end
28
+
29
+ def configure!
30
+ unless settings_configuration_file.exist?
31
+ raise Colloquy::SettingsConfigurationNotFoundException, "Cannot find #{settings_configuration_file}"
32
+ end
33
+
34
+ begin
35
+ require_settings_libraries
36
+ rescue LoadError
37
+ raise Colloquy::SettingsGemsNotFoundException, "Cannot load the required settings gems."
38
+ end
39
+
40
+ @settings_configurations ||= {}
41
+ settings_configuration_load
42
+
43
+ @configured = true
44
+ end
45
+
46
+ def settings_configuration_file
47
+ Colloquy.root.join('config', 'settings.yaml')
48
+ end
49
+
50
+ def require_settings_libraries
51
+ require "yaml"
52
+ end
53
+
54
+ def settings_configuration_load
55
+ return unless settings_configuration_exists?
56
+
57
+ @settings_configuration_entries = File.open(settings_configuration_file, "r") { |f| YAML.load(f.read) }
58
+
59
+ if @settings_configuration_entries
60
+ @settings_configuration_entries.each do |identifier, params|
61
+ @settings_configurations[identifier.to_sym] = settings_configuration(params)
62
+ end
63
+ else
64
+ raise Colloquy::SettingsConfigurationNotFoundException, "Cannot find configuration in #{settings_configuration_file}. Is it empty?"
65
+ end
66
+ end
67
+
68
+ def settings_configuration_exists?
69
+ settings_configuration_file.exist?
70
+ end
71
+
72
+ def [](identifier)
73
+ unless @settings_configurations[identifier.to_sym]
74
+ raise Colloquy::SettingsFileNotFoundException, "A settings file for #{identifier} was not found, did you mis-spell or forget to configure it?"
75
+ end
76
+
77
+ @settings_configurations[identifier.to_sym]
78
+ end
79
+
80
+ def settings_configuration(params)
81
+ begin
82
+ if params[0] == "/"
83
+ yaml = YAML::load(File.open(params))
84
+ else
85
+ yaml = YAML::load(File.open(Colloquy.root.join(params)))
86
+ end
87
+ rescue Errno::ENOENT => e
88
+ logger.error "File not found: #{params}"
89
+ return {}
90
+ rescue Psych::SyntaxError => e
91
+ logger.error "File #{params} is not valid YAML"
92
+ return {}
93
+ end
94
+ end
95
+
96
+ def logger
97
+ Colloquy.logger
98
+ end
99
+
100
+ end
101
+
102
+
103
+ module InstanceMethods
104
+ def settings
105
+ SettingsProxy.instance.configure
106
+
107
+ SettingsProxy.instance
108
+ end
109
+ end
110
+
111
+ end
@@ -0,0 +1,10 @@
1
+ require 'url-agent'
2
+
3
+ module Colloquy::Helpers::Url
4
+ def url
5
+ url_agent = URLAgent::Base.instance
6
+ url_agent.configure(:path_root => Colloquy.root)
7
+
8
+ url_agent
9
+ end
10
+ end