dohruby 0.2.1 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
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