sugar_refinery 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +157 -0
  3. data/MIT-LICENSE.txt +20 -0
  4. data/README.md +42 -0
  5. data/Rakefile +49 -0
  6. data/doc/create_documentation.rb +471 -0
  7. data/doc/index.html +1687 -0
  8. data/lib/sugar_refinery.rb +1 -0
  9. data/lib/sugar_refinery/alias_for.rb +15 -0
  10. data/lib/sugar_refinery/all.rb +5 -0
  11. data/lib/sugar_refinery/array_op.rb +15 -0
  12. data/lib/sugar_refinery/array_stats.rb +31 -0
  13. data/lib/sugar_refinery/blank.rb +47 -0
  14. data/lib/sugar_refinery/camel_snake.rb +15 -0
  15. data/lib/sugar_refinery/chain_map.rb +11 -0
  16. data/lib/sugar_refinery/constantize.rb +29 -0
  17. data/lib/sugar_refinery/dir_utils.rb +20 -0
  18. data/lib/sugar_refinery/file_force_delete.rb +12 -0
  19. data/lib/sugar_refinery/file_gsub.rb +23 -0
  20. data/lib/sugar_refinery/hash_op.rb +28 -0
  21. data/lib/sugar_refinery/hash_zip.rb +11 -0
  22. data/lib/sugar_refinery/inner_map.rb +15 -0
  23. data/lib/sugar_refinery/lchomp.rb +15 -0
  24. data/lib/sugar_refinery/marshal_copy.rb +11 -0
  25. data/lib/sugar_refinery/mash.rb +22 -0
  26. data/lib/sugar_refinery/ords.rb +17 -0
  27. data/lib/sugar_refinery/regexp_union.rb +17 -0
  28. data/lib/sugar_refinery/same.rb +11 -0
  29. data/lib/sugar_refinery/string_op.rb +20 -0
  30. data/lib/sugar_refinery/version.rb +3 -0
  31. data/spec/alias_for_spec.rb +55 -0
  32. data/spec/array_op_spec.rb +17 -0
  33. data/spec/array_stats_spec.rb +82 -0
  34. data/spec/blank_spec.rb +22 -0
  35. data/spec/camel_snake_spec.rb +15 -0
  36. data/spec/chain_map_spec.rb +16 -0
  37. data/spec/constantize_spec.rb +33 -0
  38. data/spec/dir_utils_spec.rb +32 -0
  39. data/spec/file_force_delete_spec.rb +30 -0
  40. data/spec/file_gsub_spec.rb +26 -0
  41. data/spec/hash_op_spec.rb +28 -0
  42. data/spec/hash_zip_spec.rb +11 -0
  43. data/spec/inner_map_spec.rb +24 -0
  44. data/spec/lchomp_spec.rb +20 -0
  45. data/spec/marshal_copy_spec.rb +15 -0
  46. data/spec/mash_spec.rb +17 -0
  47. data/spec/ords_spec.rb +15 -0
  48. data/spec/regexp_union_spec.rb +19 -0
  49. data/spec/same_spec.rb +10 -0
  50. data/spec/spec_helper.rb +18 -0
  51. data/spec/string_op_spec.rb +22 -0
  52. data/sugar_refinery.gemspec +20 -0
  53. metadata +138 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 67c2c0f14a0f111f938ef418f1ea14328c3ad8a5
