autocode 0.9.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.
@@ -0,0 +1,208 @@
1
+
2
+ body {
3
+ font-family: Verdana,Arial,Helvetica,sans-serif;
4
+ font-size: 90%;
5
+ margin: 0;
6
+ margin-left: 40px;
7
+ padding: 0;
8
+ background: white;
9
+ }
10
+
11
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
12
+ h1 { font-size: 150%; }
13
+ h2,h3,h4 { margin-top: 1em; }
14
+
15
+ a { background: #eef; color: #039; text-decoration: none; }
16
+ a:hover { background: #039; color: #eef; }
17
+
18
+ /* Override the base stylesheet's Anchor inside a table cell */
19
+ td > a {
20
+ background: transparent;
21
+ color: #039;
22
+ text-decoration: none;
23
+ }
24
+
25
+ /* and inside a section title */
26
+ .section-title > a {
27
+ background: transparent;
28
+ color: #eee;
29
+ text-decoration: none;
30
+ }
31
+
32
+ /* === Structural elements =================================== */
33
+
34
+ div#index {
35
+ margin: 0;
36
+ margin-left: -40px;
37
+ padding: 0;
38
+ font-size: 90%;
39
+ }
40
+
41
+
42
+ div#index a {
43
+ margin-left: 0.7em;
44
+ }
45
+
46
+ div#index .section-bar {
47
+ margin-left: 0px;
48
+ padding-left: 0.7em;
49
+ background: #ccc;
50
+ font-size: small;
51
+ }
52
+
53
+
54
+ div#classHeader, div#fileHeader {
55
+ width: auto;
56
+ color: white;
57
+ padding: 0.5em 1.5em 0.5em 1.5em;
58
+ margin: 0;
59
+ margin-left: -40px;
60
+ border-bottom: 3px solid #006;
61
+ }
62
+
63
+ div#classHeader a, div#fileHeader a {
64
+ background: inherit;
65
+ color: white;
66
+ }
67
+
68
+ div#classHeader td, div#fileHeader td {
69
+ background: inherit;
70
+ color: white;
71
+ }
72
+
73
+
74
+ div#fileHeader {
75
+ background: #057;
76
+ }
77
+
78
+ div#classHeader {
79
+ background: #048;
80
+ }
81
+
82
+
83
+ .class-name-in-header {
84
+ font-size: 180%;
85
+ font-weight: bold;
86
+ }
87
+
88
+
89
+ div#bodyContent {
90
+ padding: 0 1.5em 0 1.5em;
91
+ }
92
+
93
+ div#description {
94
+ padding: 0.5em 1.5em;
95
+ background: #efefef;
96
+ border: 1px dotted #999;
97
+ }
98
+
99
+ div#description h1,h2,h3,h4,h5,h6 {
100
+ color: #125;;
101
+ background: transparent;
102
+ }
103
+
104
+ div#validator-badges {
105
+ text-align: center;
106
+ }
107
+ div#validator-badges img { border: 0; }
108
+
109
+ div#copyright {
110
+ color: #333;
111
+ background: #efefef;
112
+ font: 0.75em sans-serif;
113
+ margin-top: 5em;
114
+ margin-bottom: 0;
115
+ padding: 0.5em 2em;
116
+ }
117
+
118
+
119
+ /* === Classes =================================== */
120
+
121
+ table.header-table {
122
+ color: white;
123
+ font-size: small;
124
+ }
125
+
126
+ .type-note {
127
+ font-size: small;
128
+ color: #DEDEDE;
129
+ }
130
+
131
+ .xxsection-bar {
132
+ background: #eee;
133
+ color: #333;
134
+ padding: 3px;
135
+ }
136
+
137
+ .section-bar {
138
+ color: #333;
139
+ border-bottom: 1px solid #999;
140
+ margin-left: -20px;
141
+ }
142
+
143
+
144
+ .section-title {
145
+ background: #79a;
146
+ color: #eee;
147
+ padding: 3px;
148
+ margin-top: 2em;
149
+ margin-left: -30px;
150
+ border: 1px solid #999;
151
+ }
152
+
153
+ .top-aligned-row { vertical-align: top }
154
+ .bottom-aligned-row { vertical-align: bottom }
155
+
156
+ /* --- Context section classes ----------------------- */
157
+
158
+ .context-row { }
159
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
160
+ .context-item-value { font-size: small; color: #448; }
161
+ .context-item-desc { color: #333; padding-left: 2em; }
162
+
163
+ /* --- Method classes -------------------------- */
164
+ .method-detail {
165
+ background: #efefef;
166
+ padding: 0;
167
+ margin-top: 0.5em;
168
+ margin-bottom: 1em;
169
+ border: 1px dotted #ccc;
170
+ }
171
+ .method-heading {
172
+ color: black;
173
+ background: #ccc;
174
+ border-bottom: 1px solid #666;
175
+ padding: 0.2em 0.5em 0 0.5em;
176
+ }
177
+ .method-signature { color: black; background: inherit; }
178
+ .method-name { font-weight: bold; }
179
+ .method-args { font-style: italic; }
180
+ .method-description { padding: 0 0.5em 0 0.5em; }
181
+
182
+ /* --- Source code sections -------------------- */
183
+
184
+ a.source-toggle { font-size: 90%; }
185
+ div.method-source-code {
186
+ background: #262626;
187
+ color: #ffdead;
188
+ margin: 1em;
189
+ padding: 0.5em;
190
+ border: 1px dashed #999;
191
+ overflow: hidden;
192
+ }
193
+
194
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
195
+
196
+ /* --- Ruby keyword styles --------------------- */
197
+
198
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
199
+
200
+ .ruby-constant { color: #7fffd4; background: transparent; }
201
+ .ruby-keyword { color: #00ffff; background: transparent; }
202
+ .ruby-ivar { color: #eedd82; background: transparent; }
203
+ .ruby-operator { color: #00ffee; background: transparent; }
204
+ .ruby-identifier { color: #ffdead; background: transparent; }
205
+ .ruby-node { color: #ffa07a; background: transparent; }
206
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
207
+ .ruby-regexp { color: #ffa07a; background: transparent; }
208
+ .ruby-value { color: #7fffd4; background: transparent; }
@@ -0,0 +1,3 @@
1
+ require 'autocreate'
2
+ require 'autoload'
3
+ require 'reloadable'
@@ -0,0 +1,53 @@
1
+ require 'rubygems'
2
+ require 'metaid'
3
+
4
+ # Extending a module with Autocreate allows you to specify autocreate rules for that module.
5
+ #
6
+ # Autocreate allows you to automatically created classes or modules based on a given exemplar at the time they are referenced.
7
+ #
8
+ # To use Autocreate, mix it via +extend+ into the class or module within which you want to autocreate referenced constants.
9
+ #
10
+ # See the README for an example of how to use Autocreate.
11
+
12
+ module Autocreate
13
+
14
+ def self.extended( mod ) #:nodoc:
15
+
16
+ old = mod.method( :const_missing )
17
+ mod.metaclass.class_eval do
18
+
19
+ # Specifies that the constant specified by key should be autocreated using the exemplar. If a block is given, the block is further used to initialize the block once it has been cloned.
20
+ def autocreate( key, exemplar, &block )
21
+ ( @autocreate ||= [] ) << [ key, exemplar, block ]
22
+ return self
23
+ end
24
+
25
+ define_method :const_missing do | cname | #:nodoc:
26
+
27
+ # first, find an applicable exemplar
28
+ key, exemplar, block = ( @autocreate ||= [] ).find do |k,v|
29
+ case k
30
+ when true then true
31
+ when String, Symbol then k.to_s == cname.to_s
32
+ when Array then k.find { |k| k.to_s == cname.to_s }
33
+ else false
34
+ end
35
+ end
36
+
37
+ # if we found it, set the const and return it
38
+ if key
39
+ object = exemplar.clone
40
+ object.instance_eval( &block ) if block
41
+ ( @reloadable ||= [] ) << cname;
42
+ const_set( cname, object )
43
+ else
44
+ old.call(cname)
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,69 @@
1
+ require 'rubygems'
2
+ require 'metaid'
3
+
4
+ # Autoload allows you to specify which modules or classes to automatically load when they are referenced. This is somewhat more sophisticated than the +autoinclude+ mechanism in the standard library. For one thing, you can cause code to be reloaded by using Reloadable in conjunction with Autoload. For another, you can provide a search path using the directories method, thereby allowing you to "autoinclude" entire directories in one fell swoop.
5
+ #
6
+ # To use Autoload, you must mix it into your module or class via extend. That will provide the autoload and directories methods for you, as described below.
7
+ #
8
+ # A typical use case for Autoload looks like this:
9
+ #
10
+ # require 'autocode'
11
+ #
12
+ # module Models
13
+ # extend Autoload; extend Reloadable
14
+ # autoload true; directories :models
15
+ # end
16
+
17
+ module Autoload
18
+
19
+ def self.extended( mod ) #:nodoc:
20
+
21
+ old = mod.method( :const_missing )
22
+
23
+ mod.metaclass.class_eval do
24
+
25
+ # Specifies that you want to autoload each of the constants referenced by keys. A key of true is basically a wild-card, meaning "load anything".
26
+ def autoload( *keys )
27
+ ( @autoload ||= [] ).concat(keys)
28
+ return self
29
+ end
30
+
31
+ # Provide a list of directories from which a given constant might be loaded.
32
+ def directories( *dirs )
33
+ ( @directories ||= ['.'] ).concat(dirs)
34
+ return self
35
+ end
36
+
37
+ # Is a given constant being autoloaded?
38
+ def autoload?( cname )
39
+
40
+ cname = cname.to_s.gsub(/([a-z\d])([A-Z])/){ "#{$1}_#{$2.downcase}"}
41
+
42
+ # is this name autoloadable?
43
+ key = ( @autoload ||= [] ).find do |key|
44
+ key == true || ( key.to_s == cname )
45
+ end
46
+
47
+ end
48
+
49
+ define_method :const_missing do | cname | #:nodoc:
50
+
51
+ return old.call(cname) unless autoload?( cname )
52
+ fname = cname.to_s.gsub(/([a-z\d])([A-Z])/){ "#{$1}_#{$2.downcase}"} + '.rb'
53
+ dir = ( @directories ||= ['.'] ).find do |dir|
54
+ File.exist?( dir / fname )
55
+ end
56
+
57
+ if ( dir && load( dir / fname ) && c = const_get( cname ) )
58
+ ( @reloadable ||= [] ) << cname; return c
59
+ else
60
+ old.call( cname )
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+ end
68
+
69
+ end
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+ require 'metaid'
3
+
4
+ # Reloadable simply makes it possible for a module's code to be reloaded. *Important*: Only code loaded via Autoload or Autocreate will be reloaded. Also, the module itself is not reloaded, only the modules and classes within it that were loaded via *Autocode*.
5
+ #
6
+ # To use Reloadable, simply extend a given module with Reloadable. This will add two methods to the module: reloadable and reload. These are described below.
7
+
8
+ module Reloadable
9
+
10
+ def self.extended( mod ) #:nodoc:
11
+
12
+ mod.metaclass.class_eval do
13
+
14
+ # Returns the list of constants that would be reloaded upon a call to reload.
15
+ def reloadable( *names )
16
+ ( @reloadable ||= [] ).concat(names)
17
+ return self
18
+ end
19
+
20
+ # Reloads all the constants that were loaded via *Autocode*. Technically, all reload is doing is undefining them (by calling +remove_const+ on each in turn); they won't get reloaded until they are referenced.
21
+ def reload
22
+ ( @reloadable ||=[] ).each { |name| remove_const( name ) }
23
+ @reloadable = []; return self
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.0
3
+ specification_version: 1
4
+ name: autocode
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.9.0
7
+ date: 2008-01-04 00:00:00 -08:00
8
+ summary: Utility for auto-including, reloading, and generating classes and modules.
9
+ require_paths:
10
+ - lib
11
+ email:
12
+ homepage: http://dev.zeraweb.com/
13
+ rubyforge_project:
14
+ description:
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.6
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors: []
30
+
31
+ files:
32
+ - doc/rdoc
33
+ - doc/rdoc/classes
34
+ - doc/rdoc/classes/Autocreate.html
35
+ - doc/rdoc/classes/Autocreate.src
36
+ - doc/rdoc/classes/Autocreate.src/M000004.html
37
+ - doc/rdoc/classes/Autoload.html
38
+ - doc/rdoc/classes/Autoload.src
39
+ - doc/rdoc/classes/Autoload.src/M000001.html
40
+ - doc/rdoc/classes/Autoload.src/M000002.html
41
+ - doc/rdoc/classes/Autoload.src/M000003.html
42
+ - doc/rdoc/classes/Reloadable.html
43
+ - doc/rdoc/classes/Reloadable.src
44
+ - doc/rdoc/classes/Reloadable.src/M000005.html
45
+ - doc/rdoc/classes/Reloadable.src/M000006.html
46
+ - doc/rdoc/created.rid
47
+ - doc/rdoc/files
48
+ - doc/rdoc/files/lib
49
+ - doc/rdoc/files/lib/autocode_rb.html
50
+ - doc/rdoc/files/lib/autocreate_rb.html
51
+ - doc/rdoc/files/lib/autoload_rb.html
52
+ - doc/rdoc/files/lib/reloadable_rb.html
53
+ - doc/rdoc/files/README.html
54
+ - doc/rdoc/fr_class_index.html
55
+ - doc/rdoc/fr_file_index.html
56
+ - doc/rdoc/fr_method_index.html
57
+ - doc/rdoc/index.html
58
+ - doc/rdoc/rdoc-style.css
59
+ - lib/autocode.rb
60
+ - lib/autocreate.rb
61
+ - lib/autoload.rb
62
+ - lib/reloadable.rb
63
+ test_files: []
64
+
65
+ rdoc_options: []
66
+
67
+ extra_rdoc_files: []
68
+
69
+ executables: []
70
+
71
+ extensions: []
72
+
73
+ requirements: []
74
+
75
+ dependencies:
76
+ - !ruby/object:Gem::Dependency
77
+ name: metaid
78
+ version_requirement:
79
+ version_requirements: !ruby/object:Gem::Version::Requirement
80
+ requirements:
81
+ - - ">"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.0.0
84
+ version: