Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

* Add newgem files

  • Loading branch information...
commit c075dc43f839d609d357033148d9b0dfc35ff32f 1 parent 7cff19b
Scott Taylor authored October 26, 2008
4  History.txt
... ...
@@ -0,0 +1,4 @@
  1
+== 0.0.1 2008-10-26
  2
+
  3
+* 1 major enhancement:
  4
+  * Initial release
172  Manifest.txt
... ...
@@ -0,0 +1,172 @@
  1
+DEPENDENCIES
  2
+History.txt
  3
+Manifest.txt
  4
+PostInstall.txt
  5
+README
  6
+README.rdoc
  7
+Rakefile
  8
+Rakefile.14157.0
  9
+SQL92_SPEC
  10
+TAGS
  11
+TODO
  12
+benchmarks/order_with_sort_by.benchmark
  13
+benchmarks/ordering.benchmark
  14
+benchmarks/ordering.rb
  15
+benchmarks/parse_insert_2000.rb
  16
+benchmarks/parse_insert_2000/handwritten_preparser_with_compilation
  17
+benchmarks/parse_insert_2000/handwritten_preparser_without_compilation
  18
+benchmarks/parse_insert_2000/treetop_preparser_with_compilation
  19
+benchmarks/parse_insert_2000/treetop_preparser_without_compilation
  20
+config/hoe.rb
  21
+config/requirements.rb
  22
+lib/guillotine.rb
  23
+lib/guillotine.rb.14157.0
  24
+lib/guillotine/assertions.rb
  25
+lib/guillotine/conditions.rb
  26
+lib/guillotine/conditions/and_condition.rb
  27
+lib/guillotine/conditions/base.rb
  28
+lib/guillotine/conditions/or_condition.rb
  29
+lib/guillotine/data_store.rb
  30
+lib/guillotine/expressions.rb
  31
+lib/guillotine/expressions/backtick_string.rb
  32
+lib/guillotine/expressions/base.rb
  33
+lib/guillotine/expressions/column.rb
  34
+lib/guillotine/expressions/delete.rb
  35
+lib/guillotine/expressions/expressions.rb
  36
+lib/guillotine/expressions/from.rb
  37
+lib/guillotine/expressions/group_by.rb
  38
+lib/guillotine/expressions/insert.rb
  39
+lib/guillotine/expressions/limit.rb
  40
+lib/guillotine/expressions/order_by.rb
  41
+lib/guillotine/expressions/select.rb
  42
+lib/guillotine/expressions/select_expression.rb
  43
+lib/guillotine/expressions/truncate.rb
  44
+lib/guillotine/extensions.rb
  45
+lib/guillotine/extensions/fixnum.rb
  46
+lib/guillotine/extensions/object.rb
  47
+lib/guillotine/extensions/string.rb
  48
+lib/guillotine/extensions/symbol.rb
  49
+lib/guillotine/keywords.rb
  50
+lib/guillotine/parser.rb
  51
+lib/guillotine/parser/c_extensions/#asdfas#
  52
+lib/guillotine/parser/c_extensions/CQuotesParser.c
  53
+lib/guillotine/parser/c_extensions/CQuotesParser.o
  54
+lib/guillotine/parser/c_extensions/Makefile
  55
+lib/guillotine/parser/c_extensions/c_quotes_parser.bundle
  56
+lib/guillotine/parser/c_extensions/extconf.rb
  57
+lib/guillotine/parser/primitives.treetop
  58
+lib/guillotine/parser/quotes_parser.rb
  59
+lib/guillotine/parser/sql.treetop
  60
+lib/guillotine/parser/sql_chars.treetop
  61
+lib/guillotine/parser/sql_delete.treetop
  62
+lib/guillotine/parser/sql_drop_table.treetop
  63
+lib/guillotine/parser/sql_from_clause.treetop
  64
+lib/guillotine/parser/sql_group_by_clause.treetop
  65
+lib/guillotine/parser/sql_helpers.treetop
  66
+lib/guillotine/parser/sql_insert.treetop
  67
+lib/guillotine/parser/sql_key_value_pair.treetop
  68
+lib/guillotine/parser/sql_limit.treetop
  69
+lib/guillotine/parser/sql_order_by_clause.treetop
  70
+lib/guillotine/parser/sql_row_support.treetop
  71
+lib/guillotine/parser/sql_select.treetop
  72
+lib/guillotine/parser/sql_select_clause.treetop
  73
+lib/guillotine/parser/sql_show_tables.treetop
  74
+lib/guillotine/parser/sql_transaction.treetop
  75
+lib/guillotine/parser/sql_where_condition.treetop
  76
+lib/guillotine/parser/truncate.treetop
  77
+lib/guillotine/pre_parser.rb
  78
+lib/guillotine/rake.rb
  79
+lib/guillotine/rake/emacs.rb
  80
+lib/guillotine/rake/treetop.rb
  81
+lib/guillotine/require.rb
  82
+lib/guillotine/statement_executor.rb
  83
+lib/guillotine/test_support.rb
  84
+lib/guillotine/test_support/connection.rb
  85
+lib/guillotine/test_support/mysql_overrider.rb
  86
+lib/guillotine/test_support/rspec.rb
  87
+lib/guillotine/transactions.rb
  88
+lib/guillotine/transactions/id_generator.rb
  89
+lib/guillotine/transactions/store.rb
  90
+lib/guillotine/transactions/transaction.rb
  91
+lib/guillotine/version.rb
  92
+lib/guillotine/version.rb.14157.0
  93
+script/console
  94
+script/destroy
  95
+script/generate
  96
+script/txt2html
  97
+setup.rb
  98
+spec/guillotine/#asdfasd#
  99
+spec/guillotine/#connection_spec.rb#
  100
+spec/guillotine/#timed_cache_spec.rb#
  101
+spec/guillotine/conditions_spec.rb
  102
+spec/guillotine/data_store/table_spec.rb
  103
+spec/guillotine/data_store_spec.rb
  104
+spec/guillotine/expressions/base_spec.rb
  105
+spec/guillotine/expressions/column_spec.rb
  106
+spec/guillotine/expressions/delete_spec.rb
  107
+spec/guillotine/expressions/from_expression_spec.rb
  108
+spec/guillotine/expressions/group_by_spec.rb
  109
+spec/guillotine/expressions/insert_spec.rb
  110
+spec/guillotine/expressions/insert_spec.rb~
  111
+spec/guillotine/expressions/joiner_spec.rb
  112
+spec/guillotine/expressions/limit_spec.rb
  113
+spec/guillotine/expressions/order_by_spec.rb
  114
+spec/guillotine/expressions/select_expression_spec.rb
  115
+spec/guillotine/expressions/select_spec.rb
  116
+spec/guillotine/expressions/truncate_spec.rb
  117
+spec/guillotine/expressions_spec.rb
  118
+spec/guillotine/extensions/integer_spec.rb
  119
+spec/guillotine/extensions/object_spec.rb
  120
+spec/guillotine/extensions/string_spec.rb
  121
+spec/guillotine/extensions/symbol_spec.rb
  122
+spec/guillotine/integration/#asdfas#
  123
+spec/guillotine/integration/database.yml
  124
+spec/guillotine/integration/rspec_test_support_spec.rb
  125
+spec/guillotine/integration/spec_helper.rb
  126
+spec/guillotine/keywords_spec.rb
  127
+spec/guillotine/parser/#asdfa#
  128
+spec/guillotine/parser/quotes_spec.rb
  129
+spec/guillotine/parser/sql_delete_spec.rb
  130
+spec/guillotine/parser/sql_from_clause_spec.rb
  131
+spec/guillotine/parser/sql_group_by_clause_spec.rb
  132
+spec/guillotine/parser/sql_insert_clause_spec.rb
  133
+spec/guillotine/parser/sql_key_value_pair_spec.rb
  134
+spec/guillotine/parser/sql_limit_parser_spec.rb
  135
+spec/guillotine/parser/sql_order_by_clause_spec.rb
  136
+spec/guillotine/parser/sql_primitives_spec.rb
  137
+spec/guillotine/parser/sql_select_clause_spec.rb
  138
+spec/guillotine/parser/sql_select_spec.rb
  139
+spec/guillotine/parser/sql_show_tables_spec.rb
  140
+spec/guillotine/parser/sql_spec.rb
  141
+spec/guillotine/parser/sql_table_operations_spec.rb
  142
+spec/guillotine/parser/sql_transaction_spec.rb
  143
+spec/guillotine/parser/sql_truncate_spec.rb
  144
+spec/guillotine/parser/sql_where_clause_spec.rb
  145
+spec/guillotine/pre_parser_spec.rb
  146
+spec/guillotine/require_spec.rb
  147
+spec/guillotine/sql_parser/backtick_string_spec.rb
  148
+spec/guillotine/sql_parser/expression_spec.rb
  149
+spec/guillotine/statement_executor_spec.rb
  150
+spec/guillotine/test_support/connection_spec.rb
  151
+spec/guillotine/test_support/mysql_overrider_spec.rb
  152
+spec/guillotine/test_support/rspec_spec.rb
  153
+spec/guillotine/transactions/id_generator_spec.rb
  154
+spec/guillotine/transactions/store_spec.rb
  155
+spec/guillotine/transactions/transaction_spec.rb
  156
+spec/guillotine/version_spec.rb
  157
+spec/guillotine_spec.rb
  158
+spec/regressions/#or_spec.rb#
  159
+spec/regressions/or_spec.rb
  160
+spec/spec.opts
  161
+spec/spec_helper.rb
  162
+tasks/deployment.rake
  163
+tasks/environment.rake
  164
+tasks/website.rake
  165
+test/test_guillotine.rb
  166
+test/test_helper.rb
  167
+tmp.diff
  168
+website/index.html
  169
+website/index.txt
  170
+website/javascripts/rounded_corners_lite.inc.js
  171
+website/stylesheets/screen.css
  172
+website/template.html.erb
7  PostInstall.txt
... ...
@@ -0,0 +1,7 @@
  1
+
  2
+For more information on guillotine, see http://guillotine.rubyforge.org
  3
+
  4
+NOTE: Change this information in PostInstall.txt 
  5
+You can also delete it if you don't want it.
  6
+
  7
+
92  Rakefile
... ...
@@ -1,80 +1,12 @@
1  
-
2  
-require File.dirname(__FILE__) + "/lib/guillotine"
3  
-TASKS = Guillotine::RakeTasks
4  
-
5  
-namespace :c_extensions do
6  
-  desc "Build C extension"
7  
-  task :make do
8  
-    dir = "#{File.dirname(__FILE__)}/lib/guillotine/parser/c_extensions"
9  
-    sh "ruby #{dir}/extconf.rb --with-c-quotes-parser-dir='#{dir}'"
10  
-    sh "make #{dir}"
11  
-  end
12  
-  
13  
-  desc "Clean C extension auto-generated files"
14  
-  task :clean do
15  
-    files = [
16  
-      "lib/guillotine/parser/c_extensions/CQuotesParser.o",
17  
-      "lib/guillotine/parser/c_extensions/Makefile",
18  
-      "lib/guillotine/parser/c_extensions/c_quotes_parser.bundle"
19  
-    ]
20  
-    
21  
-    root_path = File.dirname(__FILE__)
22  
-    
23  
-    files.each do |file|
24  
-      file = "#{root_path}/#{file}"
25  
-      FileUtils.rm("#{root_path}/#{file}") if File.exists?(file)
26  
-    end
27  
-  end
28  
-end
29  
-
30  
-namespace :tags do
31  
-  ruby_files = TASKS::Emacs::Tags::RUBY_FILES
32  
-  
33  
-  task :emacs => ruby_files do
34  
-    puts "Making Emacs TAGS file"
35  
-    sh "ctags -e #{ruby_files}", :verbose => false
36  
-  end
37  
-end
38  
-
39  
-namespace :treetop do
40  
-  task :compile do
41  
-    TASKS::Treetop.compile
42  
-  end
43  
-end
44  
-
45  
-namespace :spec do
46  
-  Spec::Rake::SpecTask.new(:examples) do |t|
47  
-    t.spec_files = FileList['spec/**/*.rb']
48  
-    t.spec_opts = ["--diff", "--color", "--reverse", "--format", "profile"]
49  
-  end
50  
-  
51  
-  Spec::Rake::SpecTask.new(:rcov) do |t|
52  
-    t.rcov = true
53  
-    t.spec_files = FileList['spec/**/*.rb']
54  
-    t.rcov_dir   = "doc/coverage"
55  
-    t.rcov_opts  = ["--exclude", "rcov,rspec,facets,polyglot,gems.*treetop,spec,parser\/.+\.rb"]
56  
-  end
57  
-  
58  
-  RCov::VerifyTask.new(:verify_rcov => :spec) do |t|
59  
-    t.threshold = 100.0 # Make sure you have rcov 0.7 or higher!
60  
-    t.index_html = 'doc/coverage/index.html'
61  
-  end
62  
-end
63  
-
64  
-
65  
-desc "Run all specs"
66  
-task :spec => ["c_extensions:make", "spec:examples"]
67  
-
68  
-desc "Build the emacs tags file"
69  
-task :tags => ["tags:emacs"]
70  
-
71  
-desc "Recompile the treetop files"
72  
-task :treetop => ["treetop:compile"]
73  
-
74  
-desc "Verify the sanity of the project (run rake spec and verify rcov report)"
75  
-task :test => ["spec:rcov", "spec:verify_rcov"]
76  
-
77  
-desc "Build the project"
78  
-task :build => [:treetop, :tags, :test]
79  
-
80  
-task :default => :spec
  1
+require 'config/requirements'
  2
+require 'config/hoe' # setup Hoe + all gem configuration
  3
+
  4
+Dir['tasks/**/*.rake'].each { |rake| load rake }
  5
+
  6
+desc "Verify the sanity of the project (run rake spec and verify rcov report)"
  7
+task :test => ["spec:rcov", "spec:verify_rcov"]
  8
+
  9
+desc "Build the project"
  10
+task :build => [:treetop, :tags, :test]
  11
+
  12
+task :default => :spec
77  config/hoe.rb
... ...
@@ -0,0 +1,77 @@
  1
+require 'guillotine/version'
  2
+
  3
+AUTHOR = 'FIXME full name'  # can also be an array of Authors
  4
+EMAIL = "FIXME email"
  5
+DESCRIPTION = "description of gem"
  6
+GEM_NAME = 'guillotine' # what ppl will type to install your gem
  7
+RUBYFORGE_PROJECT = 'guillotine' # The unix name for your project
  8
+HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
  9
+DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
  10
+EXTRA_DEPENDENCIES = [
  11
+#  ['activesupport', '>= 1.3.1']
  12
+]    # An array of rubygem dependencies [name, version]
  13
+EXTRA_DEV_DEPENDENCIES = [
  14
+#  ['rspec', '>= 1.1.5']
  15
+]    # An array of rubygem dependencies [name, version]
  16
+
  17
+@config_file = "~/.rubyforge/user-config.yml"
  18
+@config = nil
  19
+RUBYFORGE_USERNAME = "unknown"
  20
+def rubyforge_username
  21
+  unless @config
  22
+    begin
  23
+      @config = YAML.load(File.read(File.expand_path(@config_file)))
  24
+    rescue
  25
+      puts <<-EOS
  26
+ERROR: No rubyforge config file found: #{@config_file}
  27
+Run 'rubyforge setup' to prepare your env for access to Rubyforge
  28
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
  29
+      EOS
  30
+      exit
  31
+    end
  32
+  end
  33
+  RUBYFORGE_USERNAME.replace @config["username"]
  34
+end
  35
+
  36
+
  37
+REV = nil
  38
+# UNCOMMENT IF REQUIRED:
  39
+# REV = YAML.load(`svn info`)['Revision']
  40
+VERS = Guillotine::VERSION::STRING + (REV ? ".#{REV}" : "")
  41
+RDOC_OPTS = ['--quiet', '--title', 'guillotine documentation',
  42
+    "--opname", "index.html",
  43
+    "--line-numbers",
  44
+    "--main", "README",
  45
+    "--inline-source"]
  46
+
  47
+class Hoe
  48
+  def extra_deps
  49
+    @extra_deps.reject! { |x| Array(x).first == 'hoe' }
  50
+    @extra_deps
  51
+  end
  52
+end
  53
+
  54
+# Generate all the Rake tasks
  55
+# Run 'rake -T' to see list of generated tasks (from gem root directory)
  56
+$hoe = Hoe.new(GEM_NAME, VERS) do |p|
  57
+  p.developer(AUTHOR, EMAIL)
  58
+  p.description    = DESCRIPTION
  59
+  p.summary        = DESCRIPTION
  60
+  p.url            = HOMEPATH
  61
+  p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
  62
