zorglub 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.
- data/Changelog +2 -0
- data/MIT-LICENSE +18 -0
- data/README.rdoc +55 -0
- data/Rakefile +58 -0
- data/lib/zorglub/app.rb +45 -0
- data/lib/zorglub/config.rb +66 -0
- data/lib/zorglub/node.rb +196 -0
- data/lib/zorglub/session.rb +81 -0
- data/lib/zorglub.rb +14 -0
- data/spec/app_spec.rb +43 -0
- data/spec/data/layout/default +0 -0
- data/spec/data/layout/main.spec +0 -0
- data/spec/data/view/node0/do_partial +0 -0
- data/spec/data/view/node0/do_render +0 -0
- data/spec/node_spec.rb +157 -0
- data/spec/spec_helper.rb +136 -0
- data/tasks/ann.rake +83 -0
- data/tasks/constants.rb +118 -0
- data/tasks/gem.rake +196 -0
- data/tasks/git.rake +38 -0
- data/tasks/helpers.rb +130 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +35 -0
- data/tasks/rdoc.rake +46 -0
- data/tasks/rubyforge.rake +54 -0
- data/tasks/setup.rb +129 -0
- data/tasks/spec.rake +44 -0
- data/tasks/svn.rake +48 -0
- data/tasks/test.rake +41 -0
- metadata +122 -0
    
        data/spec/node_spec.rb
    ADDED
    
    | @@ -0,0 +1,157 @@ | |
| 1 | 
            +
            # -*- coding: UTF-8 -*-
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            require 'spec_helper'
         | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            describe Zorglub do
         | 
| 6 | 
            +
                #
         | 
| 7 | 
            +
                describe Zorglub::Node do
         | 
| 8 | 
            +
                    #
         | 
| 9 | 
            +
                    it "engine should return default Node's engine" do
         | 
| 10 | 
            +
                        Node0.engine.should == Zorglub::Config.engine
         | 
| 11 | 
            +
                        Node0.engine.should == Zorglub::Config[:engine]
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                    #
         | 
| 14 | 
            +
                    it "layout should return default Node's layout" do
         | 
| 15 | 
            +
                        Node0.layout.should == Zorglub::Config.layout
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                    #
         | 
| 18 | 
            +
                    it "engine should return class defined Node's engine" do
         | 
| 19 | 
            +
                        Node1.engine.should == "engine-1"
         | 
| 20 | 
            +
                        Node3.engine.should == "engine-2"
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                    #
         | 
| 23 | 
            +
                    it "layout should return class defined Node's layout" do
         | 
| 24 | 
            +
                        Node1.layout.should == "layout-1"
         | 
| 25 | 
            +
                        Node3.layout.should == "layout-2"
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                    #
         | 
| 28 | 
            +
                    it "engine should return engine inherited from Node2" do
         | 
| 29 | 
            +
                        Node2.engine.should == "engine-1"
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                    #
         | 
| 32 | 
            +
                    it "layout should return layout inherited from Node2" do
         | 
| 33 | 
            +
                        Node2.layout.should == "layout-1"
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
                    #
         | 
| 36 | 
            +
                    it "r should build a well formed path" do
         | 
| 37 | 
            +
                        Node1.r(1,'arg2',"some").should == "/node1/1/arg2/some"
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                    #
         | 
| 40 | 
            +
                    it "instance level map should work" do
         | 
| 41 | 
            +
                        r = Node0.my_call '/with_2args/1/2'
         | 
| 42 | 
            +
                        h = YAML.load r.body[0]
         | 
| 43 | 
            +
                        h[:map].should == '/node0'
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
                    #
         | 
| 46 | 
            +
                    it "should return err404 response when no method found" do
         | 
| 47 | 
            +
                        Node0.respond_to?('noresponse').should be_false
         | 
| 48 | 
            +
                        r = Node0.my_call '/noresponse'
         | 
| 49 | 
            +
                        r.status.should == 404
         | 
| 50 | 
            +
                    end
         | 
| 51 | 
            +
                    #
         | 
| 52 | 
            +
                    it "simple method should respond" do
         | 
| 53 | 
            +
                        r = Node0.my_call '/hello'
         | 
| 54 | 
            +
                        r.status.should == 200
         | 
| 55 | 
            +
                        r.body[0].should == 'world'
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
                    #
         | 
| 58 | 
            +
                    it "instance level args should work" do
         | 
| 59 | 
            +
                        r = Node0.my_call '/with_2args/1/2'
         | 
| 60 | 
            +
                        h = YAML.load r.body[0]
         | 
| 61 | 
            +
                        h[:args][0].should == '1'
         | 
| 62 | 
            +
                        h[:args][1].should == '2'
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                    #
         | 
| 65 | 
            +
                    it "should raise error when too much arguments" do
         | 
