ripper2ruby 0.0.1

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 (111) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.markdown +10 -0
  3. data/lib/core_ext/array/flush.rb +5 -0
  4. data/lib/core_ext/hash/delete_at.rb +5 -0
  5. data/lib/core_ext/object/meta_class.rb +5 -0
  6. data/lib/core_ext/object/try.rb +12 -0
  7. data/lib/erb/stripper.rb +48 -0
  8. data/lib/highlighters/ansi.rb +29 -0
  9. data/lib/ripper/event_log.rb +45 -0
  10. data/lib/ripper/ruby_builder.rb +168 -0
  11. data/lib/ripper/ruby_builder/buffer.rb +34 -0
  12. data/lib/ripper/ruby_builder/events/args.rb +40 -0
  13. data/lib/ripper/ruby_builder/events/array.rb +71 -0
  14. data/lib/ripper/ruby_builder/events/assignment.rb +55 -0
  15. data/lib/ripper/ruby_builder/events/block.rb +80 -0
  16. data/lib/ripper/ruby_builder/events/call.rb +123 -0
  17. data/lib/ripper/ruby_builder/events/case.rb +17 -0
  18. data/lib/ripper/ruby_builder/events/const.rb +47 -0
  19. data/lib/ripper/ruby_builder/events/for.rb +13 -0
  20. data/lib/ripper/ruby_builder/events/hash.rb +24 -0
  21. data/lib/ripper/ruby_builder/events/identifier.rb +41 -0
  22. data/lib/ripper/ruby_builder/events/if.rb +37 -0
  23. data/lib/ripper/ruby_builder/events/lexer.rb +159 -0
  24. data/lib/ripper/ruby_builder/events/literal.rb +47 -0
  25. data/lib/ripper/ruby_builder/events/method.rb +21 -0
  26. data/lib/ripper/ruby_builder/events/operator.rb +23 -0
  27. data/lib/ripper/ruby_builder/events/statements.rb +50 -0
  28. data/lib/ripper/ruby_builder/events/string.rb +117 -0
  29. data/lib/ripper/ruby_builder/events/symbol.rb +22 -0
  30. data/lib/ripper/ruby_builder/events/while.rb +27 -0
  31. data/lib/ripper/ruby_builder/queue.rb +33 -0
  32. data/lib/ripper/ruby_builder/stack.rb +125 -0
  33. data/lib/ripper/ruby_builder/token.rb +91 -0
  34. data/lib/ripper2ruby.rb +1 -0
  35. data/lib/ruby.rb +28 -0
  36. data/lib/ruby/aggregate.rb +71 -0
  37. data/lib/ruby/alternation/args.rb +25 -0
  38. data/lib/ruby/alternation/hash.rb +25 -0
  39. data/lib/ruby/alternation/list.rb +19 -0
  40. data/lib/ruby/args.rb +36 -0
  41. data/lib/ruby/array.rb +27 -0
  42. data/lib/ruby/assignment.rb +32 -0
  43. data/lib/ruby/assoc.rb +17 -0
  44. data/lib/ruby/block.rb +42 -0
  45. data/lib/ruby/call.rb +34 -0
  46. data/lib/ruby/case.rb +30 -0
  47. data/lib/ruby/const.rb +49 -0
  48. data/lib/ruby/for.rb +18 -0
  49. data/lib/ruby/hash.rb +14 -0
  50. data/lib/ruby/if.rb +35 -0
  51. data/lib/ruby/list.rb +40 -0
  52. data/lib/ruby/literal.rb +45 -0
  53. data/lib/ruby/method.rb +19 -0
  54. data/lib/ruby/node.rb +47 -0
  55. data/lib/ruby/node/composite.rb +68 -0
  56. data/lib/ruby/node/conversions.rb +66 -0
  57. data/lib/ruby/node/position.rb +35 -0
  58. data/lib/ruby/node/source.rb +29 -0
  59. data/lib/ruby/node/text.rb +121 -0
  60. data/lib/ruby/node/traversal.rb +82 -0
  61. data/lib/ruby/operator.rb +49 -0
  62. data/lib/ruby/params.rb +41 -0
  63. data/lib/ruby/statements.rb +45 -0
  64. data/lib/ruby/string.rb +40 -0
  65. data/lib/ruby/symbol.rb +27 -0
  66. data/lib/ruby/token.rb +51 -0
  67. data/lib/ruby/while.rb +32 -0
  68. data/test/all.rb +3 -0
  69. data/test/builder/stack_test.rb +67 -0
  70. data/test/builder/text_test.rb +118 -0
  71. data/test/context_test.rb +54 -0
  72. data/test/erb_stripper_test.rb +29 -0
  73. data/test/fixtures/all.rb.src +150 -0
  74. data/test/fixtures/source_1.rb +16 -0
  75. data/test/fixtures/source_2.rb +1 -0
  76. data/test/fixtures/stuff.rb +371 -0
  77. data/test/fixtures/template.html.erb +22 -0
  78. data/test/fixtures/tmp.rb +6 -0
  79. data/test/lib_test.rb +92 -0
  80. data/test/lib_test_helper.rb +103 -0
  81. data/test/libs.txt +227 -0
  82. data/test/nodes/args_test.rb +100 -0
  83. data/test/nodes/array_test.rb +141 -0
  84. data/test/nodes/assignment_test.rb +49 -0
  85. data/test/nodes/block_test.rb +125 -0
  86. data/test/nodes/call_test.rb +229 -0
  87. data/test/nodes/case_test.rb +68 -0
  88. data/test/nodes/comments_test.rb +25 -0
  89. data/test/nodes/const_test.rb +46 -0
  90. data/test/nodes/conversions_test.rb +9 -0
  91. data/test/nodes/for_test.rb +34 -0
  92. data/test/nodes/hash_test.rb +71 -0
  93. data/test/nodes/heredoc_test.rb +202 -0
  94. data/test/nodes/identifier_test.rb +51 -0
  95. data/test/nodes/if_test.rb +100 -0
  96. data/test/nodes/literals_test.rb +63 -0
  97. data/test/nodes/method_test.rb +92 -0
  98. data/test/nodes/namespaces_test.rb +65 -0
  99. data/test/nodes/node_test.rb +74 -0
  100. data/test/nodes/nodes_test.rb +23 -0
  101. data/test/nodes/operator_test.rb +241 -0
  102. data/test/nodes/separators_test.rb +97 -0
  103. data/test/nodes/statements_test.rb +70 -0
  104. data/test/nodes/string_test.rb +92 -0
  105. data/test/nodes/symbol_test.rb +57 -0
  106. data/test/nodes/unless_test.rb +42 -0
  107. data/test/nodes/until_test.rb +61 -0
  108. data/test/nodes/while_test.rb +71 -0
  109. data/test/test_helper.rb +51 -0
  110. data/test/traversal_test.rb +53 -0
  111. metadata +163 -0