+  p.test_globs     = ["test/**/test_*.rb"]
  63
+  p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']  #An array of file patterns to delete on clean.
  64
+
  65
+  # == Optional
  66
+  p.changes        = p.paragraphs_of("History.txt", 0..1).join("\n\n")
  67
+  p.extra_deps     = EXTRA_DEPENDENCIES
  68
+  p.extra_dev_deps = EXTRA_DEV_DEPENDENCIES
  69
+
  70
+    p.spec_extras = {}    # A hash of extra values to set in the gemspec.
  71
+  end
  72
+
  73
+CHANGES = $hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
  74
+PATH    = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
  75
+$hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
  76
+$hoe.rsync_args = '-av --delete --ignore-errors'
  77
+$hoe.spec.post_install_message = File.open(File.dirname(__FILE__) + "/../PostInstall.txt").read rescue ""
15  config/requirements.rb
... ...
@@ -0,0 +1,15 @@
  1
+require 'fileutils'
  2
+include FileUtils
  3
+
  4
+require 'rubygems'
  5
+%w[rake hoe newgem rubigen].each do |req_gem|
  6
+  begin
  7
+    require req_gem
  8
+  rescue LoadError
  9
+    puts "This Rakefile requires the '#{req_gem}' RubyGem."
  10
+    puts "Installation: gem install #{req_gem} -y"
  11
+    exit
  12
+  end
  13
+end
  14
+
  15
+$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
2  lib/guillotine.rb
@@ -19,7 +19,7 @@
19 19
   autoload :StatementExecutor, "#{project}/statement_executor"
20 20
   autoload :Transactions,      "#{project}/transactions"
21 21
   autoload :TestSupport,       "#{project}/test_support"
22  
-  autoload :Version,           "#{project}/version"
  22
+  autoload :VERSION,           "#{project}/version"
23 23
   
24 24
   class << self
25 25
     def execute(string)
7  lib/guillotine/version.rb
... ...
@@ -1,9 +1,10 @@
1 1
 module Guillotine
2  
-  module Version
  2
+  module VERSION #:nodoc:
3 3
     MAJOR = 0
4 4
     MINOR = 0
5 5
     TINY  = 1
6  
-    
7  
-    VERSION = "#{MAJOR}.#{MINOR}.#{TINY}"
  6
+
  7
+    STRING = [MAJOR, MINOR, TINY].join('.')
  8
+    self
8 9
   end
9 10
 end
10  script/console
... ...
@@ -0,0 +1,10 @@
  1
+#!/usr/bin/env ruby
  2
+# File: script/console
  3
+irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
  4
+
  5
+libs =  " -r irb/completion"
  6
+# Perhaps use a console_lib to store any extra methods I may want available in the cosole
  7
+# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
  8
+libs <<  " -r #{File.dirname(__FILE__) + '/../lib/guillotine.rb'}"
  9
+puts "Loading guillotine gem"
  10
+exec "#{irb} #{libs} --simple-prompt"
14  script/destroy
... ...
@@ -0,0 +1,14 @@
  1
+#!/usr/bin/env ruby
  2
+APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
  3
+
  4
+begin
  5
+  require 'rubigen'
  6
+rescue LoadError
  7
+  require 'rubygems'
  8
+  require 'rubigen'
  9
+end
  10
+require 'rubigen/scripts/destroy'
  11
+
  12
+ARGV.shift if ['--help', '-h'].include?(ARGV[0])
  13
+RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
  14
+RubiGen::Scripts::Destroy.new.run(ARGV)
14  script/generate
... ...
@@ -0,0 +1,14 @@
  1
+#!/usr/bin/env ruby
  2
+APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
  3
+
  4
+begin
  5
+  require 'rubigen'
  6
+rescue LoadError
  7
+  require 'rubygems'
  8
+  require 'rubigen'
  9
+end
  10
+require 'rubigen/scripts/generate'
  11
+
  12
+ARGV.shift if ['--help', '-h'].include?(ARGV[0])
  13
+RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
  14
+RubiGen::Scripts::Generate.new.run(ARGV)
82  script/txt2html
... ...
@@ -0,0 +1,82 @@
  1
+#!/usr/bin/env ruby
  2
+
  3
+GEM_NAME = 'guillotine' # what ppl will type to install your gem
  4
+RUBYFORGE_PROJECT = 'guillotine'
  5
+
  6
+require 'rubygems'
  7
+begin
  8
+  require 'newgem'
  9
+  require 'rubyforge'
  10
+rescue LoadError
  11
+  puts "\n\nGenerating the website requires the newgem RubyGem"
  12
+  puts "Install: gem install newgem\n\n"
  13
+  exit(1)
  14
+end
  15
+require 'redcloth'
  16
+require 'syntax/convertors/html'
  17
+require 'erb'
  18
+require File.dirname(__FILE__) + "/../lib/#{GEM_NAME}/version.rb"
  19
+
  20
+version  = Guillotine::VERSION::STRING
  21
+download = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
  22
+
  23
+def rubyforge_project_id
  24
+  RubyForge.new.configure.autoconfig["group_ids"][RUBYFORGE_PROJECT]
  25
+end
  26
+
  27
+class Fixnum
  28
+  def ordinal
  29
+    # teens
  30
+    return 'th' if (10..19).include?(self % 100)
  31
+    # others
  32
+    case self % 10
  33
+    when 1: return 'st'
  34
+    when 2: return 'nd'
  35
+    when 3: return 'rd'
  36
+    else    return 'th'
  37
+    end
  38
+  end
  39
+end
  40
+
  41
+class Time
  42
+  def pretty
  43
+    return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
  44
+  end
  45
+end
  46
+
  47
+def convert_syntax(syntax, source)
  48
+  return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
  49
+end
  50
+
  51
+if ARGV.length >= 1
  52
+  src, template = ARGV
  53
+  template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
  54
+else
  55
+  puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
  56
+  exit!
  57
+end
  58
+
  59
+template = ERB.new(File.open(template).read)
  60
+
  61
+title = nil
  62
+body = nil
  63
+File.open(src) do |fsrc|
  64
+  title_text = fsrc.readline
  65
+  body_text_template = fsrc.read
  66
+  body_text = ERB.new(body_text_template).result(binding)
  67
+  syntax_items = []
  68
+  body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
  69
+    ident = syntax_items.length
  70
+    element, syntax, source = $1, $2, $3
  71
+    syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
  72
+    "syntax-temp-#{ident}"
  73
+  }
  74
+  title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
  75
+  body = RedCloth.new(body_text).to_html
  76
+  body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
  77
+end
  78
+stat = File.stat(src)
  79
+created = stat.ctime
  80
+modified = stat.mtime
  81
+
  82
+$stdout << template.result(binding)
1,585  setup.rb
... ...
@@ -0,0 +1,1585 @@
  1
+#
  2
+# setup.rb
  3
+#
  4
+# Copyright (c) 2000-2005 Minero Aoki
  5
+#
  6
+# This program is free software.
  7
+# You can distribute/modify this program under the terms of
  8
+# the GNU LGPL, Lesser General Public License version 2.1.
  9
+#
  10
+
  11
+unless Enumerable.method_defined?(:map)   # Ruby 1.4.6
  12
+  module Enumerable
  13
+    alias map collect
  14
+  end
  15
+end
  16
+
  17
+unless File.respond_to?(:read)   # Ruby 1.6
  18
+  def File.read(fname)
  19
+    open(fname) {|f|
  20
+      return f.read
  21
+    }
  22
+  end
  23
+end
  24
+
  25
+unless Errno.const_defined?(:ENOTEMPTY)   # Windows?
  26
+  module Errno
  27
+    class ENOTEMPTY
  28
+      # We do not raise this exception, implementation is not needed.
  29
+    end
  30
+  end
  31
+end
  32
+
  33
+def File.binread(fname)
  34
+  open(fname, 'rb') {|f|
  35
+    return f.read
  36
+  }
  37
+end
  38
+
  39
+# for corrupted Windows' stat(2)
  40
+def File.dir?(path)
  41
+  File.directory?((path[-1,1] == '/') ? path : path + '/')
  42
+end
  43
+
  44
+
  45
+class ConfigTable
  46
+
  47
+  include Enumerable
  48
+
  49
+  def initialize(rbconfig)
  50
+    @rbconfig = rbconfig
  51
+    @items = []
  52
+    @table = {}
  53
+    # options
  54
+    @install_prefix = nil
  55
+    @config_opt = nil
  56
+    @verbose = true
  57
+    @no_harm = false
  58
+  end
  59
+
  60
+  attr_accessor :install_prefix
  61
+  attr_accessor :config_opt
  62
+
  63
+  attr_writer :verbose
  64
+
  65
+  def verbose?
  66
+    @verbose
  67
+  end
  68
+
  69
+  attr_writer :no_harm
  70
+
  71
+  def no_harm?
  72
+    @no_harm
  73
+  end
  74
+
  75
+  def [](key)
  76
+    lookup(key).resolve(self)
  77
+  end
  78
+
  79
+  def []=(key, val)
  80
+    lookup(key).set val
  81
+  end
  82
+
  83
+  def names
  84
+    @items.map {|i| i.name }
  85
+  end
  86
+
  87
+  def each(&block)
  88
+    @items.each(&block)
  89
+  end
  90
+
  91
+  def key?(name)
  92
+    @table.key?(name)
  93
+  end
  94
+
  95
+  def lookup(name)
  96
+    @table[name] or setup_rb_error "no such config item: #{name}"
  97
+  end
  98
+
  99
+  def add(item)
  100
+    @items.push item
  101
+    @table[item.name] = item
  102
+  end
  103
+
  104
+  def remove(name)
  105
+    item = lookup(name)
  106
+    @items.delete_if {|i| i.name == name }
  107
+    @table.delete_if {|name, i| i.name == name }
  108
+    item
  109
+  end
  110
+
  111
+  def load_script(path, inst = nil)
  112
+    if File.file?(path)
  113
+      MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
  114
+    end
  115
+  end
  116
+
  117
+  def savefile
  118
+    '.config'
  119
+  end
  120
+
  121
+  def load_savefile
  122
+    begin
  123
+      File.foreach(savefile()) do |line|
  124
+        k, v = *line.split(/=/, 2)
  125
+        self[k] = v.strip
  126
+      end
  127
+    rescue Errno::ENOENT
  128
+      setup_rb_error $!.message + "\n#{File.basename($0)} config first"
  129
+    end
  130
+  end
  131
+
  132
+  def save
  133
+    @items.each {|i| i.value }
  134
+    File.open(savefile(), 'w') {|f|
  135
+      @items.each do |i|
  136
+        f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
  137
+      end
  138
+    }
  139
+  end
  140
+
  141
+  def load_standard_entries
  142
+    standard_entries(@rbconfig).each do |ent|
  143
+      add ent
  144
+    end
  145
+  end
  146
+
  147
+  def standard_entries(rbconfig)
  148
+    c = rbconfig
  149
+
  150
+    rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
  151
+
  152
+    major = c['MAJOR'].to_i
  153
+    minor = c['MINOR'].to_i
  154
+    teeny = c['TEENY'].to_i
  155
+    version = "#{major}.#{minor}"
  156
+
  157
+    # ruby ver. >= 1.4.4?
  158
+    newpath_p = ((major >= 2) or
  159
+                 ((major == 1) and
  160
+                  ((minor >= 5) or
  161
+                   ((minor == 4) and (teeny >= 4)))))
  162
+
  163
+    if c['rubylibdir']
  164
+      # V > 1.6.3
  165
+      libruby         = "#{c['prefix']}/lib/ruby"
  166
+      librubyver      = c['rubylibdir']
  167
+      librubyverarch  = c['archdir']
  168
+      siteruby        = c['sitedir']
  169
+      siterubyver     = c['sitelibdir']
  170
+      siterubyverarch = c['sitearchdir']
  171
+    elsif newpath_p
  172
+      # 1.4.4 <= V <= 1.6.3
  173
+      libruby         = "#{c['prefix']}/lib/ruby"
  174
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
  175
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
  176
+      siteruby        = c['sitedir']
  177
+      siterubyver     = "$siteruby/#{version}"
  178
+      siterubyverarch = "$siterubyver/#{c['arch']}"
  179
+    else
  180
+      # V < 1.4.4
  181
+      libruby         = "#{c['prefix']}/lib/ruby"
  182
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
  183
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
  184
+      siteruby        = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
  185
+      siterubyver     = siteruby
  186
+      siterubyverarch = "$siterubyver/#{c['arch']}"
  187
+    end
  188
+    parameterize = lambda {|path|
  189
+      path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
  190
+    }
  191
+
  192
+    if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
  193
+      makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
  194
+    else
  195
+      makeprog = 'make'
  196
+    end
  197
+
  198
+    [
  199
+      ExecItem.new('installdirs', 'std/site/home',
  200
+                   'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
  201
+          {|val, table|
  202
+            case val
  203
+            when 'std'
  204
+              table['rbdir'] = '$librubyver'
  205
+              table['sodir'] = '$librubyverarch'
  206
+            when 'site'
  207
+              table['rbdir'] = '$siterubyver'
  208
+              table['sodir'] = '$siterubyverarch'
  209
+            when 'home'
  210
+              setup_rb_error '$HOME was not set' unless ENV['HOME']
  211
+              table['prefix'] = ENV['HOME']
  212
+              table['rbdir'] = '$libdir/ruby'
  213
+              table['sodir'] = '$libdir/ruby'
  214
+            end
  215
+          },
  216
+      PathItem.new('prefix', 'path', c['prefix'],
  217
+                   'path prefix of target environment'),
  218
+      PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
  219
+                   'the directory for commands'),
  220
+      PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
  221
+                   'the directory for libraries'),
  222
+      PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
  223
+                   'the directory for shared data'),
  224
+      PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
  225
+                   'the directory for man pages'),
  226
+      PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
  227
+                   'the directory for system configuration files'),
  228
+      PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
  229
+                   'the directory for local state data'),
  230
+      PathItem.new('libruby', 'path', libruby,
  231
+                   'the directory for ruby libraries'),
  232
+      PathItem.new('librubyver', 'path', librubyver,
  233
+                   'the directory for standard ruby libraries'),
  234
+      PathItem.new('librubyverarch', 'path', librubyverarch,
  235
+                   'the directory for standard ruby extensions'),
  236
+      PathItem.new('siteruby', 'path', siteruby,
  237
+          'the directory for version-independent aux ruby libraries'),
  238
+      PathItem.new('siterubyver', 'path', siterubyver,
  239
+                   'the directory for aux ruby libraries'),
  240
+      PathItem.new('siterubyverarch', 'path', siterubyverarch,
  241
+                   'the directory for aux ruby binaries'),
  242
+      PathItem.new('rbdir', 'path', '$siterubyver',
  243
+                   'the directory for ruby scripts'),
  244
+      PathItem.new('sodir', 'path', '$siterubyverarch',
  245
+                   'the directory for ruby extentions'),
  246
+      PathItem.new('rubypath', 'path', rubypath,
  247
+                   'the path to set to #! line'),
  248
+      ProgramItem.new('rubyprog', 'name', rubypath,
  249
+                      'the ruby program using for installation'),
  250
+      ProgramItem.new('makeprog', 'name', makeprog,
  251
+                      'the make program to compile ruby extentions'),
  252
+      SelectItem.new('shebang', 'all/ruby/never', 'ruby',
  253
+                     'shebang line (#!) editing mode'),
  254
+      BoolItem.new('without-ext', 'yes/no', 'no',
  255
+                   'does not compile/install ruby extentions')
  256
+    ]
  257
+  end
  258
+  private :standard_entries
  259
+
  260
+  def load_multipackage_entries
  261
+    multipackage_entries().each do |ent|
  262
+      add ent
  263
+    end
  264
+  end
  265
+
  266
+  def multipackage_entries
  267
+    [
  268
+      PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
  269
+                               'package names that you want to install'),
  270
+      PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
  271
+                               'package names that you do not want to install')
  272
+    ]
  273
+  end
  274
+  private :multipackage_entries
  275
+
  276
+  ALIASES = {
  277
+    'std-ruby'         => 'librubyver',
  278
+    'stdruby'          => 'librubyver',
  279
+    'rubylibdir'       => 'librubyver',
  280
+    'archdir'          => 'librubyverarch',
  281
+    'site-ruby-common' => 'siteruby',     # For backward compatibility
  282
+    'site-ruby'        => 'siterubyver',  # For backward compatibility
  283
+    'bin-dir'          => 'bindir',
  284
+    'bin-dir'          => 'bindir',
  285
+    'rb-dir'           => 'rbdir',
  286
+    'so-dir'           => 'sodir',
  287
+    'data-dir'         => 'datadir',
  288
+    'ruby-path'        => 'rubypath',
  289
+    'ruby-prog'        => 'rubyprog',
  290
+    'ruby'             => 'rubyprog',
  291
+    'make-prog'        => 'makeprog',
  292
+    'make'             => 'makeprog'
  293
+  }
  294
+
  295
+  def fixup
  296
+    ALIASES.each do |ali, name|
  297
+      @table[ali] = @table[name]
  298
+    end
  299
+    @items.freeze
  300
+    @table.freeze
  301
+    @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
  302
+  end
  303
+
  304
+  def parse_opt(opt)
  305
+    m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
  306
+    m.to_a[1,2]
  307
+  end
  308
+
  309
+  def dllext
  310
+    @rbconfig['DLEXT']
  311
+  end
  312
+
  313
+  def value_config?(name)
  314
+    lookup(name).value?
  315
+  end
  316
+
  317
+  class Item
  318
+    def initialize(name, template, default, desc)
  319
+      @name = name.freeze
  320
+      @template = template
  321
+      @value = default
  322
+      @default = default
  323
+      @description = desc
  324
+    end
  325
+
  326
+    attr_reader :name
  327
+    attr_reader :description
  328
+
  329
+    attr_accessor :default
  330
+    alias help_default default
  331
+
  332
+    def help_opt
  333
+      "--#{@name}=#{@template}"
  334
+    end
  335
+
  336
+    def value?
  337
+      true
  338
+    end
  339
+
  340
+    def value
  341
+      @value
  342
+    end
  343
+
  344
+    def resolve(table)
  345
+      @value.gsub(%r<\$([^/]+)>) { table[$1] }
  346
+    end
  347
+
  348
+    def set(val)
  349
+      @value = check(val)
  350
+    end
  351
+
  352
+    private
  353
+
  354
+    def check(val)
  355
+      setup_rb_error "config: --#{name} requires argument" unless val
  356
+      val
  357
+    end
  358
+  end
  359
+
  360
+  class BoolItem < Item
  361
+    def config_type
  362
+      'bool'
  363
+    end
  364
+
  365
+    def help_opt
  366
+      "--#{@name}"
  367
+    end
  368
+
  369
+    private
  370
+
  371
+    def check(val)
  372
+      return 'yes' unless val
  373
+      case val
  374
+      when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
  375
+      when /\An(o)?\z/i, /\Af(alse)\z/i  then 'no'
  376
+      else
  377
+        setup_rb_error "config: --#{@name} accepts only yes/no for argument"
  378
+      end
  379
+    end
  380
+  end
  381
+
  382
+  class PathItem < Item
  383
+    def config_type
  384
+      'path'
  385
+    end
  386
+
  387
+    private
  388
+
  389
+    def check(path)
  390
+      setup_rb_error "config: --#{@name} requires argument"  unless path
  391
+      path[0,1] == '$' ? path : File.expand_path(path)
  392
+    end
  393
+  end
  394
+
  395
+  class ProgramItem < Item
  396
+    def config_type
  397
+      'program'
  398
+    end
  399
+  end
  400
+
  401
+  class SelectItem < Item
  402
+    def initialize(name, selection, default, desc)
  403
+      super
  404
+      @ok = selection.split('/')
  405
+    end
  406
+
  407
+    def config_type
  408
+      'select'
  409
+    end
  410
+
  411
+    private
  412
+
  413
+    def check(val)
  414
+      unless @ok.include?(val.strip)
  415
+        setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
  416
+      end
  417
+      val.strip
  418
+    end
  419
+  end
  420
+
  421
+  class ExecItem < Item
  422
+    def initialize(name, selection, desc, &block)
  423
+      super name, selection, nil, desc
  424
+      @ok = selection.split('/')
  425
+      @action = block
  426
+    end
  427
+
  428
+    def config_type
  429
+      'exec'
  430
+    end
  431
+
  432
+    def value?
  433
+      false
  434
+    end
  435
+
  436
+    def resolve(table)
  437
+      setup_rb_error "$#{name()} wrongly used as option value"
  438
+    end
  439
+
  440
+    undef set
  441
+
  442
+    def evaluate(val, table)
  443
+      v = val.strip.downcase
  444
+      unless @ok.include?(v)
  445
+        setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
  446
+      end
  447
+      @action.call v, table
  448
+    end
  449
+  end
  450
+
  451
+  class PackageSelectionItem < Item
  452
+    def initialize(name, template, default, help_default, desc)
  453
+      super name, template, default, desc
  454
+      @help_default = help_default
  455
+    end
  456
+
  457
+    attr_reader :help_default
  458
+
  459
+    def config_type
  460
+      'package'
  461
+    end
  462
+
  463
+    private
  464
+
  465
+    def check(val)
  466
+      unless File.dir?("packages/#{val}")
  467
+        setup_rb_error "config: no such package: #{val}"
  468
+      end
  469
+      val
  470
+    end
  471
+  end
  472
+
  473
+  class MetaConfigEnvironment
  474
+    def initialize(config, installer)
  475
+      @config = config
  476
+      @installer = installer
  477
+    end
  478
+
  479
+    def config_names
  480
+      @config.names
  481
+    end
  482
+
  483
+    def config?(name)
  484
+      @config.key?(name)
  485
+    end
  486
+
  487
+    def bool_config?(name)
  488
+      @config.lookup(name).config_type == 'bool'
  489
+    end
  490
+
  491
+    def path_config?(name)
  492
+      @config.lookup(name).config_type == 'path'
  493
+    end
  494
+
  495
+    def value_config?(name)
  496
+      @config.lookup(name).config_type != 'exec'
  497
+    end
  498
+
  499
+    def add_config(item)
  500
+      @config.add item
  501
+    end
  502
+
  503