| 66 | 
            +
                        lambda{ r = Node0.my_call '/with_2args/1/2/3' }.should raise_error ArgumentError
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
                    #
         | 
| 69 | 
            +
                    it "layout proc, method level layout and engine definitions should work" do
         | 
| 70 | 
            +
                        r = Node0.my_call '/index'
         | 
| 71 | 
            +
                        r.status.should == 200
         | 
| 72 | 
            +
                        h = YAML.load r.body[0]
         | 
| 73 | 
            +
                        ly = File.join Zorglub::Config.root, Zorglub::Config.layout_dir, Node0.layout
         | 
| 74 | 
            +
                        vu = File.join Zorglub::Config.root, Zorglub::Config.view_dir, Node0.r, 'index'
         | 
| 75 | 
            +
                        h[:path].should == ly
         | 
| 76 | 
            +
                        h[:layout].should == ly
         | 
| 77 | 
            +
                        h[:view].should == vu
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                    #
         | 
| 80 | 
            +
                    it "layout proc, method level layout and engine definitions should work" do
         | 
| 81 | 
            +
                        r = Node1.my_call '/index'
         | 
| 82 | 
            +
                        r.status.should == 200
         | 
| 83 | 
            +
                        h = YAML.load r.body[0]
         | 
| 84 | 
            +
                        ly = File.join Zorglub::Config.root, Zorglub::Config.layout_dir, 'main.spec'
         | 
| 85 | 
            +
                        vu = File.join Zorglub::Config.root, Zorglub::Config.view_dir, Node1.r, 'index.spec'
         | 
| 86 | 
            +
                        h[:path].should == ly
         | 
| 87 | 
            +
                        h[:layout].should == ly
         | 
| 88 | 
            +
                        h[:view].should == vu
         | 
| 89 | 
            +
                    end
         | 
| 90 | 
            +
                    #
         | 
| 91 | 
            +
                    it "before_all hook should work" do
         | 
| 92 | 
            +
                        Node3.before = 0
         | 
| 93 | 
            +
                        Node3.after = 0
         | 
| 94 | 
            +
                        Node3.before.should == 0
         | 
| 95 | 
            +
                        Node3.my_call '/index'
         | 
| 96 | 
            +
                        Node3.before.should == 1
         | 
| 97 | 
            +
                        Node3.my_call '/index'
         | 
| 98 | 
            +
                        Node3.before.should == 2
         | 
| 99 | 
            +
                        Node3.my_call '/index'
         | 
| 100 | 
            +
                        Node3.before.should == 3
         | 
| 101 | 
            +
                    end
         | 
| 102 | 
            +
                    #
         | 
| 103 | 
            +
                    it "after_all hook should work" do
         | 
| 104 | 
            +
                        Node3.before = 0
         | 
| 105 | 
            +
                        Node3.after = 0
         | 
| 106 | 
            +
                        Node3.after.should == 0
         | 
| 107 | 
            +
                        Node3.my_call '/index'
         | 
| 108 | 
            +
                        Node3.after.should == 1
         | 
| 109 | 
            +
                        Node3.my_call '/index'
         | 
| 110 | 
            +
                        Node3.after.should == 2
         | 
| 111 | 
            +
                        Node3.my_call '/index'
         | 
| 112 | 
            +
                        Node3.after.should == 3
         | 
| 113 | 
            +
                    end
         | 
| 114 | 
            +
                    #
         | 
| 115 | 
            +
                    it "should find view and layout and render them" do
         | 
| 116 | 
            +
                        r = Node0.my_call '/do_render'
         | 
| 117 | 
            +
                        r.status.should == 200
         | 
| 118 | 
            +
                        r.body[0].should == "layout_start view_content layout_end"
         | 
| 119 | 
            +
                    end
         | 
| 120 | 
            +
                    #
         | 
| 121 | 
            +
                    it "partial should render correctly" do
         | 
| 122 | 
            +
                        Node0.partial(:do_partial, 1, 2).should == 'partial_content'
         | 
| 123 | 
            +
                    end
         | 
| 124 | 
            +
                    #
         | 
| 125 | 
            +
                    it "method level view should work" do
         | 
| 126 | 
            +
                        Node0.partial(:other_view).should == 'partial_content'
         | 
| 127 | 
            +
                    end
         | 
| 128 | 
            +
                    #
         | 
| 129 | 
            +
                    it "redirect should work" do
         | 
| 130 | 
            +
                        r = Node0.my_call '/do_redirect'
         | 
| 131 | 
            +
                        r.status.should == 302
         | 
| 132 | 
            +
                        r.header['location'].should == Node0.r(:do_partial,1,2,3)
         | 
| 133 | 
            +
                    end
         | 
| 134 | 
            +
                    #
         | 
| 135 | 
            +
                    it "inherited_vars should be inherited and extended" do
         | 
| 136 | 
            +
                        r = Node5.my_call '/index'
         | 