4
+ data.tar.gz: 711d19f2e8b7db76c28c8fe08fd14a52f4fe04c1
5
+ SHA512:
6
+ metadata.gz: de1a759dae8a9ae774fdacdcf6cd29aa1279f69ef123835e7ec6b2cccead07473efc6d29708d7510f2f970fa1d3d8f2952dd3f602e3f8089789c1a5ea443d53d
7
+ data.tar.gz: b51b321dcf0377ee6b408f6dc73671ec53d04308098555bbfe5f3cf299c07fd3b2db269d2908c834ff83217fa1a9510fd500b75c46697b2f61b4e8f2b1c56e55
@@ -0,0 +1,157 @@
1
+ # SUGAR REFINERY CHANGELOG
2
+
3
+ ## 2016-01-02 | Sugar Refinery 1.0
4
+
5
+ * turn zucker gem into sugar_refinery
6
+ * move iterate into its own gem
7
+ * move instance_variable_from into its own gem
8
+ * move egonil into its own gem
9
+ * remove 'Zucker#require' and 'Zucker#require_all'
10
+ * remove 'refine' gem dependency
11
+ * remove unary_conversion in favor of https://bugs.ruby-lang.org/issues/11782
12
+ * remove square_brackets_for
13
+ * remove tap
14
+ * rename string_extras to lchomp
15
+ * rename hash_extras to hash_zip
16
+ * rename float_extras to same
17
+ * rename dir_extras to dir_utils
18
+ * split file_extras into file_force_delete and file_gsub (also remove File.filename)
19
+
20
+
21
+ ## OLD ZUCKER CHANGELOG
22
+
23
+ 2015-04-01 | Zucker 100.1.0
24
+ * drop Ruby 1.9 support
25
+ * add float_extras for Float#same?
26
+ * add chain_map
27
+ * add inner_map
28
+ * add array_stats
29
+
30
+
31
+ 2014-04-01 | Zucker 100.0.0
32
+ * drop Ruby 1.8 support
33
+ * rewrite zucker to use refinements!
34
+ * use usual semantic versioning
35
+ * remove all "debug" cubes, use the "debugging" gem instead!
36
+ * remove "ruby_version" cube, use the "ruby_version" gem instead!
37
+ * remove "engine" cube, use the "ruby_engine" gem instead!
38
+ * remove "info" cube, use the "ruby_info" gem instead!
39
+ * remove "os" cube, use rdp's "os" gem instead!
40
+ * remove "*_to_proc" cubes, use the "procstar" gem instead!
41
+ * remove "sandbox" cube, since sandboxing is not recommended and removed from Ruby 2.1
42
+ * remove "kernel" and "not" cube completely
43
+ * tweaks to most other cubes
44
+
45
+
46
+ 2013-04-30 | Zucker 13
47
+ * fix alias_for bug
48
+ * let RubyVersion#inspect and RubyEngine#inspect map to #to_s
49
+ * remove Array#sum
50
+ * repackage (gh#4)
51
+
52
+
53
+ 2012-01-16 | Zucker 12
54
+ * fix a requiring bug
55
+ * rename zucker/version cube to zucker/ruby_version and Zucker::PACKAGES to Zucker::PACKS
56
+ * remove more_aliases! (keep it simple...)
57
+ * add case cube: String#to_camel and String#to_snake
58
+
59
+
60
+ 2011-05-25 | Zucker 11
61
+ * add Zucker::constants to check if cube has been required (e.g. Zucker::AliasFor if 'zucker/alias_for' is loaded)
62
+ * rbx tweaks
63
+ * don't define Binding#vars on rbx (prevent endless recursion)
64
+ * sandbox-not-working warning
65
+ * add Kernel#ignore_sigquit!
66
+ * fix warnings
67
+ * doc tweaks
68
+
69
+
70
+ 2011-04-29 | Zucker 10
71
+ * doc/spec tweaks
72
+ * make test.rubygems.org-testable
73
+ * fix zucker 9 permission issue
74
+
75
+
76
+ 2011-01-22 | Zucker 9
77
+ * remove history versions (sorry, it caused too much gem/rdoc troubles)
78
+ * add file cube: File.delete! and File.gsub
79
+ * debug pack improvements
80
+ * binding: typos + return nil
81
+ * cc: support for ripl + return nil
82
+ * mm: also show eigenclass for modules + nicer displaying + return nil
83
+ * added Regexp#visualize
84
+ * remove optional sandbox param
85
+ * rename xxx2proc to xxx_to_proc
86
+ * change rakefile/rspec/gemspec structure
87
+ * more minor fixes and improvements
88
+
89
+
90
+ 2010-10-06 | Zucker 8
91
+ * fix a little alias_for bug
92
+ * disable rdoc creation when installing (in favour of the custom docs)
93
+ * change Binding#inspect to Binding.variables (was too verbose and dangerous)
94
+
95
+
96
+ 2010-10-03 | Zucker 7
97
+ * fix critical OS.windows? bug
98
+
99
+
100
+ 2010-10-03 | Zucker 6
101
+ * no new cubes
102
+ * bugfix for OS.posix?
103
+ * small changes + bugfixes + doc improvements
104
+ * add two user methods to Info
105
+ * change egonil semantics ( using method_missing, see http://ruby.janlelis.de/26/catch_nil.rb )
106
+ * bugfix for vv
107
+
108
+
109
+ 2010-09-04 | Zucker 5
110
+ * debug edition - add two debug helpers: oo (output line, method, file) and cc (output method callstack)
111
+ * rename cube D to dd add add more debug aliases (for mm and binding)
112
+ * fix __SPECIAL_VARS__ in info and kernel cube and some minor bugfixes
113
+ * Zucker.activate_more_aliases! option
114
+ * add Hash#&
115
+ * add aliases: File.filename (for basename), Dir.join and Dir.split (for File.join, split)
116
+ * add a flexible requiring mechansim in zucker.rb (no api changes)
117
+ * restructure packages
118
+ * add rake tasks for releasing
119
+ * improve RubyVersion constant (cleaner and more flexible)
120
+
121
+
122
+ 2010-09-01 | Zucker 4
123
+ * fix Binding#inspect
124
+ * add RubyEngine constant
125
+ * add RubyVersion constant
126
+ * add OS constant
127
+ * add q debug method (like p but on one line)
128
+ * add String#-
129
+
130
+
131
+ 2010-08-14 | Zucker 3
132
+ * add tap cube
133
+ * add Object#not
134
+ * add alias_for for an alternative alias syntax
135
+ * add String#constantize (improved AS version)
136
+ * improve Info module
137
+ * make Array#sum Rails compatibile
138
+ * improve docs
139
+ * change directory layout (no changes for requiring)
140
+ * more small changes
141
+
142
+
143
+ 2010-08-08 | Zucker 2
144
+ * add info cube
145
+ * add chaining for array2proc
146
+ * fix Hash.zip
147
+ * fix instance_variables_from binding for 1.9
148
+ * more specs
149
+
150
+
151
+ 2010-08-06 | Zucker 1
152
+ * initial release
153
+
154
+
155
+ 2010-08-05 | Zucker 0
156
+ * pre-release for rug-b talk
157
+
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010-2016 Jan Lelis
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,42 @@
1
+ # Ruby Sugar Refinery [![version](https://badge.fury.io/rb/sugar-refinery.svg)](http://badge.fury.io/rb/sugar-refinery) [![travis](https://travis-ci.org/janlelis/sugar-refinery.png?branch=master)](https://travis-ci.org/janlelis/sugar-refinery)
2
+
3
+ The Ruby Sugar Refinery is a collection of tiny [refinements](http://ruby-doc.org/core-2.3.0/doc/syntax/refinements_rdoc.html) (declarative local core extensions) for Ruby.
4
+
5
+ ## Setup & Usage
6
+
7
+ Add to Gemfile:
8
+
9
+ ```ruby
10
+ gem 'sugar_refinery', require: 'sugar_refinery/all'
11
+ ```
12
+
13
+ Then add refinements to the current Ruby file or module:
14
+
15
+ ```ruby
16
+ using SugarRefinery::CamelSnake
17
+ using SugarRefinery::HashZip
18
+
19
+ "ClassName".to_snake # => "class_name"
20
+ Hash.zip [1,2,3], [4,5,6] # => {1=>4, 2=>5, 3=>6}
21
+ ```
22
+
23
+ ## Included Refinements
24
+
25
+ [See the documentation!](http://janlelis.github.io/sugar-refinery)
26
+
27
+ ## Zucker Gems
28
+
29
+ Missing former functionality? It might have been extracted into a separate gem:
30
+
31
+ * [iterate](https://github.com/janlelis/iterate)
32
+ * [instance_variable_from](https://github.com/janlelis/instance_variable_from)
33
+ * [egonil](https://github.com/janlelis/egonil)
34
+ * [debugging](https://github.com/janlelis/debugging)
35
+ * [procstar](https://github.com/janlelis/procstar)
36
+ * [ruby_info](https://github.com/janlelis/ruby_info)
37
+ * [ruby_version](https://github.com/janlelis/ruby_version)
38
+ * [ruby_engine](https://github.com/janlelis/ruby_engine)
39
+
40
+ ## J-_-L
41
+
42
+ Copyright (c) 2010-2016 [Jan Lelis](http://janlelis.com), released under the MIT license
@@ -0,0 +1,49 @@
1
+ # # #
2
+ # Get gemspec info
3
+
4
+ gemspec_file = Dir['*.gemspec'].first
5
+ gemspec = eval File.read(gemspec_file), binding, gemspec_file
6
+ info = "#{gemspec.name} | #{gemspec.version} | " \
7
+ "#{gemspec.runtime_dependencies.size} dependencies | " \
8
+ "#{gemspec.files.size} files"
9
+
10
+
11
+ # # #
12
+ # Gem build and install task
13
+
14
+ desc info
15
+ task :gem do
16
+ puts info + "\n\n"
17
+ print " "; sh "gem build #{gemspec_file}"
18
+ FileUtils.mkdir_p 'pkg'
19
+ FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", 'pkg'
20
+ puts; sh %{gem install --no-document pkg/#{gemspec.name}-#{gemspec.version}.gem}
21
+ end
22
+
23
+
24
+ # # #
25
+ # Start an IRB session with the gem loaded
26
+
27
+ desc "#{gemspec.name} | IRB"
28
+ task :irb do
29
+ sh "irb -I ./lib -r #{gemspec.name.gsub '-','/'}"
30
+ end
31
+
32
+
33
+ # # #
34
+ # Run Specs
35
+
36
+ desc "#{gemspec.name} | Spec"
37
+ task 'spec' do
38
+ sh %[rspec spec]
39
+ end
40
+ task default: :spec
41
+
42
+
43
+ # # #
44
+ # Documentation
45
+
46
+ desc "#{gemspec.name} | Documentation"
47
+ task 'doc' do
48
+ ruby 'doc/create_documentation.rb'
49
+ end
@@ -0,0 +1,471 @@
1
+ # encoding: utf-8
2
+ # creates the documentation for SugarRefinery
3
+
4
+ require 'date'
5
+ require 'yaml'
6
+ require 'coderay'
7
+
8
+ require_relative '../lib/sugar_refinery/camel_snake'
9
+ using SugarRefinery::CamelSnake
10
+
11
+
12
+ class SugarRefineryDoc
13
+ ORDER = %w|summary use methods info spec source|
14
+ DESCRIPTIONS = {
15
+ 'summary' => 'Summary',
16
+ 'use' => 'Activate',
17
+ 'methods' => 'Usage',
18
+ 'info' => 'Information',
19
+ 'spec' => 'Specification',
20
+ 'source' => 'Source',
21
+ }
22
+
23
+
24
+ class << self
25
+ def generate(path = File.dirname(__FILE__) + '/../')
26
+ @path = path
27
+
28
+ # get version / date
29
+ @version = SugarRefinery::VERSION
30
+ @date = Date.today.to_s
31
+
32
+ # include + format changelog
33
+ @changelog = replace_html_special_chars File.read File.join( @path, 'CHANGELOG.md' )
34
+
35
+ # collect description files and turn them into html
36
+ @cubes = Dir[ File.join(path, 'doc', 'desc', '*.yaml') ].inject({}) do |res, cube_file; a|
37
+ begin
38
+ a = YAML.load_file cube_file
39
+ rescue
40
+ warn "Could not load the yaml file for #{ cube_file }"
41
+ end
42
+ if a.instance_of? Hash
43
+ res.merge a
44
+ else
45
+ res
46
+ end
47
+ end.sort.map{ |name, hash| cube name, hash }.join
48
+
49
+ output_path = File.join(path, 'doc', 'index.html')
50
+ template = DATA.read
51
+ template.gsub! /\.\.([a-z]+)\.\./i do eval "@#$1" end # substitute vars
52
+ template.gsub! /⇧(.+?)⇧/, '<code>\1</code>'
53
+ template.gsub! /●(.+?)●/, '<strong>\1</strong>'
54
+ template.gsub! /→(.+?)→(.+?)→/, '<a href="\2">\1</a>'
55
+ File.open(output_path, 'w'){ |file| file.puts(template) }
56
+
57
+ puts "Created SugarRefinery documentation at #{File.expand_path(output_path)}"
58
+ end
59
+
60
+ private
61
+
62
+ def cube(name, hash)
63
+ @cube_name = name
64
+ %{ <div class="cubes"><h3 title="require 'sugar_refinery/#{name}'" id="#{name}">#{name}</h3>
65
+ <table class="cube_table"
66
+ id="#{ name }_cube"
67
+ title="require 'sugar_refinery/#{name}'"> } +
68
+
69
+ ORDER.map{ |th|
70
+ if %w|spec use source|.include?(th) || td = hash[th]
71
+ "<tr><th>#{ DESCRIPTIONS[th] }</th>" +
72
+ " <td>#{ send th, td || name }</td></tr>"
73
+ end
74
+ }.join + '</table></div>'
75
+ end
76
+
77
+ def use(n)
78
+ "<div class=\"using source\" style=\"display:block\">#{ syntax_highlight "using SugarRefinery::#{n.to_camel}" }</div>"
79
+ end
80
+
81
+ def methods(m)
82
+ m.map{ |name, usage|
83
+ "<h5>#{replace_html_special_chars name}</h5>" +
84
+ "<div class=\"usage source\" style=\"display:block\">#{ syntax_highlight usage }</div>"
85
+ }.join
86
+ end
87
+
88
+ def info(i)
89
+ i.map{|e|convert_html_chars e}.join '<br/>'
90
+ end
91
+
92
+ def summary(s)
93
+ convert_html_chars s
94
+ end
95
+
96
+ def spec(_)
97
+ source_helper(:spec, File.join( @path, 'spec/' ), '_spec')
98
+ end
99
+
100
+ def source(_)
101
+ source_helper(:source, File.join( @path, 'lib/sugar_refinery') )
102
+ end
103
+
104
+ def source_helper(kind, file_prefix, suffix='')
105
+ %{ <span id="show_#{@cube_name}_#{kind}">(<a href="javascript:show('#{@cube_name}_#{kind}')">show</a>)</span>
106
+ <div class="source" id="#{@cube_name}_#{kind}">#{
107
+ get_source_file( File.join file_prefix, ( @cube_name + suffix + '.rb' ) )
108
+ }</div> }
109
+ end
110
+
111
+ def get_source_file(filename)
112
+ if File.file? filename
113
+ syntax_highlight( File.read(filename).strip )
114
+ else
115
+ '<em>FIXME: missing (please create a <a href="http://github.com/janlelis/sugar_refinery/issues">github issue</a>)</em>'
116
+ end
117
+ end
118
+
119
+ def syntax_highlight(string)
120
+ CodeRay.scan(string, :ruby).div
121
+ end
122
+
123
+ def replace_html_special_chars(string)
124
+ string.gsub( /&/, '&amp;' ).
125
+ gsub( /</, '&lt;' ).
126
+ gsub( />/, '&gt;' )
127
+ end
128
+
129
+ def convert_html_chars(string, protect_spaces = false)
130
+ string = replace_html_special_chars( string )
131
+ string = string.to_s.gsub( "\n", '<br/>' )
132
+
133
+ if protect_spaces
134
+ string.gsub(' ',' ')
135
+ else
136
+ string
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ SugarRefineryDoc.generate *ARGV
143
+
144
+ __END__
145
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
146
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
147
+
148
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
149
+ <head>
150
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
151
+
152
+ <title>Ruby Sugar Refinery</title>
153
+ <script type="text/javascript">
154
+ var show = function(snippet){
155
+ document.getElementById( snippet ).style.display = 'block'
156
+ if( document.getElementById( 'show_'+snippet ) ){
157
+ document.getElementById( 'show_'+snippet ).style.display = 'none'
158
+ }
159
+ }
160
+ </script>
161
+ <style type="text/css">
162
+ body{
163
+ background-color:#aaa;
164
+ color:#111;
165
+ font-family:sans-serif;
166
+ }
167
+
168
+ #world{
169
+ background:#fff;
170
+ }
171
+
172
+ h1, h2, h3, h4, h5, h6{
173
+ margin:0px;
174
+ padding:0px;
175
+ }
176
+
177
+ h1{
178
+ color:#222;
179
+ text-align:left;
180
+ padding:0.7em;
181
+ }
182
+ h2{
183
+ margin-left:1em;
184
+ margin-top:0.8em;
185
+ margin-bottom:0.5em;
186
+ }
187
+
188
+ th{
189
+ width:200px;
190
+ color:#444;
191
+ }
192
+
193
+ p{
194
+ margin:0px;
195
+ margin-bottom:0.5em;
196
+ }
197
+
198
+ p.text{
199
+ margin-left:1.5em;
200
+ margin-right:1em;
201
+ }
202
+
203
+ code{
204
+ }
205
+
206
+ .scode{
207
+ display:block;
208
+ margin:0.8em;
209
+ margin-left:0;
210
+ padding:0.5em;
211
+ border:1px solid black;
212
+ background:#eee;
213
+ }
214
+
215
+ .cubes{
216
+ margin:0px;
217
+ margin-left:1.65em;
218
+ margin-right:1em;
219
+ }
220
+
221
+ a{
222
+ color:#111;
223
+ }
224
+
225
+ table{
226
+ margin:0.8em;
227
+ margin-top:0.2em;
228
+ margin-left:0;
229
+ padding:0.2em;
230
+ border:1px solid #111;
231
+ background:#eee;
232
+ overflow:auto;
233
+ display:block;
234
+ }
235
+
236
+ ul{
237
+ margin:5px 0px !important;
238
+ padding:none;
239
+ }
240
+
241
+ th{
242
+ text-align:left;
243
+ vertical-align:top;
244
+ padding-right:3em;
245
+ }
246
+
247
+ td{
248
+ width:100%;
249
+ }
250
+
251
+ li{
252
+ list-style:none;
253
+ }
254
+
255
+
256
+ #foot{
257
+ text-align:left;
258
+ padding:0.3em;
259
+ font-size:70%
260
+ }
261
+ #foot, #foot a{
262
+ color:#444;
263
+ }
264
+ #smile{
265
+ font-size:150%;
266
+ float:right;
267
+ }
268
+ #smile a{
269
+ text-decoration:none;
270
+ }
271
+
272
+ .small{
273
+ font-size:70%;
274
+ }
275
+
276
+ code, pre{
277
+ font-face:mono;
278
+ margin:0px;
279
+ padding:0px;
280
+ }
281
+
282
+ .source{
283
+ display:none;
284
+ width:98%;
285
+ padding: 3px 5px;
286
+ overflow: auto;
287
+ font-size: 12px;
288
+ background-color: #f8f8f8;
289
+ border:1px solid #005;
290
+ border: 1px solid silver;
291
+ font-family: 'Courier New', 'Terminal', monospace;
292
+ color: #000;
293
+ }
294
+
295
+ # http://coderay.rubychan.de/
296
+ .source pre { margin: 0px; }
297
+
298
+ span.source { white-space: pre; border: 0px; padding: 2px; }
299
+
300
+ table.source { border-collapse: collapse; width: 100%; padding: 2px; }
301
+ table.source td { padding: 2px 4px; vertical-align: top; }
302
+
303
+ .source .line_numbers, .source .no {
304
+ background-color: #def;
305
+ color: gray;
306
+ text-align: right;
307
+ }
308
+ .source .line_numbers a:target, .source .no a:target { color: blue; }
309
+ .source .line_numbers .highlighted, .source .no .highlighted { color: red; }
310
+ .source .no { padding: 0px 4px; }
311
+ .source .code { width: 100%; }
312
+ .source .code pre { overflow: auto; }
313
+
314
+ .source .debug { color:white ! important; background:blue ! important; }
315
+
316
+ .source .an { color:#007 }
317
+ .source .at { color:#f08 }
318
+ .source .av { color:#700 }
319
+ .source .bi { color:#509; font-weight:bold }
320
+ .source .c { color:#888; }
321
+ .source .c .dl { color:#444; }
322
+ .source .c .ch { color:#444; }
323
+
324
+ .source .ch { color:#04D }
325
+ .source .ch .k { color:#04D }
326
+ .source .ch .dl { color:#039 }
327
+
328
+ .source .cl { color:#B06; font-weight:bold }
329
+ .source .cm { color:#A08; font-weight:bold }
330
+ .source .co { color:#036; font-weight:bold }
331
+ .source .cr { color:#0A0 }
332
+ .source .cv { color:#369 }
333
+ .source .de { color:#B0B; }
334
+ .source .df { color:#099; font-weight:bold }
335
+ .source .di { color:#088; font-weight:bold }
336
+ .source .dl { color:black }
337
+ .source .do { color:#970 }
338
+ .source .dt { color:#34b }
339
+ .source .ds { color:#D42; font-weight:bold }
340
+ .source .e { color:#666; font-weight:bold }
341
+ .source .en { color:#800; font-weight:bold }
342
+ .source .er { color:#F00; background-color:#FAA }
343
+ .source .ex { color:#C00; font-weight:bold }
344
+ .source .fl { color:#60E; font-weight:bold }
345
+ .source .fu { color:#06B; font-weight:bold }
346
+ .source .gv { color:#d70; font-weight:bold }
347
+ .source .hx { color:#058; font-weight:bold }
348
+ .source .i { color:#00D; font-weight:bold }
349
+ .source .ic { color:#B44; font-weight:bold }
350
+
351
+ .source .il { background-color: hsla(0,0%,0%,0.1); color: black }
352
+ .source .il .idl { font-weight: bold; color: #666 }
353
+ .source .idl { font-weight: bold; background-color: hsla(0,0%,0%,0.1); color: #666; }
354
+
355
+ .source .im { color:#f00; }
356
+ .source .in { color:#B2B; font-weight:bold }
357
+ .source .iv { color:#33B }
358
+ .source .la { color:#970; font-weight:bold }
359
+ .source .lv { color:#963 }
360
+ .source .ns { color:#707; font-weight:bold }
361
+ .source .oc { color:#40E; font-weight:bold }
362
+ .source .op { }
363
+ .source .pc { color:#058; font-weight:bold }
364
+ .source .pd { color:#369; font-weight:bold }
365
+ .source .pp { color:#579; }
366
+ .source .ps { color:#00C; font-weight:bold }
367
+ .source .pt { color:#074; font-weight:bold }
368
+ .source .r, .kw { color:#080; font-weight:bold }
369
+
370
+ .source .ke { color: #808; }
371
+ .source .ke .dl { color: #606; }
372
+ .source .ke .ch { color: #80f; }
373
+ .source .vl { color: #088; }
374
+
375
+ .source .rx { background-color:hsla(300,100%,50%,0.1); }
376
+ .source .rx .k { color:#808 }
377
+ .source .rx .dl { color:#404 }
378
+ .source .rx .mod { color:#C2C }
379
+ .source .rx .fu { color:#404; font-weight: bold }
380
+
381
+ .source .s { background-color:hsla(0,100%,50%,0.1); }
382
+ .source .s .k { color: #D20; }
383
+ .source .s .ch { color: #b0b; }
384
+ .source .s .dl { color: #710; }
385
+
386
+ .source .sh { background-color:hsla(120,100%,50%,0.1); }
387
+ .source .sh .k { color:#2B2 }
388
+ .source .sh .dl { color:#161 }
389
+
390
+ .source .sy { color:#A60 }
391
+ .source .sy .k { color:#A60 }
392
+ .source .sy .dl { color:#630 }
393
+
394
+ .source .ta { color:#070 }
395
+ .source .ts { color:#D70; font-weight:bold }
396
+ .source .ty { color:#339; font-weight:bold }
397
+ .source .v { color:#036 }
398
+ .source .xt { color:#444 }
399
+
400
+ .source .ins { background: hsla(120,100%,50%,0.2) }
401
+ .source .del { background: hsla(0,100%,50%,0.2) }
402
+ .source .chg { color: #aaf; background: #007; }
403
+ .source .head { color: #f8f; background: #505 }
404
+ .source .head .filename { color: white; }
405
+
406
+ .source .ins .eye { background-color: hsla(120,100%,50%,0.2) }
407
+ .source .del .eye { background-color: hsla(0,100%,50%,0.2) }
408
+
409
+ .source .ins .ins { color: #080; background:transparent; font-weight:bold }
410
+ .source .del .del { color: #800; background:transparent; font-weight:bold }
411
+ .source .chg .chg { color: #66f; }
412
+ .source .head .head { color: #f4f; }
413
+
414
+ .rubylogo{
415
+ margin-left:1.4em;
416
+ margin-top:0.6em;
417
+ margin-right:1em;
418
+ float:left;
419
+ }
420
+
421
+ </style>
422
+ </head>
423
+ <body>
424
+ <div id="world">
425
+ <img class="rubylogo" alt="ruby" src="data:image/png;base64,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" />
426
+ <h1>Ruby Sugar Refinery</h1>
427
+ <br/>
428
+ <p class="text">The Ruby Sugar Refinery is a collection of tiny <a href="http://ruby-doc.org/core-2.3.0/doc/syntax/refinements_rdoc.html">refinements</a> (declarative local core extensions) for Ruby.</p>
429
+
430
+ <h2>Setup &amp; Usage</h2>
431
+ <p class="text">
432
+ Add to Gemfile:
433
+ </p>
434
+
435
+ <div class="cubes">
436
+ <code class="scode">gem 'sugar_refinery', require: 'sugar_refinery/all'</code>
437
+ </div>
438
+
439
+ <p class="text">
440
+ Then add refinements to the current Ruby file or module:
441
+ <div class="cubes">
442
+ <pre class="scode">using SugarRefinery::CamelSnake
443
+ using SugarRefinery::HashZip
444
+
445
+ "ClassName".to_snake # => "class_name"
446
+ Hash.zip [1,2,3], [4,5,6] # => {1=>4, 2=>5, 3=>6}</pre>
447
+ </div>
448
+ </p>
449
+
450
+ <h2>List of Refinements</h2>
451
+
452
+ ..cubes..
453
+
454
+ <h2>Changelog</h2>
455
+ <div class="cubes">
456
+ <pre class="scode">..changelog..</pre>
457
+ </div>
458
+ <br/>
459
+ </div>
460
+
461
+ <div id="foot">
462
+ <div id="smile"><a href="http://janlelis.com">J-_-L</a></div>
463
+ This is the Ruby Sugar Refinery ..version.. documentation (..date..).
464
+ It is available at <a href="http://janlelis.github.io/sugar_refinery">janlelis.github.io/sugar_refinery</a>.
465
+ Ruby Logo CC-BY-SA Yukihiro Matsumoto.
466
+ </div>
467
+
468
+ <a href="https://github.com/janlelis/sugar-refinery"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/38ef81f8aca64bb9a64448d0d70f1308ef5341ab/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6461726b626c75655f3132313632312e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png"></a>
469
+ </body>
470
+ </html>
471
+