app-ctx 0.1.4 → 0.1.6

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.
@@ -1,3 +1,34 @@
1
+ == 0.1.6 / 2007-02-17
2
+
3
+ * repacked with hoe
4
+
5
+ Sat Feb 17 10:56:36 CET 2007 dirk@sebrink.de
6
+ * class#method entrypoints added and hash pimping tested and fixed
7
+
8
+ Sun Feb 11 15:59:24 CET 2007 dirk@sebrink.de
9
+ * proof-of-concept: loading plain ruby values from file
10
+
11
+ Sun Feb 11 15:58:48 CET 2007 dirk@sebrink.de
12
+ * customized :entrypoints
13
+
14
+ Sun Feb 11 15:57:36 CET 2007 dirk@sebrink.de
15
+ * minor
16
+
17
+ Sat Dec 2 22:03:46 CET 2006 dirk@sebrink.de
18
+ * new: forward
19
+
20
+ Thu Nov 2 16:42:56 CET 2006 dirk@sebrink.de
21
+ * bugfix: rdoc include missing for ruby 1.8.5
22
+
23
+ Thu Nov 2 16:40:37 CET 2006 dirk@sebrink.de
24
+ * bug fix: rdoc include needed for ruby 1.8.5 version
25
+
26
+ Sun Oct 29 10:10:32 CET 2006 dirk@sebrink.de
27
+ * made gemspec file autobuilding
28
+
29
+ Sat Oct 21 12:23:02 CEST 2006 dirk@sebrink.de
30
+ * n
31
+
1
32
  Sat Oct 21 11:45:50 CEST 2006 dirk@sebrink.de
2
33
  * added examples to gemspec
3
34
 
@@ -66,3 +97,4 @@ Thu Aug 24 18:05:58 CEST 2006 dirk@sebrink.de
66
97
 
67
98
  Wed Aug 23 12:12:00 CEST 2006 dirk@sebrink.de
68
99
  * new repository