| 137 | 
            +
                        vars = YAML.load r.body[0]
         | 
| 138 | 
            +
                        vars.should == ['js0','js1','js3','jsx','css0','css1','css2']
         | 
| 139 | 
            +
                        vars[7].should be_nil
         | 
| 140 | 
            +
                    end
         | 
| 141 | 
            +
                    #
         | 
| 142 | 
            +
                    it "inherited_vars should be extended at method level" do
         | 
| 143 | 
            +
                        r = Node4.my_call '/more'
         | 
| 144 | 
            +
                        vars = YAML.load r.body[0]
         | 
| 145 | 
            +
                        vars.should == ['js0','js1','js2']
         | 
| 146 | 
            +
                        vars[3].should be_nil
         | 
| 147 | 
            +
                    end
         | 
| 148 | 
            +
                    #
         | 
| 149 | 
            +
                    it "inherited_vars should be untouched" do
         | 
| 150 | 
            +
                        r = Node4.my_call '/index'
         | 
| 151 | 
            +
                        vars = YAML.load r.body[0]
         | 
| 152 | 
            +
                        vars.should == ['js0','js1']
         | 
| 153 | 
            +
                        vars[2].should be_nil
         | 
| 154 | 
            +
                    end
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
                #
         | 
| 157 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | @@ -0,0 +1,136 @@ | |
| 1 | 
            +
            #! /usr/bin/env ruby
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            begin
         | 
| 4 | 
            +
                require 'simplecov'
         | 
| 5 | 
            +
                SimpleCov.start do
         | 
| 6 | 
            +
                    add_filter 'spec'
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
            rescue LoadError
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
            #
         | 
| 11 | 
            +
            require 'yaml'
         | 
| 12 | 
            +
            #
         | 
| 13 | 
            +
            require 'zorglub'
         | 
| 14 | 
            +
            #
         | 
| 15 | 
            +
            HASH_PROC = Proc.new { |path,obj| {:path=>path,:layout=>obj.layout,:view=>obj.view,:args=>obj.args,:map=>obj.map}.to_yaml }
         | 
| 16 | 
            +
            RENDER_PROC = Proc.new { |path,obj|
         | 
| 17 | 
            +
                case obj.state
         | 
| 18 | 
            +
                when :layout
         | 
| 19 | 
            +
                    "layout_start #{obj.content} layout_end"
         | 
| 20 | 
            +
                when :view
         | 
| 21 | 
            +
                    "view_content"
         | 
| 22 | 
            +
                when :partial
         | 
| 23 | 
            +
                    'partial_content'
         | 
| 24 | 
            +
                else
         | 
| 25 | 
            +
                    raise Exception.new
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
            }
         | 
| 28 | 
            +
            Zorglub::Config.register_engine 'default', nil, HASH_PROC
         | 
| 29 | 
            +
            Zorglub::Config.register_engine 'engine-1', 'spec', HASH_PROC
         | 
| 30 | 
            +
            Zorglub::Config.register_engine 'engine-2', 'spec', HASH_PROC
         | 
| 31 | 
            +
            Zorglub::Config.register_engine 'real', nil, RENDER_PROC
         | 
| 32 | 
            +
            #
         | 
| 33 | 
            +
            Zorglub::Config[:engine] = 'default'
         | 
| 34 | 
            +
            Zorglub::Config.root = File.join Dir.pwd, 'spec', 'data'
         | 
| 35 | 
            +
            #
         | 
| 36 | 
            +
            class Zorglub::Node
         | 
| 37 | 
            +
                def self.my_call uri
         | 
| 38 | 
            +
                    call( {'PATH_INFO'=>uri} )
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
            end
         | 
| 41 | 
            +
            #
         | 
| 42 | 
            +
            class Temp < Zorglub::Node
         | 
| 43 | 
            +
            end
         | 
| 44 | 
            +
            #
         | 
| 45 | 
            +
            class Node0 < Zorglub::Node
         | 
| 46 | 
            +
                # default
         | 
| 47 | 
            +
                def index
         | 
| 48 | 
            +
                    html
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
                def hello
         | 
| 51 | 
            +
                    no_layout
         | 
| 52 | 
            +
                    'world'
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
                def with_2args a1, a2
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
                def do_render
         | 
| 57 | 
            +
                    engine 'real'
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
                def do_partial a1, a2
         | 
| 60 | 
            +
                    engine 'real'
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
                def other_view
         | 
| 63 | 
            +
                    engine 'real'
         | 
| 64 | 
            +
                    view r('do_partial')
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
                def do_redirect
         | 
| 67 | 
            +
                    redirect r(:do_partial,1,2,3)
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
            end
         | 
| 70 | 
            +
            #
         | 
| 71 | 
            +
            class Node1 < Zorglub::Node
         | 
| 72 | 
            +
                layout 'layout-1'
         | 
| 73 | 
            +
                engine 'engine-1'
         | 
| 74 | 
            +
                def index
         | 
| 75 | 
            +
                    layout 'main'
         | 
| 76 | 
            +
                    engine 'engine-2'
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
            end
         | 
| 79 | 
            +
            #
         | 
| 80 | 
            +
            class Node2 < Node1
         | 
| 81 | 
            +
                # inherited from Node1
         | 
| 82 | 
            +
            end
         | 
| 83 | 
            +
            #
         | 
| 84 | 
            +
            class Node3 < Zorglub::Node
         | 
| 85 | 
            +
                @before=0
         | 
| 86 | 
            +
                @after=0
         | 
| 87 | 
            +
                class << self
         | 
| 88 | 
            +
                    attr_accessor :before, :after
         | 
| 89 | 
            +
                end
         | 
| 90 | 
            +
                before_all do |node|
         | 
| 91 | 
            +
                    Node3.before +=1
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
                after_all do |node|
         | 
| 94 | 
            +
                    Node3.after +=1
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
                layout 'layout-2'
         | 
| 97 | 
            +
                engine 'engine-2'
         | 
| 98 | 
            +
                def index
         | 
| 99 | 
            +
                    (self.class.before-self.class.after).should == 1
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
            end
         | 
| 102 | 
            +
            #
         | 
| 103 | 
            +
            class Node4 < Zorglub::Node
         | 
| 104 | 
            +
                inherited_var :js,'js0','js1'
         | 
| 105 | 
            +
                def index
         | 
| 106 | 
            +
                    no_layout
         | 
| 107 | 
            +
                    inherited_var(:js).to_yaml
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
                def more
         | 
| 110 | 
            +
                    no_layout
         | 
| 111 | 
            +
                    inherited_var(:js,'js2').to_yaml
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
            end
         | 
| 114 | 
            +
            #
         | 
| 115 | 
            +
            class Node5 < Node4
         | 
| 116 | 
            +
                inherited_var :js, 'js3'
         | 
| 117 | 
            +
                inherited_var :css, 'css0', 'css1'
         | 
| 118 | 
            +
                def index
         | 
| 119 | 
            +
                    no_layout
         | 
| 120 | 
            +
                    js = inherited_var(:js,'jsx')
         | 
| 121 | 
            +
                    css = inherited_var(:css, 'css0', 'css1','css2')
         | 
| 122 | 
            +
                    js.concat(css).to_yaml
         | 
| 123 | 
            +
                end
         | 
| 124 | 
            +
            end
         | 
| 125 | 
            +
            #
         | 
| 126 | 
            +
            APP = Zorglub::App.new do
         | 
| 127 | 
            +
                map '/node0', Node0
         | 
| 128 | 
            +
                map '/node1', Node1
         | 
| 129 | 
            +
                map '/node3', Node3
         | 
| 130 | 
            +
                map '/node4', Node4
         | 
| 131 | 
            +
                map '/node5', Node5
         | 
| 132 | 
            +
            end
         | 
| 133 | 
            +
            class Node2
         | 
| 134 | 
            +
                map APP, '/node2'
         | 
| 135 | 
            +
            end
         | 
| 136 | 
            +
            #
         | 
    
        data/tasks/ann.rake
    ADDED
    
    | @@ -0,0 +1,83 @@ | |
| 1 | 
            +
            # -*- coding: UTF-8 -*-
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            begin
         | 
| 4 | 
            +
                require 'bones/smtp_tls'
         | 
| 5 | 
            +
            rescue LoadError
         | 
| 6 | 
            +
                require 'net/smtp'
         | 
| 7 | 
            +
            end
         | 
| 8 | 
            +
            require 'time'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            namespace :ann do
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                # A prerequisites task that all other tasks depend upon
         | 
| 13 | 
            +
                task :prereqs
         | 
| 14 | 
            +
                file PROJ.ann.file do
         | 
| 15 | 
            +
                    ann = PROJ.ann
         | 
| 16 | 
            +
                    puts "Generating #{ann.file}"
         | 
| 17 | 
            +
                    File.open(ann.file,'w') do |fd|
         | 
| 18 | 
            +
                        fd.puts("#{PROJ.name} version #{PROJ.version}")
         | 
| 19 | 
            +
                        fd.puts("    by #{Array(PROJ.authors).first}") if PROJ.authors
         | 
| 20 | 
            +
                        fd.puts("    #{PROJ.url}") if PROJ.url.valid?
         | 
