dohruby 0.2.1 → 0.3

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.
Files changed (154) hide show
  1. data/CHANGELOG +8 -0
  2. data/bin/config.rb +61 -0
  3. data/bin/create_database.rb +13 -6
  4. data/bin/gendata.rb +37 -0
  5. data/bin/migrate.rb +66 -0
  6. data/bin/{rcov-preprocess-files.rb → rcov_preprocess_files.rb} +1 -1
  7. data/bin/run_tests.rb +15 -5
  8. data/bin/update_rdoc.rb +28 -0
  9. data/dohapp_home +0 -0
  10. data/lib/doh/app/activate_database.rb +5 -12
  11. data/lib/doh/app/activate_logger.rb +29 -13
  12. data/lib/doh/app/config.rb +18 -0
  13. data/lib/doh/app/home.rb +3 -8
  14. data/lib/doh/app/init_runnable.rb +39 -8
  15. data/lib/doh/app/init_script.rb +19 -0
  16. data/lib/doh/app/init_unit_test.rb +4 -1
  17. data/lib/doh/app_no_stdio.rb +1 -1
  18. data/lib/doh/boot/app.rb +2 -0
  19. data/lib/doh/boot/app_pwd.rb +2 -0
  20. data/lib/doh/boot/find_dohruby.rb +5 -0
  21. data/lib/doh/boot/find_dohruby_18.rb +37 -0
  22. data/lib/doh/boot/find_dohruby_19.rb +58 -0
  23. data/lib/doh/boot/init_runnable.rb +2 -0
  24. data/lib/doh/boot/options.rb +2 -0
  25. data/lib/doh/core/array.rb +10 -0
  26. data/lib/doh/core/bigdecimal.rb +15 -0
  27. data/lib/doh/core/date.rb +73 -0
  28. data/lib/doh/core/deep_dup.rb +12 -0
  29. data/lib/doh/core/hash.rb +21 -0
  30. data/lib/doh/core/object.rb +6 -0
  31. data/lib/doh/core/require_local.rb +5 -0
  32. data/lib/doh/core/socket.rb +25 -0
  33. data/lib/doh/core/string.rb +34 -4
  34. data/lib/doh/core.rb +4 -1
  35. data/lib/doh/data/basic.rb +24 -19
  36. data/lib/doh/data/bulk.rb +28 -88
  37. data/lib/doh/data/catalog.rb +44 -0
  38. data/lib/doh/data/human.rb +50 -42
  39. data/lib/doh/data/make_global.rb +3 -0
  40. data/lib/doh/data/require_datagen.rb +2 -1
  41. data/lib/doh/home.rb +16 -0
  42. data/lib/doh/logger/email_acceptor.rb +6 -3
  43. data/lib/doh/logger/event.rb +19 -6
  44. data/lib/doh/logger/formatter.rb +22 -16
  45. data/lib/doh/logger/interface.rb +13 -0
  46. data/lib/doh/logger/iostream_acceptor.rb +3 -2
  47. data/lib/doh/logger/null_interface.rb +1 -0
  48. data/lib/doh/logger/proxy.rb +53 -0
  49. data/lib/doh/logger/socket_acceptor.rb +53 -0
  50. data/lib/doh/logger/socket_viewer.rb +64 -0
  51. data/lib/doh/logger/standard_interface.rb +46 -17
  52. data/lib/doh/logger/util.rb +18 -0
  53. data/lib/doh/logger.rb +2 -1
  54. data/lib/doh/logger_configure.rb +1 -1
  55. data/lib/doh/merb/db_session.rb +136 -0
  56. data/lib/doh/merb/form_helpers.rb +16 -0
  57. data/lib/doh/merb/login.rb +27 -12
  58. data/lib/doh/merb/merb_dohsession.rb +4 -0
  59. data/lib/doh/merb/notify_on_exception.rb +1 -1
  60. data/lib/doh/merb/session.rb +7 -0
  61. data/lib/doh/merb/source_ip.rb +10 -0
  62. data/lib/doh/merb.rb +0 -1
  63. data/lib/doh/mysql/abstract_row.rb +81 -0
  64. data/lib/doh/mysql/cache_connector.rb +11 -8
  65. data/lib/doh/mysql/connector_instance.rb +32 -5
  66. data/lib/doh/mysql/connector_util.rb +1 -0
  67. data/lib/doh/mysql/convert.rb +18 -0
  68. data/lib/doh/mysql/database_creator.rb +18 -5
  69. data/lib/doh/mysql/db_date.rb +2 -2
  70. data/lib/doh/mysql/default_type_guesser.rb +21 -4
  71. data/lib/doh/mysql/error.rb +3 -2
  72. data/lib/doh/mysql/handle.rb +144 -18
  73. data/lib/doh/mysql/hash_row.rb +13 -0
  74. data/lib/doh/mysql/load_sql.rb +1 -0
  75. data/lib/doh/mysql/metadata_util.rb +60 -19
  76. data/lib/doh/mysql/migrate.rb +122 -0
  77. data/lib/doh/mysql/migrate_check.rb +139 -0
  78. data/lib/doh/mysql/parse.rb +2 -0
  79. data/lib/doh/mysql/readonly_row.rb +11 -48
  80. data/lib/doh/mysql/require_dbtypes.rb +8 -0
  81. data/lib/doh/mysql/smart_row.rb +156 -0
  82. data/lib/doh/mysql/to_sql.rb +12 -0
  83. data/lib/doh/mysql/typed_row_builder.rb +4 -3
  84. data/lib/doh/mysql/types.rb +33 -0
  85. data/lib/doh/mysql/unquoted.rb +8 -0
  86. data/lib/doh/mysql/version.rb +102 -0
  87. data/lib/doh/mysql/virtual.rb +17 -0
  88. data/lib/doh/mysql/writable_row.rb +58 -0
  89. data/lib/doh/mysql.rb +2 -1
  90. data/lib/doh/paypal/paypal.rb +20 -0
  91. data/lib/doh/paypal/pdt.rb +14 -0
  92. data/lib/doh/paypal.rb +1 -0
  93. data/lib/doh/rails/form_helpers.rb +53 -0
  94. data/lib/doh/rails/login.rb +143 -0
  95. data/lib/doh/test/error_acceptor.rb +1 -1
  96. data/lib/doh/test/run_tests.rb +48 -43
  97. data/lib/doh/test/setup_once.rb +15 -0
  98. data/lib/doh/test/test_result.rb +7 -0
  99. data/lib/doh/unit_test.rb +6 -0
  100. data/lib/doh/util/banking_workday.rb +16 -12
  101. data/lib/doh/util/class_basename.rb +10 -0
  102. data/lib/doh/util/current_date.rb +18 -41
  103. data/lib/doh/util/doh_socket.rb +56 -0
  104. data/lib/doh/util/email.rb +18 -0
  105. data/lib/doh/util/file_edit.rb +64 -0
  106. data/lib/doh/util/http_helper.rb +107 -0
  107. data/lib/doh/util/internal_ip.rb +1 -1
  108. data/lib/doh/util/jsval.rb +13 -0
  109. data/lib/doh/util/post_hash.rb +14 -0
  110. data/lib/doh/util/xml_util.rb +48 -0
  111. data/test/core/tc_array.rb +12 -0
  112. data/test/core/tc_date.rb +53 -0
  113. data/test/core/tc_deep_dup.rb +69 -0
  114. data/test/core/tc_hash.rb +28 -0
  115. data/test/core/tc_socket.rb +30 -0
  116. data/test/core/tc_string.rb +15 -22
  117. data/test/local_tests.rb +3 -0
  118. data/test/local_tests_including_slow.rb +4 -0
  119. data/test/logger/tc_acceptor.rb +23 -6
  120. data/test/logger/tc_event.rb +1 -1
  121. data/test/logger/tc_formatter.rb +3 -2
  122. data/test/logger/tc_socket_viewer_acceptor.rb +48 -0
  123. data/test/mysql/001_down.sql +1 -0
  124. data/test/mysql/001_up.sql +4 -0
  125. data/test/mysql/002_down.sql +1 -0
  126. data/test/mysql/002_up.sql +1 -0
  127. data/test/mysql/tc_connector_instance.rb +8 -8
  128. data/test/mysql/tc_convert.rb +45 -0
  129. data/test/mysql/tc_handle.rb +94 -2
  130. data/test/mysql/tc_metadata_util.rb +50 -0
  131. data/test/mysql/tc_migrate.rb +50 -0
  132. data/test/mysql/tc_parse.rb +3 -1
  133. data/test/mysql/tc_readonly_row.rb +14 -10
  134. data/test/mysql/tc_smart_row.rb +22 -0
  135. data/test/mysql/tc_to_sql.rb +20 -0
  136. data/test/mysql/tc_types.rb +32 -0
  137. data/test/mysql/tc_unquoted.rb +1 -0
  138. data/test/mysql/tc_writable_row.rb +22 -0
  139. data/test/ts_core.rb +4 -0
  140. data/test/ts_logger.rb +4 -0
  141. data/test/ts_mysql.rb +6 -0
  142. data/test/ts_util.rb +6 -0
  143. data/test/util/slow_doh_socket.rb +102 -0
  144. data/test/util/tc_banking_workday.rb +18 -0
  145. data/test/util/tc_file_edit.rb +54 -0
  146. data/test/util/tc_jsval.rb +12 -0
  147. data/test/util/tc_to_display.rb +14 -0
  148. data/test/util/tc_xml_util.rb +17 -0
  149. metadata +130 -39
  150. data/README +0 -4
  151. data/lib/doh/merb/post_hash.rb +0 -26
  152. data/lib/doh/mysql/db_null.rb +0 -24
  153. data/lib/doh/mysql/hash_util.rb +0 -56
  154. data/test/mysql/tc_hash_util.rb +0 -23
