sugar_refinery 1.0.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 (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
+