100
+
@@ -0,0 +1,17 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/app-ctx.rb
6
+ lib/app-ctx
7
+ lib/app-ctx/dlog.rb
8
+ test/config-1.yml
9
+ test/config-2.yml
10
+ test/plain-ruby-as-config-dsl.rb
11
+ test/test_app-ctx.rb
12
+ examples/boolean.rb
13
+ examples/conversions.rb
14
+ examples/ruby_conv.rb
15
+ examples/run_with_block.rb
16
+ examples/run_with_class.rb
17
+ examples/set_default_values.rb
@@ -0,0 +1,151 @@
1
+ app-ctx
2
+ by dirk luesebrink
3
+ http://www.sofasportler.de/dirk.blog
4
+
5
+ == DESCRIPTION:
6
+
7
+ Every application needs configuration and app-ctx provides a concise way of
8
+ doing it.
9
+
10
+ For all applications (you are not a mouseclicker, are u?), once in a while
11
+ you need to supply some configuration values to overrule the built-in
12
+ defaults. The app-ctx gem does unify and organize built-in constants,
13
+ config files and commandline option with a clearly defined priority, from
14
+ low to high:
15
+
16
+ - procedural: set from your implementation App::Config#set_default_values
17
+ - YAML default values file loaded from next to the $0 script
18
+ - user supplied configuration file, eg.: --config=/tmp/foo.yml
19
+ - command line options and flags: --foo --bar=foo
20
+
21
+ But for your application it is of no interesst from where the values are
22
+ coming: command line option: "--port=1234", a user configuration file or
23
+ from the applications built-in default values. Therefor +app-ctx+ combines
24
+ value settings from various sources into a single configuration hash.
25
+
26
+ == SYNOPSIS:
27
+
28
+ (hint: see also the examples dir)
29
+ basically you have two ways to use it:
30
+
31
+ require 'app-ctx' # of course,and than...
32
+
33
+ 1. closures (see examples/run_with_block.rb)
34
+
35
+ App::ctx.run do |context| ... end
36
+
37
+ where context object provides:
38
+
39
+ values: the combined key and value settings
40
+ argv: remaining argument(not the options) of the command line
41
+ defaults_path: full path to the defaults file
42
+
43
+
44
+ 2. with a mainclass(see examples/run_with_class.rb)
45
+
46
+ App::run :class => Simple
47
+
48
+ for the second case(with a mainclass) an application instance of this class
49
+ is created. The first argument is than taken as method name and executed,
50
+ again with a context oject provided.
51
+
52
+ $ ruby example/run_with_class show
53
+
54
+ will result in the :show method beeing called:
55
+
56
+ context = Config.new...
57
+ ...
58
+ app = Simple.new...
59
+ app.show(context)
60
+
61
+
62
+ = String/Type mappings
63
+
64
+ Commandline options are strings only, but sometimes you need strongly typed
65
+ primitive values. +app-ctx+ does automatically convert integer and float
66
+ values, see "examples/conversions.rb" for:
67
+
68
+ $ ./examples/conversions.rb
69
+ {:i=>23, :f=>3.14}
70
+ typeof 'i': Fixnum
71
+ typeof 'f': Float
72
+
73
+ $ ./examples/conversions.rb -i=17 -f=2.12
74
+ {:i=>17, :f=>2.12}
75
+ typeof 'i': Fixnum
76
+ typeof 'f': Float
77
+
78
+ $ ./examples/conversions.rb -i=i -f=f
79
+ {:i=>"i", :f=>"f"}
80
+ typeof 'i': String
81
+ typeof 'f': String
82
+
83
+
84
+ == Flags/Boolean values
85
+
86
+ Flags(options without values) are converted to boolean values, see
87
+ examples/boolean.rb:
88
+
89
+ $ ruby ./examples/boolean.rb
90
+ {:bool=>false}
91
+ typeof 'bool': FalseClass
92
+
93
+ $ ruby ./examples/boolean.rb --bool
94
+ {:bool=>true}
95
+ typeof 'bool': TrueClass
96
+
97
+
98
+ == Ruby Conversions
99
+
100
+ When Fixnum, Float and boolean conversion are not enough, as a last resort,
101
+ you can use ruby code directly for evaluation of option values. Replacing
102
+ '=' with ':' results in assigning the ruby evaluation value to the key, see
103
+ examples/ruby_conv.rb:
104
+
105
+ $ ruby ./examples/ruby_conv.rb
106
+ {:r=>1..10, :a=>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
107
+ typeof 'r': Range
108
+ typeof 'a': Array
109
+
110
+ $ ruby ./examples/ruby_conv.rb -r:2..3 -a:'(-1..1).to_a'
111
+ {:r=>2..3, :a=>[-1, 0, 1]}
112
+ typeof 'r': Range
113
+ typeof 'a': Array
114
+
115
+ $ ruby ./examples/ruby_conv.rb -r:2..3 -a:\(-1..1\).to_a
116
+ {:r=>2..3, :a=>[-1, 0, 1]}
117
+ typeof 'r': Range
118
+ typeof 'a': Array
119
+
120
+ == REQUIREMENTS:
121
+
122
+ * the hoe gem
123
+
124
+ == INSTALL:
125
+
126
+ * sudo gem install app-ctx --include-dependencies
127
+
128
+ == LICENSE:
129
+
130
+ (The MIT License)
131
+
132
+ Copyright (c) 2007 FIX
133
+
134
+ Permission is hereby granted, free of charge, to any person obtaining
135
+ a copy of this software and associated documentation files (the
136
+ 'Software'), to deal in the Software without restriction, including
137
+ without limitation the rights to use, copy, modify, merge, publish,
138
+ distribute, sublicense, and/or sell copies of the Software, and to
139
+ permit persons to whom the Software is furnished to do so, subject to
140
+ the following conditions:
141
+
142
+ The above copyright notice and this permission notice shall be
143
+ included in all copies or substantial portions of the Software.
144
+
145
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
146
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
147
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
148
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
149
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
150
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
151
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,15 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/app-ctx.rb'
6
+
7
+ Hoe.new('app-ctx', App::VERSION) do |p|
8
+ p.rubyforge_name = 'app-ctx'
9
+ p.summary = "Every application needs configuration and app-ctx provides a concise way of doing it."
10
+ p.description = p.paragraphs_of('README.txt', 2..4).join("\n\n")
11
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
12
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
13
+ end
14
+
15
+ # vim: syntax=Ruby
@@ -1,12 +1,14 @@
1
-
2
1
  require 'yaml'
3
2
  require 'rdoc/rdoc'
4
3
  require 'rdoc/usage'
5
4
 
5
+ $:.unshift File.dirname(__FILE__)
6
6
  require 'app-ctx/dlog'
7
7
 
8
8
  module App
9
9
 
10
+ VERSION = '0.1.6'
11
+
10
12
  # the priority of configuation settings is:
11
13
  # 1. command line options
12
14
  # 2. configuration from custom file, eg.: --config=/tmp/foo.yml
@@ -39,6 +41,14 @@ module App
39
41
  @values = defaults.merge(@values)
40
42
  end
41
43
 
44
+ # continue processing of command line with next argument from cmdline
45
+ def forward(target)
46
+ begin
47
+ (op = argv.shift) && target.send(op, self)
48
+ rescue ArgumentError => e
49
+ target.send(op)
50
+ end
51
+ end
42
52
 
43
53
  def to_s
44
54
  <<-EOT
@@ -139,7 +149,7 @@ module App
139
149
 
140
150
  thank you, good bye and have a nice day
141
151
 
142
- EOM
152
+ EOM
143
153
  }