data/CHANGELOG CHANGED
@@ -121,3 +121,11 @@
121
121
  * added create_database.rb to deploy executables list
122
122
  *0.2.1* (Jun 20th, 2008)
123
123
  * added util/to_display
124
+ *0.2.2*
125
+ * simplify Dir related code
126
+ * doh/mysql - merge hash_util into Handle class
127
+ * doh/mysql - misc Handle tweaks, enhancements
128
+ * moved post_hash to doh/util from doh/merb
129
+ * added get_required_config_value that raises if the value doesn't exist in the config (with description of error)
130
+ * added xml_util for hash to xml, vice versa, and http_handler
131
+
data/bin/config.rb ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+ require 'doh/boot/app_pwd'
3
+
4
+ opts = DohApp::Options.new(
5
+ {'check' => [false, "-c", "--check", "checks for the presence of all listed config keys. exits with non-zero status code if any are missing"] \
6
+ ,'file' => [nil, "-f", "--file <filename>", "filename to read the config key names from"] \
7
+ ,'show' => [false, "-s", "--show", "shows a list of defined config entries"] \
8
+ ,'keys' => [false, "-k", "--keys", "shows a list of defined config keys (useful for generating a file to read from)"] \
9
+ }, true, 'list of config keys. only used with some options. nested keys are not yet supported, but ultimately will be in path style.')
10
+
11
+ class DisplayConfig
12
+ def self.run
13
+ DohApp::config.keys.sort.each do |key|
14
+ nested(key, DohApp::config[key])
15
+ end
16
+ end
17
+
18
+ private
19
+ def self.nested(top_key, top_obj, tab_level = 0)
20
+ indent = ' ' * (tab_level * 2)
21
+ if top_obj.is_a?(Hash)
22
+ puts "#{indent}#{top_key}:"
23
+ top_obj.keys.each {|key| nested(key, top_obj[key], tab_level + 1)}
24
+ else
25
+ puts "#{indent}#{top_key} -> #{top_obj.inspect}"
26
+ end
27
+ end
28
+ end
29
+
30
+ class CheckConfig
31
+ def self.run(keys_to_check)
32
+ missing = []
33
+ keys_to_check.each do |key|
34
+ missing.push(key) unless DohApp::config.key?(key)
35
+ end
36
+
37
+ if missing.empty?
38
+ puts "checked #{keys_to_check.size} keys; all are present"
39
+ exit 0
40
+ else
41
+ puts "failing due to missing keys: #{missing.join(',')}"
42
+ exit 1
43
+ end
44
+ end
45
+ end
46
+
47
+ if opts.show
48
+ DisplayConfig.run
49
+ elsif opts.keys
50
+ DohApp::config.keys.sort.each { |key| puts key }
51
+ elsif opts.check
52
+ if opts.file
53
+ keys_to_check = []
54
+ File.new(opts.file, 'r').each_line { |line| keys_to_check.push(line.chomp) }
55
+ else
56
+ keys_to_check = opts.varargs
57
+ end
58
+ CheckConfig.run(keys_to_check)
59
+ else
60
+ puts opts
61
+ end
@@ -1,20 +1,27 @@
1
1
  #!/usr/bin/env ruby