@@ -0,0 +1,22 @@
1
+ <html>
2
+ <ul>
3
+ <% f.field_set do %>
4
+ <%% column do %%>
5
+ <% [:foo].each do |foo| %>
6
+ <li>
7
+
8
+ <span><%= t(:erb_1) %></span>
9
+ <%#= comment
10
+ comment
11
+ comment %>
12
+ </li>
13
+ <% end %>
14
+ <br>
15
+
16
+ <%- t(:erb_2) -%>
17
+
18
+ <% t(:'foo.erb_3') %> <% bar %>
19
+ <% end %>
20
+ <% end %>
21
+ </ul>
22
+ </html>
@@ -0,0 +1,6 @@
1
+ p(<<stuff+'foobar')\
2
+ +"more stuff"
3
+ some stuff
4
+ stuff
5
+
6
+
data/test/lib_test.rb ADDED
@@ -0,0 +1,92 @@
1
+ require File.dirname(__FILE__) + '/lib_test_helper'
2
+
3
+ TMP_DIR = File.expand_path(File.dirname(__FILE__) + '/../../tmp/libs')
4
+
5
+ class BuildTest
6
+ include LibTestHelper
7
+
8
+ def test_library_build(*names)
9
+ options = names.last.is_a?(Hash) ? names.pop : {}
10
+ verbose = options[:verbose]
11
+ names = libs.keys if names.empty?
12
+ names.delete(:rubinius)
13
+
14
+ puts "Going to parse and rebuild Ruby files from the following #{names.size} libraries:\n\n#{names.join(', ')}\n\n"
15
+ puts "Will report an o if the rebuilt code is not exactly the same as the original source."
16
+ puts "Will report an x if the code can not be parsed by Ripper (most probably Ruby 1.9 incompatible)."
17
+ puts "Let's go ...\n"
18
+ errors = {}
19
+
20
+ names.each do |name|
21
+ # next if name < 'crap4r'
22
+ puts "\n#{name}"
23
+
24
+ lib = libs[name]
25
+ lib[:exclude] ||= []
26
+ lib[:exclude] << "/vendor/" << # don't parse various plugins or frozen rails twice
27
+ "/simple_benches" << # looks like some pseudo code in merb
28
+ "/test/hoge.rb" << # an erubis file
29
+
30
+ errors[name] = []
31
+ filenames(File.expand_path(lib[:path])).each do |filename|
32
+ next if excluded?(lib, filename)
33
+ src = read_src(filename, lib)
34
+ p filename if verbose
35
+ begin
36
+ result = build(src, filename).to_ruby(true)
37
+ if src == result
38
+ putc '.'
39
+ else
40
+ errors[name] << filename + "\nresult differs from source:\n#{diff(src, result)}\n"
41
+ verbose ? puts(diff(src, result)) : putc('o')
42
+ end
43
+ rescue Exception => e
44
+ line = e.message
45
+ line = filename + ': ' + line unless line.index(filename)
46
+ errors[name] << line + "\n"
47
+ putc e.is_a?(Ripper::RubyBuilder::ParseError) ? 'x' : 'e'
48
+ end
49
+ end
50
+
51
+ puts
52
+ report(errors, name, lib[:path])
53
+ end
54
+
55
+ # puts
56
+ # names.each { |name| report(errors, name, libs[name][:path]) }
57
+ end
58
+
59
+ def test_tmp_file
60
+ filename = File.dirname(__FILE__) + '/fixtures/tmp.rb'
61
+ src = read_src(filename)
62
+ result = build(src, filename).to_ruby(true) || ''
63
+ puts diff(src, result)
64
+ end
65
+
66
+ def test_this
67
+ src = 'a+ a +a'
68
+ result = build(src).to_ruby(true) || ''
69
+ puts diff(src, result)
70
+ end
71
+
72
+ def libs
73
+ @libs ||= begin
74
+ Dir["#{TMP_DIR}/*"].inject({}) do |dirs, dir|
75
+ dirs[File.basename(dir).to_sym] = { :path => dir }
76
+ dirs
77
+ end
78
+ end
79
+ end
80
+
81
+ def clone_libs
82
+ urls = File.read(File.dirname(__FILE__) + '/libs.txt').split("\n")
83
+ urls.each do |url|
84
+ # next if File.dir?(tmp_dir)
85
+ puts `cd #{TMP_DIR}; git clone #{url}`
86
+ end
87
+ end
88
+ end
89
+
90
+ # BuildTest.new.clone_libs
91
+ BuildTest.new.test_library_build
92
+ # BuildTest.new.test_tmp_file
@@ -0,0 +1,103 @@
1
+ $: << File.expand_path(File.dirname(__FILE__) + '/../lib')
2
+
3
+ require 'pp'
4
+ require 'ripper/ruby_builder'
5
+ require 'ripper/event_log'
6
+ require 'highlighters/ansi'
7
+ require 'erb/stripper'
8
+ require 'diff/lcs'
9
+ require 'diff/lcs/hunk'
10
+
11
+ module LibTestHelper
12
+ def build(src, filename = nil)
13
+ Ripper::RubyBuilder.build(src, filename)
14
+ end
15
+
16
+ def sexp(src)
17
+ pp Ripper::SexpBuilder.new(src).parse
18
+ end
19
+
20
+ def log(src)
21
+ Ripper::EventLog.out(src)
22
+ end
23
+
24
+ def filenames(root)
25
+ Dir["#{root}/**/*.rb"].sort
26
+ end
27
+
28
+ def read_file(filename)
29
+ src = File.read(filename)
30
+ src = File.open(filename, 'r:iso-8859-1') { |f| f.read } unless src.valid_encoding?
31
+ src = File.open(filename, 'r:ascii-8bit') { |f| f.read } unless src.valid_encoding?
32
+ src || ''
33
+ end
34
+
35
+ def read_src(filename, lib = nil)
36
+ src = read_file(filename)
37
+ src = strip_erb(src) if lib && erb?(lib, filename)
38
+ src || ''
39
+ end
40
+
41
+ def excluded?(lib, filename)
42
+ lib[:exclude].any? { |exclude| filename.index(exclude) }
43
+ end
44
+
45
+ def erb?(lib, filename)
46
+ Array(lib[:erb] || %r(/templates/|environment\.rb)).any? { |pattern| filename =~ pattern }
47
+ end
48
+
49
+ def strip_erb(src)
50
+ Erb::Stripper.new.to_ruby(src)
51
+ end
52
+
53
+ def report(errors, name, path)
54
+ errors = errors[name]
55
+ msg = if errors && !errors.empty?
56
+ # output the broken line
57
+ # suggest possible fixes
58
+ "#{errors.count} problems found in #{name}:\n" + errors.map { |e| e.gsub(path, name.to_s) }.join
59
+ else
60
+ "no problems found in #{name}"
61
+ end
62
+ puts msg
63
+ end
64
+
65
+ def highlight_diff(str)
66
+ green = Highlighters::Ansi.new(:green)
67
+ red = Highlighters::Ansi.new(:red)
68
+ str.split("\n").map do |line|
69
+ line = green.highlight(line) if line =~ /^\+/
70
+ line = red.highlight(line) if line =~ /^\-/
71
+ line
72
+ end.join("\n")
73
+ end
74
+
75
+ # some ruby cookbook
76
+ def diff(data_old, data_new, format=:unified, context_lines=3)
77
+ data_old = data_old.split(/\n/).map! { |e| e.chomp }
78
+ data_new = data_new.split(/\n/).map! { |e| e.chomp }
79
+ output = ""
80
+ diffs = Diff::LCS.diff(data_old, data_new)
81
+ return output if diffs.empty?
82
+ oldhunk = hunk = nil
83
+ file_length_difference = 0
84
+ diffs.each do |piece|
85
+ begin
86
+ hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines, file_length_difference)
87
+ file_length_difference = hunk.file_length_difference
88
+ next unless oldhunk
89
+ if (context_lines > 0) and hunk.overlaps?(oldhunk)
90
+ hunk.unshift(oldhunk)
91
+ else
92
+ output << oldhunk.diff(format)
93
+ end
94
+ ensure
95
+ oldhunk = hunk
96
+ output << "\n"
97
+ end
98
+ end
99
+ output << oldhunk.diff(format) << "\n"
100
+ highlight_diff(output)
101
+ end
102
+
103
+ end
data/test/libs.txt ADDED
@@ -0,0 +1,227 @@
1
+ git://github.com/37signals/cached_externals.git
2
+ git://github.com/activescaffold/active_scaffold.git
3
+ git://github.com/adamjmurray/cosy.git
4
+ git://github.com/adamwiggins/rest-client.git
5
+ git://github.com/adamwiggins/rifgraf.git
6
+ git://github.com/alexvollmer/daemon-spawn.git
7
+ git://github.com/aslakhellesoy/cucumber.git
8
+ git://github.com/aslakhellesoy/cucumber_rails.git
9
+ git://github.com/azimux/externals.git
10
+ git://github.com/billymeltdown/looper.git
11
+ git://github.com/binarylogic/authlogic.git
12
+ git://github.com/bleything/midiator.git
13
+ git://github.com/breakpointer/ajax-rdoc.git
14
+ git://github.com/browsermedia/browsercms.git
15
+ git://github.com/bryanl/simple-daemon.git
16
+ git://github.com/brynary/arel.git
17
+ git://github.com/brynary/cache-money.git
18
+ git://github.com/brynary/dryopteris.git
19
+ git://github.com/brynary/graticule.git
20
+ git://github.com/brynary/merb_cucumber.git
21
+ git://github.com/brynary/rack-bug.git
22
+ git://github.com/brynary/rack-test.git
23
+ git://github.com/brynary/redis-rb.git
24
+ git://github.com/brynary/webrat.git
25
+ git://github.com/btakita/rr.git
26
+ git://github.com/cainlevy/freemium.git
27
+ git://github.com/chneukirchen/bacon.git
28
+ git://github.com/chneukirchen/daiquiri.git
29
+ git://github.com/chneukirchen/ji.git
30
+ git://github.com/chuyeow/facon.git
31
+ git://github.com/cloudhead/less.git
32
+ git://github.com/coatl/rubylexer.git
33
+ git://github.com/commondream/rcov_plugin.git
34
+ git://github.com/contrast/exceptional.git
35
+ git://github.com/courtenay/altered_beast.git
36
+ git://github.com/cpjolicoeur/cerberus.git
37
+ git://github.com/craigw/sprinkles.git
38
+ git://github.com/david/merb_cucumber.git
39
+ git://github.com/dchelimsky/rspec-rails.git
40
+ git://github.com/dchelimsky/rspec.git
41
+ git://github.com/defunkt/cache_fu.git
42
+ git://github.com/defunkt/diff-lcs.git
43
+ git://github.com/defunkt/exception_logger.git
44
+ git://github.com/defunkt/rip.git
45
+ git://github.com/defunkt/sake.git
46
+ git://github.com/dougal/daemon_generator.git
47
+ git://github.com/drnic/newgem.git
48
+ git://github.com/edavis10/redmine.git
49
+ git://github.com/elliottcable/highline.git
50
+ git://github.com/entp/seinfeld.git
51
+ git://github.com/evanphx/rubinius.git
52
+ git://github.com/eventmachine/
53
+ git://github.com/evilchelu/braid.git
54
+ git://github.com/ezmobius/nanite.git
55
+ git://github.com/ezmobius/redis-rb.git
56
+ git://github.com/fabien/im_magick.git
57
+ git://github.com/fauna/echoe.git
58
+ git://github.com/fauna/ultrasphinx.git
59
+ git://github.com/fesplugas/typus.git
60
+ git://github.com/floehopper/mocha.git
61
+ git://github.com/flogic/object_daddy.git
62
+ git://github.com/FooBarWidget/daemon_controller.git
63
+ git://github.com/FooBarWidget/passenger.git
64
+ git://github.com/francois/piston.git
65
+ git://github.com/freelancing-god/thinking-sphinx.git
66
+ git://github.com/Gabrielg1976/ruby_music_projects.git
67
+ git://github.com/georgi/git_store.git
68
+ git://github.com/gilesbowkett/archaeopteryx.git
69
+ git://github.com/giraffesoft/classy_resources.git
70
+ git://github.com/grosser/fast_gettext.git
71
+ git://github.com/hcatlin/sass.git
72
+ git://github.com/ichverstehe/isaac.git
73
+ git://github.com/insoshi/insoshi.git
74
+ git://github.com/integrity/integrity.git
75
+ git://github.com/iownbey/docbox.git
76
+ git://github.com/jacius/rubygame.git
77
+ git://github.com/jamis/capistrano.git
78
+ git://github.com/janne/model_translations.git
79
+ git://github.com/jashkenas/ruby-processing.git
80
+ git://github.com/javan/whenever.git
81
+ git://github.com/jeremyevans/sequel.git
82
+ git://github.com/jeremymcanally/context.git
83
+ git://github.com/jeremymcanally/matchy.git
84
+ git://github.com/jeremymcanally/rails-templates.git
85
+ git://github.com/jeremymcanally/stump.git
86
+ git://github.com/jgarber/redcloth.git
87
+ git://github.com/jimm/midilib.git
88
+ git://github.com/jimweirich/flexmock.git
89
+ git://github.com/jimweirich/rake.git
90
+ git://github.com/jlnr/gosu.git
91
+ git://github.com/jnewland/sinatra-rubygems.git
92
+ git://github.com/jnstq/job_fu.git
93
+ git://github.com/jnunemaker/httparty.git
94
+ git://github.com/jnunemaker/twitter.git
95
+ git://github.com/joshmh/globalize2.git
96
+ git://github.com/jscruggs/metric_fu.git
97
+ git://github.com/jsn/rbot.git
98
+ git://github.com/jvoorhis/music_player.git
99
+ git://github.com/kennethkalmer/daemon-kit.git
100
+ git://github.com/kevinrutherford/crap4r.git
101
+ git://github.com/kevinrutherford/reek.git
102
+ git://github.com/knewter/ansuz.git
103
+ git://github.com/kr/beanstalkd.git
104
+ git://github.com/Lipsiasoft/lipsiadmin.git
105
+ git://github.com/lsegal/yard.git
106
+ git://github.com/lstoll/mechanical_github.git
107
+ git://github.com/macournoyer/thin.git
108
+ git://github.com/manalang/bdoc.git
109
+ git://github.com/manveru/innate.git
110
+ git://github.com/manveru/makura.git
111
+ git://github.com/manveru/ramaze.git
112
+ git://github.com/martinjandrews/roodi.git
113
+ git://github.com/mbleigh/princely.git
114
+ git://github.com/michaeldv/fat_free_crm.git
115
+ git://github.com/mislav/bluecloth.git
116
+ git://github.com/mislav/will_paginate.git
117
+ git://github.com/mojombo/chronic.git
118
+ git://github.com/mojombo/fixture-scenarios.git
119
+ git://github.com/mojombo/god.git
120
+ git://github.com/mojombo/grit.git
121
+ git://github.com/mojombo/jekyll.git
122
+ git://github.com/mongrel/mongrel.git
123
+ git://github.com/nathansobo/treetop.git
124
+ git://github.com/nbibler/rubyzip.git
125
+ git://github.com/ncr/background-fu.git
126
+ git://github.com/newsdesk/translate.git
127
+ git://github.com/nex3/haml.git
128
+ git://github.com/notahat/machinist.git
129
+ git://github.com/olabini/paipr.git
130
+ git://github.com/parfait/acts_like_git.git
131
+ git://github.com/pat-maddox/giternal.git
132
+ git://github.com/pauldix/typhoeus.git
133
+ git://github.com/peritor/backdrop.git
134
+ git://github.com/probablycorey/mini_magick.git
135
+ git://github.com/quirkey/gembox.git
136
+ git://github.com/rack/rack-contrib.git
137
+ git://github.com/rack/rack.git
138
+ git://github.com/radiant/radiant.git
139
+ git://github.com/railfrog/railfrog.git
140
+ git://github.com/rails/exception_notification.git
141
+ git://github.com/rails/open_id_authentication.git
142
+ git://github.com/rails/rails.git
143
+ git://github.com/railsdog/spree.git
144
+ git://github.com/railsgarden/jazztoolbox.git
145
+ git://github.com/railsmachine/moonshine.git
146
+ git://github.com/reagent/simple-gem.git
147
+ git://github.com/relevance/cap_gun.git
148
+ git://github.com/relevance/rcov.git
149
+ git://github.com/relevance/streamlined.git
150
+ git://github.com/resolve/Refinery.git
151
+ git://github.com/rgrove/sanitize.git
152
+ git://github.com/RISCfuture/autumn.git
153
+ git://github.com/rtomayko/rdiscount.git
154
+ git://github.com/rtomayko/rpeg-markdown.git
155
+ git://github.com/rubyist/aasm.git
156
+ git://github.com/ruport/ruport.git
157
+ git://github.com/saizai/superdeploy.git
158
+ git://github.com/sandal/prawn.git
159
+ git://github.com/sbecker/asset_packager.git
160
+ git://github.com/seamusabshere/daemons.git
161
+ git://github.com/seanohalpin/smqueue.git
162
+ git://github.com/seattlerb/flay.git
163
+ git://github.com/seattlerb/flog.git
164
+ git://github.com/seattlerb/heckle.git
165
+ git://github.com/seattlerb/hoe.git
166
+ git://github.com/seattlerb/image_science.git
167
+ git://github.com/seattlerb/parsetree.git
168
+ git://github.com/seattlerb/ruby2ruby.git
169
+ git://github.com/seattlerb/ruby_parser.git
170
+ git://github.com/seattlerb/ruby_to_c.git
171
+ git://github.com/seattlerb/vlad.git
172
+ git://github.com/seattlerb/zentest.git
173
+ git://github.com/shairontoledo/rghost.git
174
+ git://github.com/shawn42/gamebox.git
175
+ git://github.com/Shopify/active_fulfillment.git
176
+ git://github.com/Shopify/active_merchant.git
177
+ git://github.com/Shopify/active_shipping.git
178
+ git://github.com/Shopify/cacheable.git
179
+ git://github.com/sinatra/sinatra.git
180
+ git://github.com/starling/starling.git
181
+ git://github.com/svenfuchs/adva_cms.git
182
+ git://github.com/svenfuchs/i18n.git
183
+ git://github.com/taf2/curb.git
184
+ git://github.com/technicalpickles/jeweler.git
185
+ git://github.com/technoweenie/acts_as_paranoid.git
186
+ git://github.com/technoweenie/acts_as_versioned.git
187
+ git://github.com/technoweenie/attachment_fu.git
188
+ git://github.com/technoweenie/can_search.git
189
+ git://github.com/technoweenie/mephisto.git
190
+ git://github.com/technoweenie/permalink_fu.git
191
+ git://github.com/technoweenie/restful-authentication.git
192
+ git://github.com/technoweenie/sentry.git
193
+ git://github.com/technoweenie/viking.git
194
+ git://github.com/tenderlove/nokogiri.git
195
+ git://github.com/thorny-sun/prawnto.git
196
+ git://github.com/thoughtbot/clearance.git
197
+ git://github.com/thoughtbot/factory_girl.git
198
+ git://github.com/thoughtbot/hoptoad_notifier.git
199
+ git://github.com/thoughtbot/paperclip.git
200
+ git://github.com/thoughtbot/shoulda.git
201
+ git://github.com/thoughtbot/squirrel.git
202
+ git://github.com/thoughtworks/cruisecontrol.rb.git
203
+ git://github.com/timcharper/bundle-fu.git
204
+ git://github.com/tmm1/amqp.git
205
+ git://github.com/tobi/delayed_job.git
206
+ git://github.com/tobi/liquid.git
207
+ git://github.com/topfunky/gruff.git
208
+ git://github.com/toretore/zippy.git
209
+ git://github.com/tra/spawn.git
210
+ git://github.com/TwP/bones.git
211
+ git://github.com/TwP/webby.git
212
+ git://github.com/voloko/sdoc.git
213
+ git://github.com/vvs/rubygems.git
214
+ git://github.com/why/hacketyhack.git
215
+ git://github.com/why/hobix.git
216
+ git://github.com/why/hpricot.git
217
+ git://github.com/why/markaby.git
218
+ git://github.com/why/shoes.git
219
+ git://github.com/why/unholy.git
220
+ git://github.com/winton/externals.git
221
+ git://github.com/wr0ngway/rubber.git
222
+ git://github.com/wycats/merb-extlib.git
223
+ git://github.com/wycats/merb-plugins.git
224
+ git://github.com/wycats/merb.git
225
+ git://github.com/wycats/merb_dm_rest.git
226
+ git://github.com/wycats/thor.git
227
+ git://github.com/xaviershay/enki.git