144
154
 
145
155
  def inform message_id, binding
@@ -151,7 +161,13 @@ module App
151
161
  @context = context
152
162
  end
153
163
 
154
- def execute clazz = nil
164
+ def execute opts = {}
165
+
166
+ tmp = opts[:entrypoint] || :application_main
167
+ entrypoint, clazz = tmp.to_s.split("#").reverse
168
+ clazz = eval "#{clazz ||= opts[:class]}"
169
+
170
+ pimp_my_hash(@context.values)
155
171
 
156
172
  if block_given?
157
173
  warn "attached block takes precedence over class!" if clazz
@@ -165,11 +181,12 @@ module App
165
181
  setter_injection app, @context
166
182
 
167
183
  begin
184
+ pimp_my_hash(@context.values) # XXX refresh lost pimping
168
185
  # first try the default entry point
169
- app.application_main @context
186
+ app.send(entrypoint, @context)
170
187
 
171
188
  rescue NoMethodError => e
172
- if app.respond_to? :application_main
189
+ if app.respond_to?(entrypoint)
173
190
  DL.logger.error "failed invokation", e
174
191
  else
175
192
  if 0 == @context.argv.length
@@ -182,6 +199,8 @@ module App
182
199
  begin
183
200
  op = @context.argv.shift
184
201
  app.send(op, @context)
202
+ rescue ArgumentError => e
203
+ app.send(op)
185
204
  rescue => e
186
205
  DL.logger.error "oops: #{e}", e
187
206
  end
@@ -192,6 +211,22 @@ module App
192
211
  app # the created application instance
193
212
  end
194
213
 