+    def add_bool_config(name, default, desc)
  504
+      @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
  505
+    end
  506
+
  507
+    def add_path_config(name, default, desc)
  508
+      @config.add PathItem.new(name, 'path', default, desc)
  509
+    end
  510
+
  511
+    def set_config_default(name, default)
  512
+      @config.lookup(name).default = default
  513
+    end
  514
+
  515
+    def remove_config(name)
  516
+      @config.remove(name)
  517
+    end
  518
+
  519
+    # For only multipackage
  520
+    def packages
  521
+      raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
  522
+      @installer.packages
  523
+    end
  524
+
  525
+    # For only multipackage
  526
+    def declare_packages(list)
  527
+      raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
  528
+      @installer.packages = list
  529
+    end
  530
+  end
  531
+
  532
+end   # class ConfigTable
  533
+
  534
+
  535
+# This module requires: #verbose?, #no_harm?
  536
+module FileOperations
  537
+
  538
+  def mkdir_p(dirname, prefix = nil)
  539
+    dirname = prefix + File.expand_path(dirname) if prefix
  540
+    $stderr.puts "mkdir -p #{dirname}" if verbose?
  541
+    return if no_harm?
  542
+
  543
+    # Does not check '/', it's too abnormal.
  544
+    dirs = File.expand_path(dirname).split(%r<(?=/)>)
  545
+    if /\A[a-z]:\z/i =~ dirs[0]
  546
+      disk = dirs.shift
  547
+      dirs[0] = disk + dirs[0]
  548
+    end
  549
+    dirs.each_index do |idx|
  550
+      path = dirs[0..idx].join('')
  551
+      Dir.mkdir path unless File.dir?(path)
  552
+    end
  553
+  end
  554
+
  555
+  def rm_f(path)
  556
+    $stderr.puts "rm -f #{path}" if verbose?
  557
+    return if no_harm?
  558
+    force_remove_file path
  559
+  end
  560
+
  561
+  def rm_rf(path)
  562
+    $stderr.puts "rm -rf #{path}" if verbose?
  563
+    return if no_harm?
  564
+    remove_tree path
  565
+  end
  566
+
  567
+  def remove_tree(path)
  568
+    if File.symlink?(path)
  569
+      remove_file path
  570
+    elsif File.dir?(path)
  571
+      remove_tree0 path
  572
+    else
  573
+      force_remove_file path
  574
+    end
  575
+  end
  576
+
  577
+  def remove_tree0(path)
  578
+    Dir.foreach(path) do |ent|
  579
+      next if ent == '.'
  580
+      next if ent == '..'
  581
+      entpath = "#{path}/#{ent}"
  582
+      if File.symlink?(entpath)
  583
+        remove_file entpath
  584
+      elsif File.dir?(entpath)
  585
+        remove_tree0 entpath
  586
+      else
  587
+        force_remove_file entpath
  588
+      end
  589
+    end
  590
+    begin
  591
+      Dir.rmdir path
  592
+    rescue Errno::ENOTEMPTY
  593
+      # directory may not be empty
  594
+    end
  595
+  end
  596
+
  597
+  def move_file(src, dest)
  598
+    force_remove_file dest
  599
+    begin
  600
+      File.rename src, dest
  601
+    rescue
  602
+      File.open(dest, 'wb') {|f|
  603
+        f.write File.binread(src)
  604
+      }
  605
+      File.chmod File.stat(src).mode, dest
  606
+      File.unlink src
  607
+    end
  608
+  end
  609
+
  610
+  def force_remove_file(path)
  611
+    begin
  612
+      remove_file path
  613
+    rescue
  614
+    end
  615
+  end
  616
+
  617
+  def remove_file(path)
  618
+    File.chmod 0777, path
  619
+    File.unlink path
  620
+  end
  621
+
  622
+  def install(from, dest, mode, prefix = nil)
  623
+    $stderr.puts "install #{from} #{dest}" if verbose?
  624
+    return if no_harm?
  625
+
  626
+    realdest = prefix ? prefix + File.expand_path(dest) : dest
  627
+    realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
  628
+    str = File.binread(from)
  629
+    if diff?(str, realdest)
  630
+      verbose_off {
  631
+        rm_f realdest if File.exist?(realdest)
  632
+      }
  633
+      File.open(realdest, 'wb') {|f|
  634
+        f.write str
  635
+      }
  636
+      File.chmod mode, realdest
  637
+
  638
+      File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
  639
+        if prefix
  640
+          f.puts realdest.sub(prefix, '')
  641
+        else
  642
+          f.puts realdest
  643
+        end
  644
+      }
  645
+    end
  646
+  end
  647
+
  648
+  def diff?(new_content, path)
  649
+    return true unless File.exist?(path)
  650
+    new_content != File.binread(path)
  651
+  end
  652
+
  653
+  def command(*args)
  654
+    $stderr.puts args.join(' ') if verbose?
  655
+    system(*args) or raise RuntimeError,
  656
+        "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
  657
+  end
  658
+
  659
+  def ruby(*args)
  660
+    command config('rubyprog'), *args
  661
+  end
  662
+  
  663
+  def make(task = nil)
  664
+    command(*[config('makeprog'), task].compact)
  665
+  end
  666
+
  667
+  def extdir?(dir)
  668
+    File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
  669
+  end
  670
+
  671
+  def files_of(dir)
  672
+    Dir.open(dir) {|d|
  673
+      return d.select {|ent| File.file?("#{dir}/#{ent}") }
  674
+    }
  675
+  end
  676
+
  677
+  DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
  678
+
  679
+  def directories_of(dir)
  680
+    Dir.open(dir) {|d|
  681
+      return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
  682
+    }
  683
+  end
  684
+
  685
+end