| 21 | 
            +
                        fd.puts("    (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
         | 
| 22 | 
            +
                        fd.puts
         | 
| 23 | 
            +
                        fd.puts("== DESCRIPTION")
         | 
| 24 | 
            +
                        fd.puts
         | 
| 25 | 
            +
                        fd.puts(PROJ.description)
         | 
| 26 | 
            +
                        fd.puts
         | 
| 27 | 
            +
                        fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
         | 
| 28 | 
            +
                        fd.puts
         | 
| 29 | 
            +
                        ann.paragraphs.each do |p|
         | 
| 30 | 
            +
                            fd.puts "== #{p.upcase}"
         | 
| 31 | 
            +
                            fd.puts
         | 
| 32 | 
            +
                            fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
         | 
| 33 | 
            +
                            fd.puts
         | 
| 34 | 
            +
                        end
         | 
| 35 | 
            +
                        fd.puts ann.text if ann.text
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                desc "Create an announcement file"
         | 
| 40 | 
            +
                task :announcement => ['ann:prereqs', PROJ.ann.file]
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                desc "Send an email announcement"
         | 
| 43 | 
            +
                task :email => ['ann:prereqs', PROJ.ann.file] do
         | 
| 44 | 
            +
                    ann = PROJ.ann
         | 
| 45 | 
            +
                    from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
         | 
| 46 | 
            +
                    to   = Array(ann.email[:to])
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    ### build a mail header for RFC 822
         | 
| 49 | 
            +
                    rfc822msg =  "From: #{from}\n"
         | 
| 50 | 
            +
                    rfc822msg << "To: #{to.join(',')}\n"
         | 
| 51 | 
            +
                    rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
         | 
| 52 | 
            +
                    rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
         | 
| 53 | 
            +
                    rfc822msg << "\n"
         | 
| 54 | 
            +
                    rfc822msg << "Date: #{Time.new.rfc822}\n"
         | 
| 55 | 
            +
                    rfc822msg << "Message-Id: "
         | 
| 56 | 
            +
                    rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{ann.email[:domain]}>\n\n"
         | 
| 57 | 
            +
                    rfc822msg << File.read(ann.file)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
         | 
| 60 | 
            +
                        ann.email[key]
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    params[3] = (PROJ.ann.email[:from] || PROJ.email) if params[3].nil?
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            #        if ann.email[:tls] and params[4].nil?
         | 
| 66 | 
            +
                    if params[4].nil?
         | 
| 67 | 
            +
                        STDOUT.write "Please enter your e-mail password (#{params[3]}): "
         | 
| 68 | 
            +
                        params[4] = STDIN.gets.chomp
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
            #        params = params.shift 2 if not ann.email[:tls]
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                    ### send email
         | 
| 73 | 
            +
                    # TODO find a way to bypass /var/lib/gems/1.9/gems/bones-3.6.5/lib/bones/smtp_tls.rb which forces starttls usage
         | 
| 74 | 
            +
                    Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
            end  # namespace :ann
         | 
| 77 | 
            +
             | 
| 78 | 
            +
            desc 'Alias to ann:announcement'
         | 
| 79 | 
            +
            task :ann => 'ann:announcement'
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            CLOBBER << PROJ.ann.file
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            # EOF
         | 
    
        data/tasks/constants.rb
    ADDED
    
    | @@ -0,0 +1,118 @@ | |
| 1 | 
            +
            # -*- coding: UTF-8 -*-
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            require 'rbconfig'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # Setup some constants
         | 
| 6 | 
            +
            WIN32 = %r/djgpp|(cyg|ms|bcc)win|mingw/ =~ RUBY_PLATFORM unless defined? WIN32
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            DEV_NULL = WIN32 ? 'NUL:' : '/dev/null'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            def quiet( &block )
         | 
| 11 | 
            +
                io = [STDOUT.dup, STDERR.dup]
         | 
| 12 | 
            +
                STDOUT.reopen DEV_NULL
         | 
| 13 | 
            +
                STDERR.reopen DEV_NULL
         | 
| 14 | 
            +
                block.call
         | 
| 15 | 
            +
            ensure
         | 
| 16 | 
            +
                STDOUT.reopen io.first
         | 
| 17 | 
            +
                STDERR.reopen io.last
         | 
| 18 | 
            +
                $stdout, $stderr = STDOUT, STDERR
         | 
| 19 | 
            +
            end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            BUILD_DIR = "build"
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            USE_RAKE_COMPILER = ( ( (RUBY_PLATFORM =~ /java/) ? false : true ) and test ?d, 'ext' )
         | 
| 24 | 
            +
            if USE_RAKE_COMPILER
         | 
| 25 | 
            +
                gem 'rake-compiler', '>=0.6.0'
         | 
| 26 | 
            +
                require 'rake/extensiontask'
         | 
| 27 | 
            +
                ENV['RUBY_CC_VERSION'] = '1.8.7:1.9.2'
         | 
| 28 | 
            +
            end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            LIBEXT = case RbConfig::CONFIG['host_os'].downcase
         | 
| 31 | 
            +
                when /darwin/
         | 
| 32 | 
            +
                    "dylib"
         | 
| 33 | 
            +
                when /mswin|mingw/
         | 
| 34 | 
            +
                    "dll"
         | 
| 35 | 
            +
                else
         | 
| 36 | 
            +
                    RbConfig::CONFIG['DLEXT']
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            CPU = case RbConfig::CONFIG['host_cpu'].downcase
         | 
| 40 | 
            +
                when /i[3456]86/
         | 
| 41 | 
            +
                    # Darwin always reports i686, even when running in 64bit mode
         | 
| 42 | 
            +
                    if RbConfig::CONFIG['host_os'] =~ /darwin/ && 0xfee1deadbeef.is_a?(Fixnum)
         | 
| 43 | 
            +
                        "x86_64"
         | 
| 44 | 
            +
                    else
         | 
| 45 | 
            +
                    "i386"
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
                when /amd64|x86_64/
         | 
| 48 | 
            +
                    "x86_64"
         | 
| 49 | 
            +
                when /ppc64|powerpc64/
         | 
| 50 | 
            +
                    "powerpc64"
         | 
| 51 | 
            +
                when /ppc|powerpc/
         | 
| 52 | 
            +
                    "powerpc"
         | 
| 53 | 
            +
                else
         | 
| 54 | 
            +
                    RbConfig::CONFIG['host_cpu']
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            OS = case RbConfig::CONFIG['host_os'].downcase
         | 
| 58 | 
            +
                when /linux/
         | 
| 59 | 
            +
                    "linux"
         | 
| 60 | 
            +
                when /darwin/
         | 
| 61 | 
            +
                    "darwin"
         | 
| 62 | 
            +
                when /freebsd/
         | 
| 63 | 
            +
                    "freebsd"
         | 
| 64 | 
            +
                when /openbsd/
         | 
| 65 | 
            +
                    "openbsd"
         | 
| 66 | 
            +
                when /sunos|solaris/
         | 
| 67 | 
            +
                    "solaris"
         | 
| 68 | 
            +
                when /mswin|mingw/
         | 
| 69 | 
            +
                    "win32"
         | 
| 70 | 
            +
                else
         | 
| 71 | 
            +
                    RbConfig::CONFIG['host_os'].downcase
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            CC=ENV['CC'] || RbConfig::CONFIG['CC'] || "gcc"
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            GMAKE = RbConfig::CONFIG['host_os'].downcase =~ /bsd|solaris/ ? "gmake" : "make"
         | 
| 77 | 
            +
             | 
| 78 | 
            +
             | 
| 79 | 
            +
            DIFF = if WIN32 then 'diff.exe'
         | 
| 80 | 
            +
                   else
         | 
| 81 | 
            +
                        if quiet {system "gdiff", __FILE__, __FILE__} then 'gdiff'
         | 
| 82 | 
            +
                        else 'diff' end
         | 
| 83 | 
            +
                   end unless defined? DIFF
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            SUDO = if WIN32 then ''
         | 
| 86 | 
            +
                   else
         | 
| 87 | 
            +
                        if quiet {system 'which sudo'} then 'sudo'
         | 
| 88 | 
            +
                        else '' end
         | 
| 89 | 
            +
                   end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            RCOV = WIN32 ? 'rcov.bat' : 'rcov'
         | 
| 92 | 
            +
            RDOC = WIN32 ? 'rdoc.bat' : 'rdoc'
         | 
| 93 | 
            +
            GEM  = WIN32 ? 'gem.bat'  : 'gem'
         | 
| 94 | 
            +
             | 
| 95 | 
            +
            %w(rcov spec/rake/spectask rubyforge bones facets/ansicode).each do |lib|
         | 
| 96 | 
            +
                begin
         | 
| 97 | 
            +
                    require lib
         | 
| 98 | 
            +
                    Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", true}
         | 
| 99 | 
            +
                rescue LoadError
         | 
| 100 | 
            +
                    Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", false}
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
            end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
            HAVE_SVN = (Dir.entries(Dir.pwd).include?('.svn') and system("svn --version 2>&1 > #{DEV_NULL}"))
         | 
| 105 | 
            +
            HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and system("git --version 2>&1 > #{DEV_NULL}"))
         | 