214
+ def pimp_my_hash(h) # as seen on why/redhanded the first time
215
+ class << h
216
+ def method_missing(m,*a)
217
+ if m.to_s =~ /=$/
218
+ self[$`.to_sym] = a[0]
219
+ elsif a.empty?
220
+ self[m]
221
+ else
222
+ raise NoMethodError, "#{m}"
223
+ end
224
+ end
225
+ end
226
+ h
227
+ end
228
+ private :pimp_my_hash
229
+
195
230
  # IoC setter dependency injection:
196
231
  # try all context keys as setter class
197
232
  def setter_injection obj, context
@@ -216,7 +251,7 @@ module App
216
251
  if block_given?
217
252
  container.execute {|context| block.call(context) }
218
253
  else
219
- container.execute params[:class]
254
+ container.execute(params)
220
255
  end
221
256
  end
222
257
 
@@ -0,0 +1,5 @@
1
+ :f: 3.21
2
+ :i: 17
3
+ :empty_hash: {}
4
+ :assoc:
5
+ :key: "foo"
@@ -0,0 +1,3 @@
1
+ :f2: -3.21
2
+ :assoc:
3
+ :key: "bar"
@@ -0,0 +1,14 @@
1
+
2
+ title = "plain ruby as config file DSL"
3
+
4
+ comment = %Q{
5
+ this file gets loaded on startup and local varibles in-here thereafter
6
+ become available as part of the global configuration};
7
+
8
+ require 'date'
9
+ birthday = Date.parse "2007-11-16"
10
+
11
+ float_value = 1.234
12
+ int_value = 1234
13
+
14
+ some_string = %q{the quick brown...}
@@ -8,6 +8,36 @@ require 'app-ctx'
8
8
 
9
9
  class AppModuleTest < Test::Unit::TestCase
10
10
 
11
+ def load_values_from_file(filepath)
12
+ b = binding
13
+ v1 = eval "local_variables", b
14
+ eval IO.read(filepath), b
15
+ v2 = eval "local_variables", b
16
+ (v2 - v1).inject({}) do |c, key|
17
+ c[key.to_sym] = eval "#{key}", b
18
+ c
19
+ end
20
+ end
21
+
22
+ def test_load_values_from_file
23
+ puts "\n --> #{self.name}"
24
+ filename = File.join(File.dirname(__FILE__), "plain-ruby-as-config-dsl.rb")
25
+ c = load_values_from_file(filename)
26
+ assert_kind_of Hash, c
27
+ #assert_equal 6, c.size
28
+ expect = {
29
+ :float_value => 1.234,
30
+ :int_value => 1234,
31
+ :some_string => "the quick brown...",
32
+ :title => "plain ruby as config file DSL",
33
+ :comment => %Q{
34
+ this file gets loaded on startup and local varibles in-here thereafter
35
+ become available as part of the global configuration},
36
+ :birthday => Date.parse("2007-11-16"),
37
+ }
38
+ assert_equal expect, c
39
+ end
40
+
11
41
  class With_application_main
12
42
  attr_reader :context
13
43
  attr_accessor :baroque
@@ -36,6 +66,32 @@ class AppModuleTest < Test::Unit::TestCase
36
66
  @context = context
37
67
  end
38
68
  end
69
+
70
+ def test_customized_entrypoint
71
+ puts "\n --> #{self.name}"
72
+ argv = ["-f", "--foo=bar", "arg1", "arg2"]
73
+ app = App::run :entrypoint => :entrypoint, :class => ArgumentEntryPoint, :argv => argv
74
+ assert_not_nil app
75
+ assert_equal ArgumentEntryPoint, app.class
76
+ assert_not_nil app.context
77
+ assert_equal({:f=>true, :foo=>"bar"}, app.context.values)
78
+ assert_equal ["arg1", "arg2"], app.context.argv
79
+ end
80
+
81
+ def test_class_method_entrypoint
82
+ puts "\n --> #{self.name}"
83
+ argv = ["-f", "--foo=bar", "arg1", "arg2"]
84
+ app = App::run :entrypoint => "AppModuleTest::ArgumentEntryPoint#entrypoint", :argv => argv
85
+ assert_not_nil app
86
+ assert_equal ArgumentEntryPoint, app.class
87
+ assert_not_nil app.context
88
+ assert_equal({:f=>true, :foo=>"bar"}, app.context.values)
89
+ assert_equal ["arg1", "arg2"], app.context.argv
90
+
91
+ assert_equal true, app.context.values.f
92
+ assert_equal "bar", app.context.values.foo
93
+ end
94
+
39
95
  def test_run_without_point
40
96
  puts "\n --> #{self.name}"
41
97
  argv = ["-f", "--foo=bar", "entrypoint", "first_method_arg"]
@@ -45,6 +101,9 @@ class AppModuleTest < Test::Unit::TestCase
45
101
  assert_not_nil app.context
46
102
  assert_equal({:f=>true, :foo=>"bar"}, app.context.values)
47
103
  assert_equal ["first_method_arg"], app.context.argv
104
+
105
+ assert_equal true, app.context.values.f
106
+ assert_equal "bar", app.context.values.foo
48
107
  end
49
108
 
50
109
  end
@@ -53,19 +112,33 @@ class AppConfigTest < Test::Unit::TestCase
53
112
 
54
113
  include App
55
114
 
115
+ def test_forward
116
+ puts "\n --> #{self.name}"
117
+ class << (recorder = Object.new)
118
+ def c; "c"; end
119
+ def method_missing(m, *args, &blk)
120
+ args.first.forward(self)
121
+ end
122
+ end
123
+ c = Config.new :argv => ["a", "b", "c"]
124
+ assert_equal "c", c.forward(recorder)
125
+ end
126
+
56
127
  def test_config_block
57
128
  puts "\n --> #{self.name}"
58
- App::Config.new do |context|
129
+ App::run do |context|
59
130
  puts "--------------->context: #{context.inspect}"
60
131
  assert_not_nil context
61
132
  assert_equal({}, context.values)
62
133
  end
63
134
 
64
- App::Config.new :argv=>["-f", "--foo=bar", "arg1", "arg2"] do |context|
135
+ App::run(:argv=>["-f", "--foo=bar", "arg1", "arg2"]) do |context|
65
136
  puts "--------------->context: #{context.inspect}"
66
137
  assert_not_nil context
67
138
  assert_equal({:f=>true, :foo=>"bar"}, context.values)
68
139
  assert_equal ["arg1", "arg2"], context.argv
140
+ assert_equal true, context.values.f
141
+ assert_equal "bar", context.values.foo
69
142
  end
70
143
  end
71
144
 
@@ -73,17 +146,17 @@ class AppConfigTest < Test::Unit::TestCase
73
146
  puts "\n --> #{self.name}"
74
147
  c = App::Config.new
75
148
  # config file does not exist:w
76
- c.load_config_file File.join(File.dirname($0), "no-such-file")
149
+ c.load_config_file File.join(File.dirname(__FILE__), "no-such-file")
77
150
  assert_equal({}, c.values)
78
151
 
79
152
  # load configuration from file
80
- c.load_config_file File.join(File.dirname($0), "config-1.yml")
153
+ c.load_config_file File.join(File.dirname(__FILE__), "config-1.yml")
81
154
  assert_equal({
82
155
  :f=>3.21, :i=>17, :empty_hash=>{}, :assoc=>{:key=>"foo"}
83
156
  }, c.values)
84
157
 
85
158
  # config overloading
86
- c.load_config_file File.join(File.dirname($0), "config-2.yml")
159
+ c.load_config_file File.join(File.dirname(__FILE__), "config-2.yml")
87
160
  assert_equal({
88
161
  :f=>3.21, :i=>17, :empty_hash=>{},
89
162
  :assoc=>{:key=>"bar"}, :f2=>-3.21
@@ -97,8 +170,8 @@ class AppConfigTest < Test::Unit::TestCase
97
170
  assert_equal({}, c.values)
98
171
 
99
172
  # find the default values config file next to the $0 script
100
- puts "script: #{$0}"
101
- assert_equal File.expand_path($0).sub(/.rb$/, ".yml"), c.defaults_path
173
+ puts "script: #{$0}"
174
+ assert_equal File.expand_path($0).sub(/(.rb)?$/, ".yml"), c.defaults_path
102
175
  end
103
176
 
104
177
  def test_config_path
metadata CHANGED
@@ -3,15 +3,15 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: app-ctx
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.4
7
- date: 2006-11-02 00:00:00 +01:00
8
- summary: command line application startup and config context
6
+ version: 0.1.6
7
+ date: 2007-02-17 00:00:00 +01:00
8
+ summary: Every application needs configuration and app-ctx provides a concise way of doing it.
9
9
  require_paths:
10
10
  - lib
11
- email: dirk@sebrink.de
12
- homepage: http://www.sofasportler.de/dirk.blog/category/coding/ruby/, http://www.sebrink.de/
13
- rubyforge_project:
14
- description:
11
+ email: ryand-ruby@zenspider.com
12
+ homepage: " by dirk luesebrink"
13
+ rubyforge_project: app-ctx
14
+ description: "For all applications (you are not a mouseclicker, are u?), once in a while you need to supply some configuration values to overrule the built-in defaults. The app-ctx gem does unify and organize built-in constants, config files and commandline option with a clearly defined priority, from low to high: - procedural: set from your implementation App::Config#set_default_values - YAML default values file loaded from next to the $0 script - user supplied configuration file, eg.: --config=/tmp/foo.yml - command line options and flags: --foo --bar=foo But for your application it is of no interesst from where the values are coming: command line option: \"--port=1234\", a user configuration file or from the applications built-in default values. Therefor +app-ctx+ combines value settings from various sources into a single configuration hash."
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
@@ -26,32 +26,44 @@ platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
28
  authors:
29
- - Dirk Luesebrink
29
+ - Ryan Davis
30
30
  files:
31
+ - History.txt
32
+ - Manifest.txt
33
+ - README.txt
34
+ - Rakefile
35
+ - lib/app-ctx.rb
36
+ - lib/app-ctx
37
+ - lib/app-ctx/dlog.rb
38
+ - test/config-1.yml
39
+ - test/config-2.yml
40
+ - test/plain-ruby-as-config-dsl.rb
41
+ - test/test_app-ctx.rb
31
42
  - examples/boolean.rb
32
43
  - examples/conversions.rb
33
44
  - examples/ruby_conv.rb
34
45
  - examples/run_with_block.rb
35
46
  - examples/run_with_class.rb
36
47
  - examples/set_default_values.rb
37
- - lib/app-ctx.rb
38
- - lib/app-ctx/dlog.rb
39
- - test/t_app-ctx.rb
40
- - CHANGELOG
41
- - README
42
48
  test_files:
43
- - test/t_app-ctx.rb
44
- rdoc_options:
45
- - --main
46
- - README
47
- extra_rdoc_files:
48
- - CHANGELOG
49
- - README
49
+ - test/test_app-ctx.rb
50
+ rdoc_options: []
51
+
52
+ extra_rdoc_files: []
53
+
50
54
  executables: []
51
55
 
52
56
  extensions: []
53
57
 
54
58
  requirements: []
55
59
 
56
- dependencies: []
57
-
60
+ dependencies:
61
+ - !ruby/object:Gem::Dependency
62
+ name: hoe
63
+ version_requirement:
64
+ version_requirements: !ruby/object:Gem::Version::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.0
69
+ version:
data/README DELETED
@@ -1,118 +0,0 @@
1
- #
2
- # = Application Context
3
- #
4
- # Every application needs configuration and app-ctx provides a concise way of
5
- # doing it.
6
- #
7
- # For all applications (you are not a mouseclicker, are u?), once in a while
8
- # you need to supply some configuration values to overrule the built-in
9
- # defaults. The app-ctx gem does unify and organize built-in constants,
10
- # config files and commandline option with a clearly defined priority, from
11
- # low to high:
12
- #
13
- # - procedural: App::Config#set_default_values
14
- # - default values YAML file from next to the $0 script
15
- # - user supplied configuration file, eg.: --config=/tmp/foo.yml
16
- # - command line options and flags: --foo --bar=foo
17
- #
18
- # But for your application it is of no interesst from where the values are
19
- # coming: command line option: "--port=1234", a user configuration file or
20
- # from the applications built-in default values. Therefor +app-ctx+ combines
21
- # value settings from various sources into a single configuration hash.
22
- #
23
- # basically you have two ways to use it:
24
- #
25
- # require 'app-ctx' # of course,and than...
26
- #
27
- # 1. closures (see examples/run_with_block.rb)
28
- #
29
- # App::ctx.run do |context| ... end
30
- #
31
- # where context object provides:
32
- #
33
- # values: the combined key and value settings
34
- # argv: remaining argument(not the options) of the command line
35
- # defaults_path: full path to the defaults file
36
- #
37
- #
38
- # 2. with a mainclass(see examples/run_with_class.rb)
39
- #
40
- # App::ctx.run YourClassHere
41
- #
42
- # for the second case(with a mainclass) an application instance of this class
43
- # is created. The first argument is than taken as method name and executed,
44
- # again with a context oject provided.
45
- #
46
- # $ ruby example/run_with_class show
47
- #
48
- # will result in the :show method beeing called:
49
- #
50
- # context = Config.new...
51
- # ...
52
- # app = Simple.new...
53
- # app.show(context)
54
- #
55
- #
56
- # == Conversions
57
- #
58
- # Commandline options are strings only, but sometimes you need strongly typed
59
- # primitive values. +app-ctx+ does automatically convert integer and float
60
- # values, see "examples/conversions.rb" for:
61
- #
62
- # $ ./examples/conversions.rb
63
- # {:i=>23, :f=>3.14}
64
- # typeof 'i': Fixnum
65
- # typeof 'f': Float
66
- #
67
- # $ ./examples/conversions.rb -i=17 -f=2.12
68
- # {:i=>17, :f=>2.12}
69
- # typeof 'i': Fixnum
70
- # typeof 'f': Float
71
- #
72
- # $ ./examples/conversions.rb -i=i -f=f
73
- # {:i=>"i", :f=>"f"}
74
- # typeof 'i': String
75
- # typeof 'f': String
76
- #
77
- #
78
- # == Flags/Boolean values
79
- #
80
- # Flags(options without values) are converted to boolean values, see
81
- # examples/boolean.rb:
82
- #
83
- # $ ruby ./examples/boolean.rb
84
- # {:bool=>false}
85
- # typeof 'bool': FalseClass
86
- #
87
- # $ ruby ./examples/boolean.rb --bool
88
- # {:bool=>true}
89
- # typeof 'bool': TrueClass
90
- #
91
- #
92
- # == Ruby Conversions
93
- #
94
- # When Fixnum, Float and boolean conversion are not enough, as a last resort,
95
- # you can use ruby code directly for evaluation of option values. Replacing
96
- # '=' with ':' results in assigning the ruby evaluation value to the key, see
97
- # examples/ruby_conv.rb:
98
- #
99
- # $ ruby ./examples/ruby_conv.rb
100
- # {:r=>1..10, :a=>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
101
- # typeof 'r': Range
102
- # typeof 'a': Array
103
- #
104
- # $ ruby ./examples/ruby_conv.rb -r:2..3 -a:'(-1..1).to_a'
105
- # {:r=>2..3, :a=>[-1, 0, 1]}
106
- # typeof 'r': Range
107
- # typeof 'a': Array
108
- #
109
- # $ ruby ./examples/ruby_conv.rb -r:2..3 -a:\(-1..1\).to_a
110
- # {:r=>2..3, :a=>[-1, 0, 1]}
111
- # typeof 'r': Range
112
- # typeof 'a': Array
113
- #
114
- #
115
- # have fun
116
- # dirk
117
- #
118
- # vim: set tw=80 syntax=txt nosmartindent: