facets 2.7.0 → 2.8.0

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 (130) hide show
  1. data/HISTORY.rdoc +135 -294
  2. data/MANIFEST +40 -91
  3. data/NOTES +1 -1
  4. data/README.rdoc +10 -8
  5. data/Rakefile +11 -34
  6. data/demo/{hook.rd → hook.rdoc} +2 -0
  7. data/demo/{scenario_require.rd → scenario_require.rdoc} +3 -0
  8. data/lib/core/facets-live.rb +7 -5
  9. data/lib/core/facets.rb +379 -359
  10. data/lib/core/facets/array/conjoin.rb +2 -2
  11. data/lib/core/facets/array/pad.rb +1 -1
  12. data/lib/core/facets/array/recursively.rb +2 -2
  13. data/lib/core/facets/array/splice.rb +1 -1
  14. data/lib/core/facets/binding/caller.rb +2 -4
  15. data/lib/core/facets/comparable/comparable.rb +2 -2
  16. data/lib/core/facets/dir/ascend.rb +3 -0
  17. data/lib/core/facets/dir/recurse.rb +4 -0
  18. data/lib/core/facets/duplicable.rb +6 -8
  19. data/lib/core/facets/enumerable/count.rb +22 -13
  20. data/lib/core/facets/enumerable/map_detect.rb +28 -0
  21. data/lib/core/facets/enumerable/mash.rb +13 -5
  22. data/lib/core/facets/enumerable/per.rb +3 -1
  23. data/lib/core/facets/hash/count.rb +14 -0
  24. data/lib/core/facets/hash/data.rb +14 -0
  25. data/lib/core/facets/kernel/__method__.rb +1 -1
  26. data/lib/core/facets/kernel/d.rb +9 -8
  27. data/lib/core/facets/kernel/eigenclass.rb +20 -0
  28. data/lib/core/facets/kernel/extend.rb +10 -0
  29. data/lib/core/facets/kernel/instance_class.rb +1 -0
  30. data/lib/core/facets/kernel/instance_variables.rb +6 -6
  31. data/lib/core/facets/kernel/meta_alias.rb +18 -0
  32. data/lib/core/facets/kernel/meta_class.rb +17 -0
  33. data/lib/core/facets/kernel/meta_def.rb +18 -0
  34. data/lib/core/facets/kernel/meta_eval.rb +18 -0
  35. data/lib/core/facets/kernel/object_hexid.rb +21 -6
  36. data/lib/core/facets/kernel/object_state.rb +4 -2
  37. data/lib/core/facets/kernel/populate.rb +3 -1
  38. data/lib/core/facets/kernel/with.rb +1 -1
  39. data/lib/core/facets/metaid.rb +6 -93
  40. data/lib/core/facets/module/class_def.rb +2 -0
  41. data/lib/core/facets/module/extend.rb +10 -11
  42. data/lib/core/facets/module/is.rb +5 -5
  43. data/lib/core/facets/module/module_def.rb +31 -0
  44. data/lib/core/facets/string/camelcase.rb +14 -12
  45. data/lib/core/facets/string/cleanlines.rb +35 -0
  46. data/lib/core/facets/string/edit_distance.rb +62 -0
  47. data/lib/core/facets/string/indent.rb +86 -4
  48. data/lib/core/facets/string/index_all.rb +24 -0
  49. data/lib/core/facets/string/lines.rb +3 -6
  50. data/lib/core/facets/string/margin.rb +2 -1
  51. data/lib/core/facets/string/newlines.rb +35 -0
  52. data/lib/core/facets/string/op_div.rb +14 -0
  53. data/lib/core/facets/string/range.rb +2 -22
  54. data/lib/core/facets/string/range_all.rb +1 -0
  55. data/lib/core/facets/string/range_of_line.rb +1 -0
  56. data/lib/core/facets/string/similarity.rb +92 -0
  57. data/lib/core/facets/string/start_with.rb +6 -6
  58. data/lib/core/facets/string/titlecase.rb +1 -1
  59. data/lib/more/facets/basicobject.rb +16 -15
  60. data/lib/more/facets/blankslate.rb +8 -0
  61. data/lib/more/facets/class_extend.rb +126 -1
  62. data/lib/more/facets/continuation.rb +53 -54
  63. data/lib/more/facets/dictionary.rb +9 -63
  64. data/lib/more/facets/erb.rb +63 -0
  65. data/lib/more/facets/filelist.rb +5 -5
  66. data/lib/more/facets/hashbuilder.rb +101 -0
  67. data/lib/more/facets/inheritor.rb +36 -45
  68. data/lib/more/facets/ini.rb +267 -0
  69. data/lib/more/facets/instance_eval.rb +4 -4
  70. data/lib/more/facets/ioredirect.rb +7 -60
  71. data/lib/more/facets/linkedlist.rb +195 -0
  72. data/lib/more/facets/matcher.rb +140 -0
  73. data/lib/more/facets/memoizer.rb +64 -0
  74. data/lib/more/facets/methodspace.rb +9 -4
  75. data/lib/more/facets/module/class_extend.rb +2 -121
  76. data/lib/more/facets/ostruct.rb +9 -9
  77. data/lib/more/facets/pathlist.rb +1 -9
  78. data/lib/more/facets/pathname.rb +11 -4
  79. data/lib/more/facets/plugin_manager.rb +50 -0
  80. data/lib/more/facets/random.rb +25 -3
  81. data/lib/more/facets/roman.rb +174 -0
  82. data/lib/more/facets/semaphore.rb +92 -0
  83. data/lib/more/facets/shellwords.rb +21 -48
  84. data/lib/more/facets/succ.rb +1 -1
  85. data/meta/{modified → released} +0 -0
  86. data/meta/repository +1 -0
  87. data/meta/suite +1 -0
  88. data/meta/version +1 -1
  89. data/script/conflicts +63 -0
  90. data/script/methods +49 -0
  91. data/test/core/binding/test_caller.rb +11 -4
  92. data/test/core/enumerable/test_count.rb +19 -10
  93. data/test/core/enumerable/test_map_detect.rb +75 -0
  94. data/test/core/enumerable/test_take.rb +1 -1
  95. data/test/core/kernel/test_object_hexid.rb +2 -1
  96. data/test/core/proc/test_to_method.rb +1 -1
  97. data/test/core/string/test_cleanlines.rb +11 -0
  98. data/test/core/string/test_indent.rb +66 -4
  99. data/test/core/string/test_lines.rb +2 -1
  100. data/test/core/string/test_newlines.rb +13 -0
  101. data/test/core/time/test_change.rb +1 -1
  102. data/test/core/time/test_stamp.rb +4 -7
  103. data/test/core/unboundmethod/test_name.rb +1 -1
  104. data/test/more/test_basicobject.rb +1 -20
  105. data/test/more/test_class_extend.rb +7 -0
  106. data/test/more/test_continuation.rb +8 -6
  107. data/test/more/test_inheritor.rb +12 -6
  108. data/test/more/test_random.rb +19 -10
  109. data/test/more/test_shellwords.rb +33 -0
  110. metadata +60 -31
  111. data/TODO +0 -5
  112. data/doc/README.core +0 -102
  113. data/doc/README.more +0 -61
  114. data/doc/manual/about.rb +0 -47
  115. data/doc/manual/annotations.rdoc +0 -60
  116. data/doc/manual/associations.rdoc +0 -55
  117. data/doc/manual/blockups.rdoc +0 -101
  118. data/doc/manual/capsule.rdoc +0 -34
  119. data/doc/manual/command.rdoc +0 -177
  120. data/doc/manual/core.rdoc +0 -37
  121. data/doc/manual/faq.rdoc +0 -32
  122. data/doc/manual/typecast.html +0 -112
  123. data/lib/more/facets/capsule.rb +0 -258
  124. data/lib/more/facets/coroutine.rb +0 -159
  125. data/lib/more/facets/enumerablepass.rb +0 -3
  126. data/lib/more/facets/fileable.rb +0 -162
  127. data/lib/more/facets/progressbar.rb +0 -253
  128. data/lib/more/facets/recorder.rb +0 -108
  129. data/meta/releases +0 -14
  130. data/test/more/test_coroutine.rb +0 -46