| 106 | 
            +
             | 
| 107 | 
            +
            # Add rake as a development dependency
         | 
| 108 | 
            +
            #
         | 
| 109 | 
            +
            PROJ.gem.development_dependencies << ['rake', '>=0.8.7']
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            # Add bones as a development dependency
         | 
| 112 | 
            +
            #
         | 
| 113 | 
            +
            if HAVE_BONES
         | 
| 114 | 
            +
                bones_version = defined?(Bones::VERSION) ? Bones::VERSION : Bones.version
         | 
| 115 | 
            +
                PROJ.gem.development_dependencies << ['bones', ">= #{bones_version}"]
         | 
| 116 | 
            +
            end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            # EOF
         | 
    
        data/tasks/gem.rake
    ADDED
    
    | @@ -0,0 +1,196 @@ | |
| 1 | 
            +
            # -*- coding: UTF-8 -*-
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
            require 'find'
         | 
| 4 | 
            +
            require 'rake/packagetask'
         | 
| 5 | 
            +
            require 'rubygems/user_interaction'
         | 
| 6 | 
            +
            require 'rubygems/builder'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            module Bones
         | 
| 9 | 
            +
            class GemPackageTask < Rake::PackageTask
         | 
| 10 | 
            +
                # Ruby GEM spec containing the metadata for this package.  The
         | 