2
- require 'doh/app_pwd'
2
+ require 'doh/boot/app_pwd'
3
3
  require 'doh/mysql/database_creator'
4
4
 
5
5
  opts = DohApp::Options.new(
6
- {'drop_first' => [false, "-z", "--drop_first", "if true, will drop the database before creating it"] \
7
- ,'database' => [DohApp::config['primary_database'], "-d", "--database <database>", "name of the database to create -- defaults to config['primary_database'], currently '#{DohApp::config['primary_database']}'"] \
6
+ {'drop_first' => [false, "-z", "--drop_first", "if true, will drop the database or tables before creating"] \
7
+ ,'database' => [DohApp::config['primary_database'], "-d", "--database <database>", "name of the source database -- defaults to config['primary_database'], currently '#{DohApp::config['primary_database']}'"] \
8
8
  ,'all' => [false, "-a", "--all", "create all databases"] \
9
+ ,'target' => [DohApp::config['target_database'], "-g", "--target <database>", "name of the target database -- defaults to same as source"] \
10
+ ,'tables' => [nil, "-t", "--tables <tables>", "comma-delimited list of tables to create; if specified, no databases are dropped or created"]
9
11
  })
10
12
 
11
- if opts.database.to_s.empty?
12
- puts "You must specify a database (either here with -d or in your config)"
13
+ if opts.database.to_s.empty? && !opts.all
14
+ puts "You must specify a database (either here with -d or in your config) or all (with -a)"
13
15
  exit 1
14
16
  end
17
+
15
18
  db_creator = DohDb::DatabaseCreator.new
16
- if opts.all
19
+ if opts.tables
20
+ db_creator.create_tables(opts.database, opts.drop_first, opts.tables.split(/,/))
21
+ elsif opts.all
17
22
  db_creator.create_all_databases(opts.drop_first)
23
+ elsif opts.target
24
+ db_creator.create_database_copy(opts.target, opts.database, opts.drop_first)
18
25
  else
19
26
  db_creator.create_database(opts.database, opts.drop_first)
20
27
  end
data/bin/gendata.rb ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+ require 'doh/boot/app_pwd'
3
+ require 'doh/data/catalog'
4
+ require 'doh/data/require_datagen'
5
+ require 'doh/mysql/connector_util'
6
+ DohData::require_datagen
7
+
8
+ opts = DohApp::Options.new(
9
+ {'target' => [DohApp::config['primary_database'], "-g", "--target <database>", "name of the target database -- defaults to config['primary_database'], currently '#{DohApp::config['primary_database']}'"] \
10
+ ,'count' => [1, "-c", "--count <amount>", "how many to create"] \
11
+ }, true, 'list of catalog entries to create')
12
+
13
+ if opts.varargs.size == 0
14
+ DohData::catalog_list.each {|elem| puts elem }
15
+ exit
16
+ end
17
+
18
+ if opts.target
19
+ DohDb::reconfigure_connector({'database' => opts.target})
20
+ end
21
+
22
+ opts.varargs.each do |entry|
23
+ klass = DohData::search_catalog(entry)
24
+ if klass.nil?
25
+ puts "unable to find data object matching: #{entry}"
26
+ else
27
+ Doh::disable_logging
28
+ opts.count.to_i.times do
29
+ begin
30
+ klass.new.save_to_database
31
+ # rescue Exception => excpt
32
+ # puts "ignoring exception: #{excpt.inspect}"
33
+ end
34
+ end
35
+ end
36
+ end
37
+
data/bin/migrate.rb ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env ruby
2
+ require 'doh/boot/app_pwd'
3
+ require 'doh/mysql/migrate'
4
+ require 'doh/mysql/version'
5
+ require 'doh/mysql/migrate_check'
6
+
7
+ opts = DohApp::Options.new(
8
+ {'database' => [DohApp::config['primary_database'], "-d", "--database <database>", "name of the database to migrate -- defaults to config['primary_database'], currently '#{DohApp::config['primary_database']}'"] \
9
+ ,'all' => [false, "-a", "--all", "operate on all databases"] \
10
+ ,'update' => [true, "-u", "--update", "migrate to the latest version (this is the default action)"] \
11
+ ,'rollback' => [nil, "-r", "--rollback", "rollback one version"] \
12
+ ,'version' => [nil, "-v", "--version <version>", "migrate to a specific version"] \
13
+ ,'check' => [false, "-c", "--check", "check the current unlocked migration for validity (no migrations will take place)"] \
14
+ ,'lock' => [false, "-l", "--lock", "lock the current unlocked migration, if any (no migrations will take place)"] \
15
+ ,'make_new' => [false, "-m", "--make-new", "make a new unlocked migration (or return the filenames of the current one if one already exists)"] \
16
+ })
17
+
18
+ if opts.database.to_s.empty? && !opts.all
19
+ puts "You must specify a database (either here with -d or in your config) or all (with -a)"
20
+ exit 1
21
+ end
22
+
23
+ if opts.all
24
+ database_ary = Dir.directories(File.join(DohApp::home, 'database'))
25
+ else
26
+ database_ary = [opts.database]
27
+ end
28
+
29
+ database_ary.each do |database|
30
+ if opts.check || opts.lock || opts.make_new
31
+ if opts.check
32
+ success, msg = DohDb::MigrateChecker.new(database).run
33
+ elsif opts.lock
34
+ success, msg = DohDb::update_locked_file(database)
35
+ elsif opts.make_new
36
+ success, msg = DohDb::DatabaseMigrator.new(database).get_unlocked_migration
37
+ end
38
+
39
+ if success
40
+ puts "'#{database}': succcess - " + msg
41
+ else
42
+ puts "***************** FAILURE for '#{database}' **********************"
43
+ puts msg
44
+ exit 1
45
+ end
46
+
47
+ next
48
+ end
49
+
50
+ dbmigrator = DohDb::DatabaseMigrator.new(database)
51
+ fret = if opts.version
52
+ dbmigrator.make_version(opts.version.to_i)
53
+ elsif opts.rollback
54
+ dbmigrator.rollback
55
+ else
56
+ dbmigrator.update
57
+ end
58
+
59
+ if fret.nil?
60
+ dohlog.info("'#{database}': no migration occurred")
61
+ else
62
+ msg = "'#{database}': version migrated from #{fret.first} to #{fret.last}"
63
+ dohlog.notify(msg)
64
+ puts msg
65
+ end
66
+ end
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- require 'doh/util/options'
2
+ require 'doh/boot/options'
3
3
  require 'doh/core/dir'
4
4
  require 'ruby_parser'
5
5
  require 'ruby2ruby'
data/bin/run_tests.rb CHANGED
@@ -1,11 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
- require 'doh/app/options'
2
+ require 'doh/boot/options'
3
3
 
4
4
  opts = DohApp::Options.new(
5
5
  {'filter' => [nil, "-f", "--filter <name>", "name or partial name of test method(s) to execute."] \
6
6
  ,'force_production' => [false, "-p", "--force_production", "override config to run only production (p, q) tests."] \
7
- ,'force_development' => [false, "-d", "--force_development", "override config to run only dev (d, p, i) tests."] \
7
+ ,'force_development' => [false, "-d", "--force_development", "override config to run only dev (d, p) tests."] \
8
+ ,'run_slow_tests' => [false, "-s", "--run_slow_tests", "runs slow tests."] \
8
9
  ,'repeat' => [1, "-r", "--repeat <times>", "number of times to repeat the tests."] \
10
+ ,'growl_notify' => [false, "-g", "--growl", "notifies via growl if something fails"] \
11
+ ,'seed' => [(Time.new.to_f * 1000).to_i, "-v", "--seed <seed_value>", "random seed"] \
9
12
  }, true, 'Files or directories may be specified to run tests on. Directories will be treated recursively. Defaults to the current directory.')
10
13
 
11
14
  def get_args_without_repeat(argv)
@@ -41,11 +44,18 @@ if repeat_count > 1
41
44
  end
42
45
  else
43
46
  require 'doh/app/init_unit_test'
44
- require 'doh/test/run_tests'
45
47
  DohApp::init_unit_test(start_dir)
48
+ require 'doh/test/run_tests'
49
+ dohlog.info("*******Using seed: #{opts.seed} for this test run")
50
+ srand(opts.seed.to_i)
51
+
46
52
  prod_flag = (DohApp::config['include_production_tests'] || opts.force_production) && !opts.force_development
53
+ ran_tests = false
47
54
  args.each do |arg|
48
- DohTest::run_tests(arg, prod_flag, opts.filter)
55
+ ran_tests = DohTest::run_tests(arg, prod_flag, opts.run_slow_tests, opts.filter, opts.growl_notify) || ran_tests
56
+ end
57
+ if !ran_tests
58
+ puts "No files were loaded."
59
+ exit(1)
49
60
  end
50
61
  end
51
-
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ require 'doh/boot/app_pwd'
3
+ require 'doh/core/dir'
4
+ require 'fileutils'
5
+
6
+ class UpdateRdoc
7
+ def run
8
+ do_subdir('lib')
9
+ apps_dir = File.join(DohApp::home, 'apps')
10
+ if File.directory?(apps_dir)
11
+ Dir.directories(apps_dir).each { |elem| do_subdir('apps/' + elem) }
12
+ end
13
+ end
14
+
15
+ private
16
+ def do_subdir(dest_subdir, src_subdir = nil)
17
+ src_dir = File.join(DohApp::home, src_subdir || dest_subdir)
18
+ return unless File.directory?(src_dir)
19
+ FileUtils::cd(src_dir)
20
+
21
+ dest_dir = File.join(DohApp::home, 'doc/source', dest_subdir)
22
+ cmd = "rdoc -aq -S --op #{dest_dir}"
23
+ dohlog.debug("executing: #{cmd}")
24
+ `#{cmd}`
25
+ end
26
+ end
27
+
28
+ UpdateRdoc.new.run
data/dohapp_home ADDED
File without changes
@@ -1,5 +1,4 @@
1
1
  require 'doh/app/config'
2
- require 'doh/mysql'
3
2
 
4
3
  module DohApp
5
4
 
@@ -9,19 +8,13 @@ def self.activate_database
9
8
  return unless root_cfg.key?('database')
10
9
  db_cfg = root_cfg['database']
11
10
  require 'doh/mysql'
11
+ require 'doh/mysql/require_dbtypes'
12
12
  conn = DohDb::CacheConnector.new(db_cfg['host'], db_cfg['username'], db_cfg['password'], db_cfg['database'] || root_cfg['primary_database'])
13
- row_builder = db_cfg['row_builder'] || root_cfg['row_builder'] || 'typed'
14
- if row_builder.is_a?(Class)
15
- conn.row_builder = row_builder
16
- elsif row_builder == 'typed'
17
- require 'doh/mysql/typed_row_builder'
18
- conn.row_builder = DohDb::TypedRowBuilder
19
- elsif row_builder == 'raw'
20
- # that's the default for the CacheConnector, don't need to do anything
21
- else
22
- raise "unrecognized database row_builder: #{row_builder.inspect}"
23
- end
13
+ conn.port = db_cfg['port']
14
+ conn.timeout = db_cfg['timeout'].to_i if db_cfg['timeout']
15
+ conn.row_builder = db_cfg['row_builder'] || root_cfg['row_builder']
24
16
  DohDb::set_connector_instance(conn)
17
+ DohDb::require_dbtypes
25
18
  end
26
19
 
27
20
  end
@@ -1,5 +1,6 @@
1
1
  require 'doh/app/config'
2
2
  require 'doh/logger/severity'
3
+ require 'doh/logger/socket_acceptor'
3
4
 
4
5
  module DohApp
5
6
 
@@ -25,39 +26,54 @@ def self.activate_logger
25
26
 
26
27
  # initialize logfile_name here, so it can be used later in the email acceptors below
27
28
  logfile_name = 'none'
28
- if acceptor_cfg = logger_cfg['file_acceptor']
29
- if acceptor_cfg.fetch('unique_filename', false)
29
+ if logger_cfg['enable_file_acceptor']
30
+ acceptor_cfg = logger_cfg['file_acceptor']
31
+ logfile_name = acceptor_cfg['filename']
32
+ if !logfile_name.nil?
33
+ # don't set it
34
+ elsif acceptor_cfg.fetch('unique_filename', false)
30
35
  logfile_name = File.basename($PROGRAM_NAME, '.rb') + ".#{Process.pid}" + '.log'
31
36
  else
32
37
  logfile_name = File.basename($PROGRAM_NAME, '.rb') + '.log'
33
38
  end
39
+ logfile_name = File.join(acceptor_cfg['log_directory'], logfile_name) if acceptor_cfg['log_directory']
34
40
  logfile = File.new(logfile_name, "w+")
35
41
  logfile.sync = true if acceptor_cfg.fetch('flush', false)
36
42
  file_acceptor = DohLogger::IOStreamAcceptor.new(logfile)
37
43
  file_acceptor.flush_always if acceptor_cfg.fetch('flush', false)
38
- Doh::log.add_acceptor(translate_logger_level(acceptor_cfg.fetch('severity', 'debug')), file_acceptor)
44
+ Doh::log.add_acceptor(translate_logger_level(acceptor_cfg.fetch('severity', 'debug')), file_acceptor, nil, acceptor_cfg['locations_to_exclude'], acceptor_cfg['include_only_locations'])
39
45
  end
40
46
 
41
- if acceptor_cfg = logger_cfg['stdout_acceptor']
42
- Doh::log.add_acceptor(translate_logger_level(acceptor_cfg.fetch('severity', 'debug')), DohLogger::IOStreamAcceptor.new)
47
+ if logger_cfg['enable_socket_acceptor']
48
+ acceptor_cfg = logger_cfg['socket_acceptor']
49
+ socket_acceptor = DohLogger::SocketAcceptor.new(acceptor_cfg.fetch('ip_addr', '127.0.0.1'), acceptor_cfg.fetch('port', DohLogger::SocketAcceptor::default_port))
50
+ Doh::log.add_acceptor(translate_logger_level(acceptor_cfg.fetch('severity', 'debug')), socket_acceptor, nil, acceptor_cfg['locations_to_exclude'], acceptor_cfg['include_only_locations'])
43
51
  end
44
52
 
45
- if acceptor_cfg = logger_cfg['notify_acceptor']
53
+ if logger_cfg['enable_stdout_acceptor']
54
+ acceptor_cfg = logger_cfg['stdout_acceptor']
55
+ locations_to_exclude = acceptor_cfg.key?('locations_to_exclude') ? acceptor_cfg['locations_to_exclude'] : ['DohDb']
56
+ Doh::log.add_acceptor(translate_logger_level(acceptor_cfg.fetch('severity', 'debug')), DohLogger::IOStreamAcceptor.new, nil, locations_to_exclude, acceptor_cfg['include_only_locations'])
57
+ end
58
+
59
+ if logger_cfg['enable_notify_acceptor']
60
+ acceptor_cfg = logger_cfg['notify_acceptor']
46
61
  require 'doh/logger/email_acceptor'
47
- mail_server = root_cfg['mail_server'] || 'mail.' + root_cfg['domain_name']
48
- from_address = acceptor_cfg['from_address'] || 'notify@' + root_cfg['domain_name']
62
+ mail_server = root_cfg['mail_server'] || 'mail.' + get_required_config_value('domain_name', 'mail_server or domain_name required for mail server')
63
+ from_address = acceptor_cfg['from_address'] || 'notify@' + get_required_config_value('domain_name', 'from_address or domain_name required for notification email address')
49
64
  to_address_list = acceptor_cfg['to_address_list'] || ['root@localhost']
50
65
  notify_acceptor = DohLogger::EmailAcceptor.new(mail_server, from_address, to_address_list, logfile_name, nil, DohLogger::exceptionless_email_format)
51
- Doh::log.add_acceptor(DohLogger::NOTIFY, notify_acceptor, true)
66
+ Doh::log.add_acceptor(DohLogger::NOTIFY, notify_acceptor, true, acceptor_cfg['locations_to_exclude'], acceptor_cfg['include_only_locations'])
52
67
  end
53
68
 
54
- if acceptor_cfg = logger_cfg['error_acceptor']
69
+ if logger_cfg['enable_error_acceptor']
70
+ acceptor_cfg = logger_cfg['error_acceptor']
55
71
  require 'doh/logger/email_acceptor'
56
- mail_server = root_cfg['mail_server'] || 'mail.' + root_cfg['domain_name']
57
- from_address = acceptor_cfg['from_address'] || 'error@' + root_cfg['domain_name']
72
+ mail_server = root_cfg['mail_server'] || 'mail.' + get_required_config_value('domain_name', 'mail_server or domain_name required for mail server')
73
+ from_address = acceptor_cfg['from_address'] || 'error@' + get_required_config_value('domain_name', 'from_address or domain_name required for notification email address')
58
74
  to_address_list = acceptor_cfg['to_address_list'] || ['root@localhost']
59
75
  error_acceptor = DohLogger::EmailAcceptor.new(mail_server, from_address, to_address_list, logfile_name)
60
- Doh::log.add_acceptor(DohLogger::ERROR, error_acceptor)
76
+ Doh::log.add_acceptor(DohLogger::ERROR, error_acceptor, nil, acceptor_cfg['locations_to_exclude'], acceptor_cfg['include_only_locations'])
61
77
  end
62
78
  end
63
79
 
@@ -1,4 +1,5 @@
1
1
  require 'doh/app/home'
2
+ require 'doh/logger/socket_acceptor'
2
3
 
3
4
  module DohApp
4
5
 
@@ -13,4 +14,21 @@ def self.config
13
14
  @@config
14
15
  end
15
16
 
17
+ def self.get_required_config_value(value, desc)
18
+ raise "Attempt to get configuration value: #{value.inspect}, but none exists. #{desc}" if !config.key?(value)
19
+ config[value]
20
+ end
21
+
22
+ def self.enable_notifies
23
+ logger_cfg = @@config['logger']
24
+ logger_cfg['enable_notify_acceptor'] = true
25
+ logger_cfg['enable_error_acceptor'] = true
26
+ end
27
+
28
+ def self.enable_socket_acceptor(port = DohLogger::SocketAcceptor::default_port)
29
+ logger_cfg = @@config['logger']
30
+ logger_cfg['enable_socket_acceptor'] = true
31
+ logger_cfg['socket_acceptor']['port'] = port
32
+ end
33
+
16
34
  end
data/lib/doh/app/home.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'doh/home'
2
+
1
3
  module DohApp
2
4
 
3
5
  def self.home
@@ -6,14 +8,7 @@ def self.home
6
8
  end
7
9
 
8
10
  def self.find_home(dir, max_tries = 20)
9
- path = File.expand_path(dir)
10
- raise "unable to find a DohApp home" if (path == '/') || (max_tries <= 0)
11
-
12
- if File.exist?(File.join(path, 'dohapp_home'))
13
- @@home = path
14
- else
15
- find_home(File.join(path, '..'), max_tries - 1)
16
- end
11
+ @@home = Doh::find_file_in_parents(dir, 'dohapp_home', max_tries = 20)
17
12
  end
18
13
 
19
14
  end
@@ -6,12 +6,25 @@ module DohApp
6
6
 
7
7
  def self.use_default_runnable_production_config
8
8
  root_cfg = DohApp::config
9
- file_acceptor_cfg = {'unique_filename' => true, 'flush' => false, 'severity' => 'debug'}
9
+ logger_cfg = {}
10
+
11
+ logger_cfg['file_acceptor'] = {'unique_filename' => true, 'flush' => false, 'severity' => 'debug'}
12
+ logger_cfg['enable_file_acceptor'] = true
13
+
10
14
  email_acceptor_cfg = {'to_address_list' => ["notify@#{DohApp::config['domain_name']}"]}
11
- logger_cfg = {'file_acceptor' => file_acceptor_cfg, 'notify_acceptor' => email_acceptor_cfg, 'error_acceptor' => email_acceptor_cfg.dup}
15
+ logger_cfg['notify_acceptor'] = email_acceptor_cfg
16
+ logger_cfg['error_acceptor'] = email_acceptor_cfg.dup
17
+ logger_cfg['enable_notify_acceptor'] = true
18
+ logger_cfg['enable_error_acceptor'] = true
19
+ logger_cfg['stdout_acceptor'] = {'severity' => 'debug'}
20
+ logger_cfg['enable_stdout_acceptor'] = false
21
+ logger_cfg['socket_acceptor'] = {'severity' => 'info'}
22
+ logger_cfg['enable_socket_acceptor'] = false
23
+
12
24
  root_cfg['logger'] = logger_cfg
13
25
  root_cfg['enable_logger'] = true
14
26
  root_cfg['host_files_directory'] = '/etc'
27
+ root_cfg['environment'] = 'production'
15
28
 
16
29
  require 'doh/util/internal_ip'
17
30
  Doh::set_source_ip(Doh::internal_ip)
@@ -19,14 +32,27 @@ end
19
32
 
20
33
  def self.use_default_runnable_development_config
21
34
  root_cfg = DohApp::config
22
- file_acceptor_cfg = {'unique_filename' => false, 'flush' => true, 'severity' => 'debug'}
23
- stdout_acceptor_cfg = {'severity' => 'debug'}
24
- logger_cfg = {'file_acceptor' => file_acceptor_cfg, 'stdout_acceptor' => stdout_acceptor_cfg}
35
+ logger_cfg = {}
36
+
37
+ logger_cfg['file_acceptor'] = {'unique_filename' => false, 'flush' => true, 'severity' => 'debug'}
38
+ logger_cfg['enable_file_acceptor'] = true
39
+
40
+ email_acceptor_cfg = {'to_address_list' => ['root@localhost']}
41
+ logger_cfg['notify_acceptor'] = email_acceptor_cfg
42
+ logger_cfg['error_acceptor'] = email_acceptor_cfg.dup
43
+ logger_cfg['enable_notify_acceptor'] = false
44
+ logger_cfg['enable_error_acceptor'] = false
45
+ logger_cfg['stdout_acceptor'] = {'severity' => 'debug'}
46
+ logger_cfg['enable_stdout_acceptor'] = true
47
+ logger_cfg['socket_acceptor'] = {'severity' => 'debug'}
48
+ logger_cfg['enable_socket_acceptor'] = false
49
+
25
50
  root_cfg['logger'] = logger_cfg
26
51
  root_cfg['enable_logger'] = true
27
52
  root_cfg['host_files_directory'] = '~/.dohruby'
28
53
  root_cfg['mail_server'] = 'localhost'
29
54
  root_cfg['database'] = {'username' => 'root', 'host' => 'localhost'}
55
+ root_cfg['environment'] = 'development'
30
56
 
31
57
  Doh::set_source_ip('127.0.0.1')
32
58
  end
@@ -40,7 +66,13 @@ def self.init_runnable(file_or_directory, block = nil)
40
66
  end
41
67
  block.call(DohApp::config) if block
42
68
  DohApp::activate_logger
43
- DohApp::activate_database
69
+ unless DohApp::config['dont_activate_database']
70
+ DohApp::activate_database
71
+ end
72
+ end
73
+
74
+ def self.init_runnable_dir(file_or_directory, &block)
75
+ DohApp::init_runnable(file_or_directory, block)
44
76
  end
45
77
 
46
78
  def self.init_runnable_prog(&block)
@@ -48,8 +80,7 @@ def self.init_runnable_prog(&block)
48
80
  end
49
81
 
50
82
  def self.init_runnable_pwd(&block)
51
- require 'fileutils'
52
- init_runnable(FileUtils::pwd, block)
83
+ init_runnable(Dir.pwd, block)
53
84
  end
54
85
 
55
86
  end
@@ -0,0 +1,19 @@
1
+ #this is for non-database applications that want logging
2
+ #in order to enable database, call DohApp::activate_database
3
+
4
+ require 'doh/app/init_runnable'
5
+ require 'doh/app/options'
6
+ home = ENV['DOH_HOME'] || '/etc/doh'
7
+ homefile = File.join(home, 'dohapp_home')
8
+ if !File.exists?(homefile)
9
+ raise "a file: '#{homefile}' must exist in a directory where you can create configuration information -- the file can be empty"
10
+ end
11
+ logdir = ENV['DOH_LOG_DIR'] || File.join(home, 'logs')
12
+ if !File.exists?(logdir)
13
+ raise "a directory: '#{logdir}' must exist for logs"
14
+ end
15
+
16
+ DohApp::init_runnable_dir(home) do |config|
17
+ config['logger']['file_acceptor']['log_directory'] = logdir
18
+ config['dont_activate_database'] = true
19
+ end
@@ -5,10 +5,12 @@ module DohApp
5
5
  def self.use_default_unit_test_development_config
6
6
  DohApp::config['database'] = {'username' => 'root', 'host' => 'localhost'}
7
7
  DohApp::config['include_production_tests'] = false
8
+ DohApp::config['environment'] = 'development'
8
9
  end
9
10
 
10
11
  def self.use_default_unit_test_production_config
11
- DohApp::config['include_production_tests'] = true
12
+ DohApp::config['include_production_tests'] = true
13
+ DohApp::config['environment'] = 'production'
12
14
  end
13
15
 
14
16
  def self.init_unit_test(file_or_directory)
@@ -18,6 +20,7 @@ def self.init_unit_test(file_or_directory)
18
20
  DohApp::use_default_unit_test_development_config
19
21
  end
20
22
  end
23
+ DohApp::config['testing'] = true
21
24
  end
22
25
 
23
26
  end
@@ -1,2 +1,2 @@
1
1
  require 'doh/app/init_runnable'
2
- DohApp::init_runnable_prog {|cfg| cfg['logger'].delete('stdout_acceptor')}
2
+ DohApp::init_runnable_prog { |cfg| cfg['logger']['enable_stdout_acceptor'] = false }
@@ -0,0 +1,2 @@
1
+ require 'doh/boot/find_dohruby'
2
+ require 'doh/app'
@@ -0,0 +1,2 @@
1
+ require 'doh/boot/find_dohruby'
2
+ require 'doh/app_pwd'
@@ -0,0 +1,5 @@
1
+ if RUBY_VERSION =~ /1\.8\./ then
2
+ require 'doh/boot/find_dohruby_18'
3
+ else
4
+ require 'doh/boot/find_dohruby_19'
5
+ end
@@ -0,0 +1,37 @@
1
+ module DohBoot
2
+
3
+ @@start_path = nil
4
+ #we want to start looking for dohruby at the first non-require file after we've seen doh/boot
5
+ current_caller = caller
6
+ seen_doh_boot = false
7
+ current_caller.each_with_index do |path, index|
8
+ seen_doh_boot ||= (path =~ /doh\/boot/)
9
+ current_caller[index] =~ /^([^:]*):/
10
+ currentfile = $1
11
+ current_caller[index+1] =~ /^([^:]*):/
12
+ nextfile = $1
13
+ if !@@start_path && seen_doh_boot && path =~ /require\.rb\:\d+\:in \`require\'$/ && (nextfile != currentfile) && (current_caller[index+1] =~ /.*\d+$/)
14
+ @@start_path = nextfile
15
+ break
16
+ end
17
+ end
18
+
19
+ def self.find_dohruby_in_parents(dir, max_tries = 20)
20
+ path = File.expand_path(dir)
21
+ raise "unable to find dohruby" if (path == '/') || (max_tries <= 0)
22
+
23
+ if File.exist?(File.join(path, 'dohruby'))
24
+ return File.join(path, 'dohruby')
25
+ else
26
+ return find_dohruby_in_parents(File.join(path, '..'), max_tries - 1)
27
+ end
28
+ end
29
+
30
+ if !$LOAD_PATH.find {|dir| dir =~ /dohruby\/lib/}
31
+ dohruby_path = DohBoot::find_dohruby_in_parents(File.dirname(@@start_path))
32
+ if File.exist?(dohruby_path)
33
+ $LOAD_PATH.push(File.join(dohruby_path, 'lib'))
34
+ end
35
+ end
36
+
37
+ end