@@ -1,177 +0,0 @@
1
- = Command
2
-
3
- Command provides a clean and easy way to create a command
4
- line interface for your program. The unique technique
5
- utlizes a Commandline to Object Mapping (COM) to make
6
- it quick and easy.
7
-
8
- == Synopsis
9
-
10
- Let's make an executable called 'mycmd'.
11
-
12
- #!/usr/bin/env ruby
13
-
14
- require 'facets/console/command'
15
-
16
- class MyCmd < Console::Command
17
-
18
- def _v
19
- $VERBOSE = true
20
- end
21
-
22
- def jump
23
- if $VERBOSE
24
- puts "JUMP! JUMP! JUMP!"
25
- else
26
- puts "Jump"
27
- end
28
- end
29
-
30
- end
31
-
32
- MyCmd.execute
33
-
34
- Then on the command line:
35
-
36
- % mycmd jump
37
- Jump
38
-
39
- % mycmd -v jump
40
- JUMP! JUMP! JUMP!
41
-
42
- == Subcommands
43
-
44
- Commands can take subcommand and suboptions. To do this
45
- simply add a module to your class with the same name
46
- as the subcommand, in which the suboption methods are defined.
47
-
48
- MyCmd << Console::Command
49
-
50
- def initialize
51
- @height = 1
52
- end
53
-
54
- def _v
55
- $VERBOSE = true
56
- end
57
-
58
- def jump
59
- if $VERBOSE
60
- puts "JUMP!" * @height
61
- else
62
- puts "Jump" * @height
63
- end
64
- end
65
-
66
- module Jump
67
- def __height(h)
68
- @height = h.to_i
69
- end
70
- end
71
-
72
- end
73
-
74
- MyCmd.start
75
-
76
- Then on the command line:
77
-
78
- % mycmd jump -h 2
79
- Jump Jump
80
-
81
- % mycmd -v jump -h 3
82
- JUMP! JUMP! JUMP!
83
-
84
- Another thing to notice about this example is that #start is an alias
85
- for #execute.
86
-
87
- == Missing Subcommands
88
-
89
- You can use #method_missing to catch missing subcommand calls.
90
-
91
- == Main and Default
92
-
93
- If your command does not take subcommands then simply define
94
- a #main method to dispatch action. All options will be treated globablly
95
- in this case and any remaining comman-line arguments will be passed
96
- to #main.
97
-
98
- If on the other hand your command does take subcommands but none is given,
99
- the #default method will be called, if defined. If not defined
100
- an error will be raised (but only reported if $DEBUG is true).
101
-
102
- == Global Options
103
-
104
- You can define <i>global options</i> which are options that will be
105
- processed no matter where they occur in the command line. In the above
106
- examples only the options occuring before the subcommand are processed
107
- globally. Anything occuring after the subcommand belonds strictly to
108
- the subcommand. For instance, if we had added the following to the above
109
- example:
110
-
111
- global_option :_v
112
-
113
- Then -v could appear anywhere in the command line, even on the end,
114
- and still work as expected.
115
-
116
- % mycmd jump -h 3 -v
117
-
118
- == Missing Options
119
-
120
- You can use #option_missing to catch any options that are not explicility
121
- defined.
122
-
123
- The method signature should look like:
124
-
125
- option_missing(option_name, args)
126
-
127
- Example:
128
- def option_missing(option_name, args)
129
- p args if $debug
130
- case option_name
131
- when 'p'
132
- @a = args[0].to_i
133
- @b = args[1].to_i
134
- 2
135
- else
136
- raise InvalidOptionError(option_name, args)
137
- end
138
- end
139
-
140
- Its return value should be the effective "arity" of that options -- that is,
141
- how many arguments it consumed ("-p a b", for example, would consume 2 args:
142
- "a" and "b"). An arity of 1 is assumed if nil or false is returned.
143
-
144
- Be aware that when using subcommand modules, the same option_missing
145
- method will catch missing options for global options and subcommand
146
- options too unless an option_missing method is also defined in the
147
- subcommand module.
148
-
149
- == Help Documentation
150
-
151
- You can also add help information quite easily. If the following code
152
- is saved as 'foo' for instance.
153
-
154
- MyCmd << Console::Command
155
-
156
- help "Dispays the word JUMP!"
157
-
158
- def jump
159
- if $VERBOSE
160
- puts "JUMP! JUMP! JUMP!"
161
- else
162
- puts "Jump"
163
- end
164
- end
165
-
166
- end
167
-
168
- MyCmd.execute
169
-
170
- then by running 'foo help' on the command line, standard help information
171
- will be displayed.
172
-
173
- foo
174
-
175
- jump Displays the word JUMP!
176
-
177
-
@@ -1,37 +0,0 @@
1
- = Facets Core
2
-
3
- Core contains the *essentials* of Facets. Core consists of a number
4
- of generally useful core extension methods, and a couple small support
5
- classes.
6
-
7
- By definition Core contains anything that will load automatically when
8
- issuing:
9
-
10
- require 'facets'
11
-
12
- == Facets by the Method
13
-
14
- In the 1.0 series of Facets, all extensions were stored on a per-method
15
- basis. This had some advantages, organization and complete fine-grain control
16
- over requires was possible, but it proved in practice to be _too_ granular.
17
- Some method simply too close in nature, or dependency, to go without others.
18
-
19
- So version 2.0 has grouped the extensions method into small groups.
20
- The library is still highly granular, but not excessively. But there's
21
- still refinement being done in this regard. You need not worry about it
22
- though, becuase per-method redirect libraries are provided. This is useful,
23
- not only for backward compatability, but also if you know what method you
24
- want, but don't recall exactly which core file it is in.
25
-
26
- Here's an example:
27
-
28
- require 'facets-by-method/hash/collate'
29
-
30
- == Authors
31
-
32
- This library more than any other part of Facets is full of contributions
33
- from sources all across the Ruby community. For all who have code here,
34
- the Facets Team salutes you.
35
-
36
- For a list of names, look to the README in Facet's main documetation.
37
-
@@ -1,32 +0,0 @@
1
- = Facets FAQs
2
-
3
- Q. How do I use the core mixins on object-by-object basis?
4
-
5
- A. One way is to use Facets' Capsule library.
6
-
7
- require 'facets/capsule'
8
-
9
- MyStringExts = Capsule.load('facets/string/align')::String
10
-
11
- s = "string"
12
-
13
- s.extend(MyStringExts)
14
-
15
- s.align_right(10) #=> " string"
16
-
17
- Or handle it using in-module load methods.
18
-
19
- require 'facets/module/require'
20
-
21
- module MyStringExts
22
- module_load 'facets/string/align'
23
- include String
24
- end
25
-
26
- s = "string"
27
-
28
- s.extend(MyStringExts)
29
-
30
- s.align_right(10) #=> " string"
31
-
32
-
@@ -1,112 +0,0 @@
1
- <html>
2
-
3
- <head>
4
- <title>Facets Typecast</title>
5
-
6
- <style>
7
- body { font: 12pt sans-serif;
8
- padding: 0; margin: 0;
9
- }
10
- #container {
11
- margin: 0 auto;
12
- }
13
- #title {
14
- color: #dddddd;
15
- border-bottom: 1px solid gray;
16
- padding: 20px;
17
- }
18
- #project {
19
- font: 22pt sans-serif;
20
- color: black;
21
- }
22
- #package {
23
- font: bold 42pt sans-serif;
24
- color: red;
25
- }
26
- #corpus {
27
- padding: 20px;
28
- }
29
- </style>
30
- </head>
31
-
32
- <body>
33
- <div id="container">
34
-
35
- <div id="title">
36
- <div id="project">Facets</div>
37
- <div id="package">Typecast</div>
38
- </div>
39
-
40
- <div id="corpus">
41
- <h2>Overview</h2>
42
- <p>Typecast provides a simple generic type conversion system. All the ruby core
43
- conversions are available by default.</p>
44
-
45
- <p>To implement a new type conversion, you have two choices. Given:</p>
46
-
47
- <pre>
48
- class CustomType
49
- def initialize(my_var)
50
- @my_var = my_var
51
- end
52
- end
53
- </pre>
54
-
55
- <p> 1) Define a to_class_name instance method </p>
56
-
57
- <pre>
58
- class CustomType
59
- def to_string
60
- my_var.to_s
61
- end
62
- end
63
-
64
- c = CustomType.new 1234
65
- s.cast_to String => "1234" (String)
66
- </pre>
67
-
68
- <p> 2. Define a from_class_name class method </p>
69
-
70
- <pre>
71
- class CustomType
72
- def self.from_string(str)
73
- self.new(str)
74
- end
75
- end
76
-
77
- "1234".cast_to CustomType => #<CustomType:0xb7d1958c @my_var="1234">
78
- </pre>
79
-
80
- <p>Those two methods are equivalent in the result. It was coded like that to
81
- avoid the pollution of core classes with tons of to_* methods.</p>
82
-
83
- <p>The standard methods to_s, to_f, to_i, to_a and to_sym are also used by
84
- this system if available.</p>
85
-
86
- <p>Usage looks like</p>
87
-
88
- <pre>
89
- "1234".cast_to Float => 1234.0 (Float)
90
- Time.cast_from("6:30") => 1234.0 (Time)
91
- </pre>
92
-
93
- <h2>FAQ</h2>
94
-
95
- <p>Why didn't you name the `cast_to` method to `to` ?</p>
96
-
97
- <p>Even if it would make the syntax more friendly, I suspect it could cause
98
- a lot of collisions with already existing code. The goal is that each
99
- time you call cast_to, you either get your result, either a
100
- TypeCastException.</p>
101
- </div>
102
-
103
- <div id="copy">
104
- Copyright &copy; 2004 Thomas Sawyer and all respective authors.
105
- Ruby License
106
- </div>
107
-
108
- </div>
109
- </body>
110
-
111
- </html>
112
-
@@ -1,258 +0,0 @@
1
- # = Capsule
2
- #
3
- # A Capsule is subclass of Module. It encapsulates an extenal script
4
- # as a funcitons module.
5
- #
6
- # A module which is an instance of the Capsule class encapsulates in its scope
7
- # the top-level methods, top-level constants, and instance variables defined in
8
- # a ruby script file (and its subfiles) loaded by a ruby program. This allows
9
- # use of script files to define objects that can be loaded into a program in
10
- # much the same way that objects can be loaded from YAML or Marshal files.
11
- #
12
- # See intro.txt[link:files/intro_txt.html] for an overview.
13
- #
14
- # == Authors
15
- #
16
- # * Joel VanderWerf
17
- # * Thomas Sawyer
18
- #
19
- # == Todo
20
- #
21
- # * The name of this is rather weak. Think of a better one.
22
- #
23
- # == Copying
24
- #
25
- # Copyright (c) 2005 Thomas Sawyer, Joel VanderWerf
26
- #
27
- # Ruby License
28
- #
29
- # This module is free software. You may use, modify, and/or redistribute this
30
- # software under the same terms as Ruby.
31
- #
32
- # This program is distributed in the hope that it will be useful, but WITHOUT
33
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
34
- # FOR A PARTICULAR PURPOSE.
35
-
36
- #require 'rbconfig'
37
-
38
- # = Capsule
39
- #
40
- # A Capsule is subclass of Module. It encapsulates an extenal script
41
- # as a funcitons module.
42
- #
43
- # A module which is an instance of the Capsule class encapsulates in its scope
44
- # the top-level methods, top-level constants, and instance variables defined in
45
- # a ruby script file (and its subfiles) loaded by a ruby program. This allows
46
- # use of script files to define objects that can be loaded into a program in
47
- # much the same way that objects can be loaded from YAML or Marshal files.
48
- #
49
- # See intro.txt[link:files/intro_txt.html] for an overview.
50
-
51
- class Capsule < Module
52
-
53
- #DLEXT = Config::CONFIG['DLEXT']
54
-
55
- # The script file with which the Import was instantiated.
56
- attr_reader :main_file
57
-
58
- # The directory in which main_file is located, and relative to which
59
- # #load searches for files before falling back to Kernel#load.
60
- #attr_reader :dir
61
-
62
- # An array of paths to search for scripts. This has the same
63
- # semantics as <tt>$:</tt>, alias <tt>$LOAD_PATH</tt>, excpet
64
- # that it is local to this script. The path of the current
65
- # script is added automatically (equivalent to '.')
66
- attr_reader :load_path
67
-
68
- # A hash that maps <tt>filename=>true</tt> for each file that has been
69
- # required locally by the script. This has the same semantics as <tt>$"</tt>,
70
- # alias <tt>$LOADED_FEATURES</tt>, except that it is local to this script.
71
- attr_reader :loaded_features
72
-
73
- class << self
74
- # As with #new but will search Ruby's $LOAD_PATH first.
75
- #--
76
- # Will also try .rb, .so, .dll, et al extensions, like require does.
77
- #++
78
- def load(main_file, options=nil, &block)
79
- file = nil
80
- $LOAD_PATH.each do |path|
81
- break if file = File.file?(File.join(path, main_file))
82
- #break if file = Dir.glob(File.join(path, main_file)+'{,.rb,.'+DLEXT+'}')[0]
83
- end
84
- new(file || main_file, options=nil, &block)
85
- end
86
- end
87
-
88
- # Creates new Capsule, and loads _main_file_ in the scope of the script. If a
89
- # block is given, the script is passed to it before loading from the file, and
90
- # constants can be defined as inputs to the script.
91
-
92
- def initialize(main_file, options=nil, &block)
93
- extend self
94
-
95
- options ||= {}
96
-
97
- @main_file = File.expand_path(main_file)
98
- @load_path = options[:load_path] || []
99
- #@load_path |= [File.dirname(@main_file)] # before or after?
100
- @loaded_features = options[:loaded_features] || {}
101
-
102
- # TODO In order to load/require at the instance level.
103
- # This needs to be in a separate namespace however
104
- # b/c it can interfere with what is expected.
105
- #[ :require, :load ].each{ |meth|
106
- # m = method(meth)
107
- # define_method(meth) do |*args| m.call(*args) end
108
- #}
109
-
110
- module_eval(&block) if block
111
- extend self
112
-
113
- load_in_module(main_file)
114
- end
115
-
116
- # Lookup feature in load path.
117
-
118
- def load_path_lookup(feature)
119
- paths = File.join('{' + @load_path.join(',') + '}', feature + '{,.rb,.rbs}')
120
- files = Dir.glob(paths)
121
- match = files.find{ |f| ! @loaded_features.include?(f) }
122
- return match
123
- end
124
-
125
- # Loads _file_ into the capsule. Searches relative to the local dir, that is,
126
- # the dir of the file given in the original call to
127
- # <tt>Capsule.load(file)</tt>, loads the file, if found, into this Capsule's
128
- # scope, and returns true. If the file is not found, falls back to
129
- # <tt>Kernel.load</tt>, which searches on <tt>$LOAD_PATH</tt>, loads the file,
130
- # if found, into global scope, and returns true. Otherwise, raises
131
- # <tt>LoadError</tt>.
132
- #
133
- # The _wrap_ argument is passed to <tt>Kernel.load</tt> in the fallback case,
134
- # when the file is not found locally.
135
- #
136
- # Typically called from within the main file to load additional sub files, or
137
- # from those sub files.
138
- #
139
- #--
140
- # TODO Need to add load_path lookup.
141
- #++
142
-
143
- def load(file, wrap = false)
144
- load_in_module(File.join(@dir, file))
145
- true
146
- rescue MissingFile
147
- super
148
- end
149
-
150
- # Analogous to <tt>Kernel#require</tt>. First tries the local dir, then falls
151
- # back to <tt>Kernel#require</tt>. Will load a given _feature_ only once.
152
- #
153
- # Note that extensions (*.so, *.dll) can be required in the global scope, as
154
- # usual, but not in the local scope. (This is not much of a limitation in
155
- # practice--you wouldn't want to load an extension more than once.) This
156
- # implementation falls back to <tt>Kernel#require</tt> when the argument is an
157
- # extension or is not found locally.
158
- #
159
- #--
160
- # This was using load_in_module rather than include_script. Maybe is still should
161
- # and one should have to call include_script instead? Think about this.
162
- #++
163
-
164
- def require(feature)
165
- file = load_path_lookup(feature)
166
- return super unless file
167
- begin
168
- @loaded_features[file] = true
169
- load_in_module(file)
170
- rescue MissingFile
171
- @loaded_features[file] = false
172
- super
173
- end
174
- end
175
-
176
- # Raised by #load_in_module, caught by #load and #require.
177
- class MissingFile < LoadError; end
178
-
179
- # Loads _file_ in this module's context. Note that <tt>\_\_FILE\_\_</tt> and
180
- # <tt>\_\_LINE\_\_</tt> work correctly in _file_.
181
- # Called by #load and #require; not normally called directly.
182
-
183
- def load_in_module(file)
184
- module_eval(IO.read(file), File.expand_path(file))
185
- rescue Errno::ENOENT => e
186
- if /#{file}$/ =~ e.message
187
- raise MissingFile, e.message
188
- else
189
- raise
190
- end
191
- end
192
-
193
- def include_script(file)
194
- include self.class.new(file, :load_path=>load_path, :loaded_features=>loaded_features)
195
- rescue Errno::ENOENT => e
196
- if /#{file}$/ =~ e.message
197
- raise MissingFile, e.message
198
- else
199
- raise
200
- end
201
- end
202
-
203
- #
204
- def include(*mods)
205
- super
206
- extend self
207
- end
208
-
209
- def to_s # :nodoc:
210
- "#<#{self.class}:#{main_file}>"
211
- end
212
-
213
- end
214
-
215
- # TODO Is autoimport bets name for this?
216
-
217
- class Module
218
-
219
- const_missing_definition_for_autoimport = lambda do
220
- #$autoimport_activated = true
221
- alias const_missing_before_autoimport const_missing
222
-
223
- def const_missing(sym) # :nodoc:
224
- filename = @autoimport && @autoimport[sym]
225
- if filename
226
- mod = Import.load(filename)
227
- const_set sym, mod
228
- else
229
- const_missing_before_autoimport(sym)
230
- end
231
- end
232
- end
233
-
234
- # When the constant named by symbol +mod+ is referenced, loads the script
235
- # in filename using Capsule.load and defines the constant to be equal to the
236
- # resulting Capsule module.
237
- #
238
- # Use like Module#autoload--however, the underlying opertation is #load rather
239
- # than #require, because scripts, unlike libraries, can be loaded more than
240
- # once. See examples/autoscript-example.rb
241
-
242
- define_method(:autoimport) do |mod, file|
243
- if @autoimport.empty? #unless $autoimport_activated
244
- const_missing_definition_for_autoimport.call
245
- end
246
- (@autoimport ||= {})[mod] = file
247
- end
248
- end
249
-
250
-
251
- module Kernel
252
-
253
- # Calls Object.autoimport
254
- def autoimport(mod, file)
255
- Object.autoimport(mod, file)
256
- end
257
-
258
- end