| 11 | 
            +
                # name, version and package_files are automatically determined
         | 
| 12 | 
            +
                # from the GEM spec and don't need to be explicitly provided.
         | 
| 13 | 
            +
                #
         | 
| 14 | 
            +
                attr_accessor :gem_spec
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                # Tasks from the Bones gem directory
         | 
| 17 | 
            +
                attr_reader :bones_files
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                # Create a GEM Package task library.  Automatically define the gem
         | 
| 20 | 
            +
                # if a block is given.  If no block is supplied, then +define+
         | 
| 21 | 
            +
                # needs to be called to define the task.
         | 
| 22 | 
            +
                #
         | 
| 23 | 
            +
                def initialize(gem_spec)
         | 
| 24 | 
            +
                    init(gem_spec)
         | 
| 25 | 
            +
                    yield self if block_given?
         | 
| 26 | 
            +
                    define if block_given?
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                # Initialization tasks without the "yield self" or define
         | 
| 30 | 
            +
                # operations.
         | 
| 31 | 
            +
                #
         | 
| 32 | 
            +
                def init(gem)
         | 
| 33 | 
            +
                    super(gem.name, gem.version)
         | 
| 34 | 
            +
                    @gem_spec = gem
         | 
| 35 | 
            +
                    @package_files += gem_spec.files if gem_spec.files
         | 
| 36 | 
            +
                    @bones_files = []
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
         | 
| 39 | 
            +
                    if !test(?e, local_setup)
         | 
| 40 | 
            +
                        Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                # Create the Rake tasks and actions specified by this
         | 
| 45 | 
            +
                # GemPackageTask.  (+define+ is automatically called if a block is
         | 
| 46 | 
            +
                # given to +new+).
         | 
| 47 | 
            +
                #
         | 
| 48 | 
            +
                def define
         | 
| 49 | 
            +
                    super
         | 
| 50 | 
            +
                    task :prereqs
         | 
| 51 | 
            +
                    task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
         | 
| 52 | 
            +
                    file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
         | 
| 53 | 
            +
                        when_writing("Creating GEM") {
         | 
| 54 | 
            +
                            chdir(package_dir_path) do
         | 
| 55 | 
            +
                                Gem::Builder.new(gem_spec).build
         | 
| 56 | 
            +
                                verbose(true) { mv gem_file, "../#{gem_file}" }
         | 
| 57 | 
            +
                            end
         | 
| 58 | 
            +
                        }
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    file package_dir_path => bones_files do
         | 
| 62 | 
            +
                        mkdir_p package_dir rescue nil
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                        gem_spec.files = (gem_spec.files + bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                        bones_files.each do |fn|
         | 
| 67 | 
            +
                            base_fn = File.join('tasks', File.basename(fn))
         | 
| 68 | 
            +
                            f = File.join(package_dir_path, base_fn)
         | 
| 69 | 
            +
                            fdir = File.dirname(f)
         | 
| 70 | 
            +
                            mkdir_p(fdir) if !File.exist?(fdir)
         | 
| 71 | 
            +
                            if File.directory?(fn)
         | 
| 72 | 
            +
                                mkdir_p(f)
         | 
| 73 | 
            +
                            else
         | 
| 74 | 
            +
                                raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
         | 
| 75 | 
            +
                                safe_ln(fn, f)
         | 
| 76 | 
            +
                            end
         | 
| 77 | 
            +
                        end
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                def gem_file
         | 
| 82 | 
            +
                    if @gem_spec.platform == Gem::Platform::RUBY
         | 
| 83 | 
            +
                        "#{package_name}.gem"
         | 
| 84 | 
            +
                    else
         | 
| 85 | 
            +
                        "#{package_name}-#{@gem_spec.platform}.gem"
         | 
| 86 | 
            +
                    end
         | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
            end  # class GemPackageTask
         | 
| 89 | 
            +
            end  # module Bones
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            namespace :gem do
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                PROJ.gem._spec = Gem::Specification.new do |s|
         | 
| 94 | 
            +
                    s.name = PROJ.name
         | 
| 95 | 
            +
                    s.version = PROJ.version
         | 
| 96 | 
            +
                    s.summary = PROJ.summary
         | 
| 97 | 
            +
                    s.authors = Array(PROJ.authors)
         | 
| 98 | 
            +
                    s.email = PROJ.email
         | 
| 99 | 
            +
                    s.homepage = Array(PROJ.url).first
         | 
| 100 | 
            +
                    s.rubyforge_project = PROJ.rubyforge.name
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                    s.description = PROJ.description
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                    PROJ.gem.dependencies.each do |dep|
         | 
| 105 | 
            +
                        s.add_dependency(*dep)
         | 
| 106 | 
            +
                    end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                    PROJ.gem.development_dependencies.each do |dep|
         | 
| 109 | 
            +
                        s.add_development_dependency(*dep)
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                    s.files = PROJ.gem.files
         | 
| 113 | 
            +
                    s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
         | 
| 114 | 
            +
                    s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                    s.bindir = 'bin'
         | 
| 117 | 
            +
                    dirs = Dir["{#{PROJ.libs.join(',')}}"]
         | 
| 118 | 
            +
                    s.require_paths = dirs unless dirs.empty?
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                    incl = Regexp.new(PROJ.rdoc.include.join('|'))
         | 
| 121 | 
            +
                    excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
         | 
| 122 | 
            +
                    excl = Regexp.new(excl.join('|'))
         | 
| 123 | 
            +
                    rdoc_files = PROJ.gem.files.find_all do |fn|
         | 
| 124 | 
            +
                        case fn
         | 
| 125 | 
            +
                        when excl; false
         | 
| 126 | 
            +
                        when incl; true
         | 
| 127 | 
            +
                        else false end
         | 
| 128 | 
            +
                    end
         | 
| 129 | 
            +
                    s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
         | 
| 130 | 
            +
                    s.extra_rdoc_files = rdoc_files
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    if test ?f, PROJ.test.file
         | 
| 133 | 
            +
                        s.test_file = PROJ.test.file
         | 
| 134 | 
            +
                    else
         | 
| 135 | 
            +
                        s.test_files = PROJ.test.files.to_a
         | 
| 136 | 
            +
                    end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    # Do any extra stuff the user wants
         | 
| 139 | 
            +
                    PROJ.gem.extras.each do |msg, val|
         | 
| 140 | 
            +
                        case val
         | 
| 141 | 
            +
                        when Proc
         | 
| 142 | 
            +
                            val.call(s.send(msg))
         | 
| 143 | 
            +
                        else
         | 
| 144 | 
            +
                            s.send "#{msg}=", val
         | 
| 145 | 
            +
                        end
         | 
| 146 | 
            +
                    end
         | 
| 147 | 
            +
                end  # Gem::Specification.new
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
         | 
| 150 | 
            +
                    pkg.need_tar = PROJ.gem.need_tar
         | 
| 151 | 
            +
                    pkg.need_zip = PROJ.gem.need_zip
         | 
| 152 | 
            +
                end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                desc 'Show information about the gem'
         | 
| 155 | 
            +
                task :debug => 'gem:prereqs' do
         | 
| 156 | 
            +
                    puts PROJ.gem._spec.to_ruby
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                desc 'Write the gemspec '
         | 
| 160 | 
            +
                task :spec => 'gem:prereqs' do
         | 
| 161 | 
            +
                    File.open("#{PROJ.name}.gemspec", 'w') do |f|
         | 
| 162 | 
            +
                        f.write PROJ.gem._spec.to_ruby
         | 
| 163 | 
            +
                    end
         | 
| 164 | 
            +
                end
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                desc 'Install the gem'
         | 
| 167 | 
            +
                task :install => [:clobber, 'gem:package'] do
         | 
| 168 | 
            +
                    sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
         | 
| 169 | 
            +
                    # use this version of the command for rubygems > 1.0.0
         | 
| 170 | 
            +
                    #sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
         | 
| 171 | 
            +
                end
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                desc 'Uninstall the gem'
         | 
| 174 | 
            +
                task :uninstall do
         | 
| 175 | 
            +
                    installed_list = Gem.source_index.find_name(PROJ.name)
         | 
| 176 | 
            +
                    if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
         | 
| 177 | 
            +
                        sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
         | 
| 178 | 
            +
                    end
         | 
| 179 | 
            +
                end
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                desc 'Reinstall the gem'
         | 
| 182 | 
            +
                task :reinstall => [:uninstall, :install]
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                desc 'Cleanup the gem'
         | 
| 185 | 
            +
                task :cleanup do
         | 
| 186 | 
            +
                    sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
         | 
| 187 | 
            +
                end
         | 
| 188 | 
            +
            end  # namespace :gem
         | 
| 189 | 
            +
             | 
| 190 | 
            +
            desc 'Alias to gem:package'
         | 
| 191 | 
            +
            task :gem => 'gem:package'
         | 
| 192 | 
            +
             | 
| 193 | 
            +
            task :clobber => 'gem:clobber_package'
         | 
| 194 | 
            +
            remove_desc_for_task 'gem:clobber_package'
         | 
| 195 | 
            +
             | 
| 196 | 
            +
            # EOF
         |