tetrahedron 0.0.0.1 → 0.0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/Gemfile.lock +15 -1
 - data/README.md +1 -2
 - data/lib/tetrahedron/application/base.rb +16 -0
 - data/lib/tetrahedron/application/controller.rb +16 -0
 - data/lib/tetrahedron/application/endpoint.rb +7 -0
 - data/lib/tetrahedron/application.rb +31 -0
 - data/lib/tetrahedron/base.rb +9 -20
 - data/lib/tetrahedron/database.rb +66 -90
 - data/lib/tetrahedron/databases/postgres.rb +48 -0
 - data/lib/tetrahedron/databases/sqlite3.rb +30 -0
 - data/lib/tetrahedron/gem.rb +2 -2
 - data/lib/tetrahedron/middleware.rb +25 -0
 - data/lib/tetrahedron/service.rb +61 -0
 - data/lib/tetrahedron/sessions.rb +26 -17
 - data/lib/tetrahedron.rb +26 -54
 - data/tetrahedron.gemspec +7 -2
 - metadata +82 -21
 - data/config/app.ru +0 -21
 - data/config/application.rb +0 -8
 - data/config/environment.rb +0 -18
 - data/config/puma.rb +0 -29
 - data/lib/tetrahedron/app.rb +0 -16
 - data/lib/tetrahedron/assets.rb +0 -43
 - data/lib/tetrahedron/bootfile.rb +0 -43
 - data/lib/tetrahedron/bundler.rb +0 -10
 - data/lib/tetrahedron/configuration.rb +0 -44
 - data/lib/tetrahedron/controller.rb +0 -17
 - data/lib/tetrahedron/endpoint.rb +0 -4
 - data/lib/tetrahedron/environment.rb +0 -28
 - data/lib/tetrahedron/errors.rb +0 -7
 - data/lib/tetrahedron/model.rb +0 -32
 - data/lib/tetrahedron/rake.rb +0 -16
 - data/lib/tetrahedron/redis.rb +0 -4
 - data/lib/tetrahedron/tasks/tet.rake +0 -5
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 5b9d0311bd16dd7fb7b8c35d19fcce8ae77a2036
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 9ee81f6f029ba59b260b1e56f49db1dbb0233e87
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 9c2ac0f186880b502265c894461fba56c33e30b931069e614df647627c5fdb8981a65529a3a849a584d9aae7b7dba456f14d48a0a74c5e86a72f826212897b1b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 1a3cb3c6184c50a59bc0b76eff23b72af0717d4b96283646ee90b58286609cccef8386c7587a7cccf0afdc4e52c2e1e30479a8d1646fb01f17b5164d1d69b150
         
     | 
    
        data/Gemfile.lock
    CHANGED
    
    | 
         @@ -1,8 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            PATH
         
     | 
| 
       2 
2 
     | 
    
         
             
              remote: .
         
     | 
| 
       3 
3 
     | 
    
         
             
              specs:
         
     | 
| 
       4 
     | 
    
         
            -
                tetrahedron (0.0.0 
     | 
| 
      
 4 
     | 
    
         
            +
                tetrahedron (0.0.1.0)
         
     | 
| 
       5 
5 
     | 
    
         
             
                  activesupport
         
     | 
| 
      
 6 
     | 
    
         
            +
                  erubis
         
     | 
| 
      
 7 
     | 
    
         
            +
                  mail
         
     | 
| 
      
 8 
     | 
    
         
            +
                  rack
         
     | 
| 
      
 9 
     | 
    
         
            +
                  rack-contrib
         
     | 
| 
      
 10 
     | 
    
         
            +
                  redis
         
     | 
| 
       6 
11 
     | 
    
         
             
                  sequel
         
     | 
| 
       7 
12 
     | 
    
         
             
                  sinatra
         
     | 
| 
       8 
13 
     | 
    
         
             
                  sinatra-contrib
         
     | 
| 
         @@ -19,9 +24,14 @@ GEM 
     | 
|
| 
       19 
24 
     | 
    
         
             
                  tzinfo (~> 1.1)
         
     | 
| 
       20 
25 
     | 
    
         
             
                backports (3.6.7)
         
     | 
| 
       21 
26 
     | 
    
         
             
                coderay (1.1.0)
         
     | 
| 
      
 27 
     | 
    
         
            +
                erubis (2.7.0)
         
     | 
| 
      
 28 
     | 
    
         
            +
                git-version-bump (0.15.1)
         
     | 
| 
       22 
29 
     | 
    
         
             
                i18n (0.7.0)
         
     | 
| 
       23 
30 
     | 
    
         
             
                json (1.8.3)
         
     | 
| 
      
 31 
     | 
    
         
            +
                mail (2.6.3)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  mime-types (>= 1.16, < 3)
         
     | 
| 
       24 
33 
     | 
    
         
             
                method_source (0.8.2)
         
     | 
| 
      
 34 
     | 
    
         
            +
                mime-types (2.99)
         
     | 
| 
       25 
35 
     | 
    
         
             
                minitest (5.8.3)
         
     | 
| 
       26 
36 
     | 
    
         
             
                multi_json (1.11.2)
         
     | 
| 
       27 
37 
     | 
    
         
             
                pry (0.10.3)
         
     | 
| 
         @@ -29,11 +39,15 @@ GEM 
     | 
|
| 
       29 
39 
     | 
    
         
             
                  method_source (~> 0.8.1)
         
     | 
| 
       30 
40 
     | 
    
         
             
                  slop (~> 3.4)
         
     | 
| 
       31 
41 
     | 
    
         
             
                rack (1.6.4)
         
     | 
| 
      
 42 
     | 
    
         
            +
                rack-contrib (1.4.0)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  git-version-bump (~> 0.15)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  rack (~> 1.4)
         
     | 
| 
       32 
45 
     | 
    
         
             
                rack-protection (1.5.3)
         
     | 
| 
       33 
46 
     | 
    
         
             
                  rack
         
     | 
| 
       34 
47 
     | 
    
         
             
                rack-test (0.6.3)
         
     | 
| 
       35 
48 
     | 
    
         
             
                  rack (>= 1.0)
         
     | 
| 
       36 
49 
     | 
    
         
             
                rake (10.4.2)
         
     | 
| 
      
 50 
     | 
    
         
            +
                redis (3.2.2)
         
     | 
| 
       37 
51 
     | 
    
         
             
                sequel (4.28.0)
         
     | 
| 
       38 
52 
     | 
    
         
             
                sinatra (1.4.6)
         
     | 
| 
       39 
53 
     | 
    
         
             
                  rack (~> 1.4)
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,4 +1,3 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
            ===========
         
     | 
| 
      
 1 
     | 
    
         
            +
            # Tetrahedron [](https://rubygems.org/gems/tetrahedron) [](https://travis-ci.org/mtwilliams/tetrahedron) [](https://codeclimate.com/github/mtwilliams/tetrahedron) [](https://gemnasium.com/mtwilliams/tetrahedron)
         
     | 
| 
       3 
2 
     | 
    
         | 
| 
       4 
3 
     | 
    
         
             
            [Welcome to the Tet.](https://www.youtube.com/watch?v=lt-udg9zQSE)
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Application
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Base < Tetrahedron::Base
         
     | 
| 
      
 4 
     | 
    
         
            +
                  def self.inherited(base)
         
     | 
| 
      
 5 
     | 
    
         
            +
                    super(base)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    base.send :define_singleton_method, :inherited do |basee|
         
     | 
| 
      
 7 
     | 
    
         
            +
                      super(basee)
         
     | 
| 
      
 8 
     | 
    
         
            +
                      basee.set :application, Proc.new { basee.to_s.split('::')[0..-2].join('::').constantize }
         
     | 
| 
      
 9 
     | 
    
         
            +
                      basee.set :environment, Proc.new { application.environment.to_sym }
         
     | 
| 
      
 10 
     | 
    
         
            +
                      basee.set :root, Proc.new { application.root }
         
     | 
| 
      
 11 
     | 
    
         
            +
                    end
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
            end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Application
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Controller < Tetrahedron::Application::Base
         
     | 
| 
      
 4 
     | 
    
         
            +
                  set :views, Proc.new { "#{root}/app/broadsheet/views" }
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                  # Recognize *.html.erb as Erubis templates.
         
     | 
| 
      
 7 
     | 
    
         
            +
                  Tilt.register Tilt::ErubisTemplate, 'html.erb'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  # Don't recognize *.erb templates.
         
     | 
| 
      
 10 
     | 
    
         
            +
                  def erb(template, options={}, locals={})
         
     | 
| 
      
 11 
     | 
    
         
            +
                    options[:layout] = settings.erb[:layout] if options[:layout].nil?
         
     | 
| 
      
 12 
     | 
    
         
            +
                    render 'html.erb', template, options, locals
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'sinatra/base'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'sinatra/contrib/all'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 5 
     | 
    
         
            +
              class Application < Tetrahedron::Base
         
     | 
| 
      
 6 
     | 
    
         
            +
                def self.env
         
     | 
| 
      
 7 
     | 
    
         
            +
                  components = self.to_s.upcase.split('::')
         
     | 
| 
      
 8 
     | 
    
         
            +
                  possibilities = (components.size.downto(1).map{|n| components.first(n).join('_')+'_ENV'})
         
     | 
| 
      
 9 
     | 
    
         
            +
                  environments = (possibilities+['RACK_ENV']).map{|possibility| ENV[possibility]}
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @env ||= ::ActiveSupport::StringInquirer.new(environments.reject(&:nil?).first)
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                set :environment, Proc.new { self.env.to_sym }
         
     | 
| 
      
 14 
     | 
    
         
            +
                set :root, Dir.pwd
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                # Don't use the built-in web-server.
         
     | 
| 
      
 17 
     | 
    
         
            +
                set :run, false
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def self.inherited(application)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  super(application)
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  Tetrahedron::Middleware.install(application)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  Tetrahedron::Sessions.install(application)
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  application.const_set('Controller', Class.new(Controller))
         
     | 
| 
      
 26 
     | 
    
         
            +
                  application.const_set('Endpoint', Class.new(Endpoint))
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  Tetrahedron::Database.install(application)
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/tetrahedron/base.rb
    CHANGED
    
    | 
         @@ -1,11 +1,8 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'sinatra/base'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'sinatra/contrib/all'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
       1 
4 
     | 
    
         
             
            module Tetrahedron
         
     | 
| 
       2 
5 
     | 
    
         
             
              class Base < Sinatra::Base
         
     | 
| 
       3 
     | 
    
         
            -
                set :environment, Tetrahedron.env.to_sym
         
     | 
| 
       4 
     | 
    
         
            -
                set :root, Tetrahedron.config.root
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
                # Don't use the built-in web-server.
         
     | 
| 
       7 
     | 
    
         
            -
                set :run, false
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
6 
     | 
    
         
             
                # Errors are bubbled so they can be handled by middleware.
         
     | 
| 
       10 
7 
     | 
    
         
             
                set :dump_errors, false
         
     | 
| 
       11 
8 
     | 
    
         
             
                set :raise_errors, true
         
     | 
| 
         @@ -14,21 +11,13 @@ module Tetrahedron 
     | 
|
| 
       14 
11 
     | 
    
         
             
                # Fuck you, IE9.
         
     | 
| 
       15 
12 
     | 
    
         
             
                disable :method_override
         
     | 
| 
       16 
13 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                 
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                  register Sinatra::Reloader
         
     | 
| 
       20 
     | 
    
         
            -
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
                # TODO(mtwilliams): Re-enable basic protections, like traversal.
         
     | 
| 
      
 15 
     | 
    
         
            +
                disable :protection
         
     | 
| 
       21 
16 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                 
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
                # Let users handle serving static files.
         
     | 
| 
      
 18 
     | 
    
         
            +
                disable :static
         
     | 
| 
       25 
19 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                 
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                  server = Rack::Static.new(proc {[404, {}, []]}, root: File.join(Tetrahedron.config.root, '/public'))
         
     | 
| 
       29 
     | 
    
         
            -
                  status, headers, response = server.call(env)
         
     | 
| 
       30 
     | 
    
         
            -
                  pass if status == 404
         
     | 
| 
       31 
     | 
    
         
            -
                  [status, headers, response]
         
     | 
| 
       32 
     | 
    
         
            -
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
                # Hot-reload in development.
         
     | 
| 
      
 21 
     | 
    
         
            +
                register Sinatra::Reloader
         
     | 
| 
       33 
22 
     | 
    
         
             
              end
         
     | 
| 
       34 
23 
     | 
    
         
             
            end
         
     | 
    
        data/lib/tetrahedron/database.rb
    CHANGED
    
    | 
         @@ -1,113 +1,89 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
              module Database
         
     | 
| 
       3 
     | 
    
         
            -
                class Configuration
         
     | 
| 
       4 
     | 
    
         
            -
                  Options = %i{adapter user password host port database pool}
         
     | 
| 
       5 
     | 
    
         
            -
                  attr_reader *Options
         
     | 
| 
      
 1 
     | 
    
         
            +
            require 'sequel'
         
     | 
| 
       6 
2 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                    end
         
     | 
| 
       11 
     | 
    
         
            -
                  end
         
     | 
| 
      
 3 
     | 
    
         
            +
            # Everyone needs these.
         
     | 
| 
      
 4 
     | 
    
         
            +
            Sequel.extension :migration
         
     | 
| 
      
 5 
     | 
    
         
            +
            Sequel::Model.plugin :timestamps
         
     | 
| 
       12 
6 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                    Options.each do |opt|
         
     | 
| 
       16 
     | 
    
         
            -
                      configuration.instance_variable_set(:"@#{opt}", overrides[opt]) if overrides.include? opt
         
     | 
| 
       17 
     | 
    
         
            -
                    end
         
     | 
| 
       18 
     | 
    
         
            -
                    configuration
         
     | 
| 
       19 
     | 
    
         
            -
                  end
         
     | 
| 
       20 
     | 
    
         
            -
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
            # The Tet needs this for the magic performed in `Model.db=`.
         
     | 
| 
      
 8 
     | 
    
         
            +
            Sequel::Model.plugin :subclasses
         
     | 
| 
       21 
9 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 10 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 11 
     | 
    
         
            +
              class Database < Service
         
     | 
| 
      
 12 
     | 
    
         
            +
                class Configuration < Service::Configuration
         
     | 
| 
       24 
13 
     | 
    
         
             
                end
         
     | 
| 
       25 
14 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
                 
     | 
| 
       27 
     | 
    
         
            -
                   
     | 
| 
       28 
     | 
    
         
            -
                   
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
       30 
     | 
    
         
            -
                  @configuration = Configuration.new(configuration)
         
     | 
| 
      
 15 
     | 
    
         
            +
                class Provider < Service::Provider
         
     | 
| 
      
 16 
     | 
    
         
            +
                  def connection; end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  def connect; raise NotImplementedError; end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  def disconnect; raise NotImplementedError; end
         
     | 
| 
       31 
19 
     | 
    
         
             
                end
         
     | 
| 
       32 
20 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
                 
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                  # By default, we wait up to 15 seconds.
         
     | 
| 
       36 
     | 
    
         
            -
                  overrides[:timeout] ||= 15
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                  configuration   = @configuration.override(overrides) if configured?
         
     | 
| 
       39 
     | 
    
         
            -
                  configuration ||= Configuration.new(overrides)
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                  # TODO(mtwilliams): Don't assume TCP.
         
     | 
| 
       42 
     | 
    
         
            -
                   # Look at |configuration.adapter|.
         
     | 
| 
       43 
     | 
    
         
            -
                  Timeout::timeout(overrides[:timeout]) do
         
     | 
| 
       44 
     | 
    
         
            -
                    while true
         
     | 
| 
       45 
     | 
    
         
            -
                      begin
         
     | 
| 
       46 
     | 
    
         
            -
                        TCPSocket.new(configuration.host, configuration.port).close
         
     | 
| 
       47 
     | 
    
         
            -
                        return true
         
     | 
| 
       48 
     | 
    
         
            -
                      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError
         
     | 
| 
       49 
     | 
    
         
            -
                        # We're all good citizens, right?
         
     | 
| 
       50 
     | 
    
         
            -
                        Kernel.sleep(1)
         
     | 
| 
       51 
     | 
    
         
            -
                      end
         
     | 
| 
       52 
     | 
    
         
            -
                    end
         
     | 
| 
       53 
     | 
    
         
            -
                  end
         
     | 
| 
       54 
     | 
    
         
            -
                rescue Timeout::Error
         
     | 
| 
       55 
     | 
    
         
            -
                  false
         
     | 
| 
      
 21 
     | 
    
         
            +
                def self.connected?
         
     | 
| 
      
 22 
     | 
    
         
            +
                  !self.connection.nil?
         
     | 
| 
       56 
23 
     | 
    
         
             
                end
         
     | 
| 
       57 
24 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
                def self. 
     | 
| 
       59 
     | 
    
         
            -
                   
     | 
| 
       60 
     | 
    
         
            -
                   
     | 
| 
      
 25 
     | 
    
         
            +
                def self.connection
         
     | 
| 
      
 26 
     | 
    
         
            +
                  configured!
         
     | 
| 
      
 27 
     | 
    
         
            +
                  self.class_variable_get(:@@provider).connection
         
     | 
| 
       61 
28 
     | 
    
         
             
                end
         
     | 
| 
       62 
29 
     | 
    
         | 
| 
       63 
     | 
    
         
            -
                def self.connect 
     | 
| 
       64 
     | 
    
         
            -
                   
     | 
| 
       65 
     | 
    
         
            -
                   
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
                   
     | 
| 
       68 
     | 
    
         
            -
                   
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                  @connection = Sequel.connect(:adapter => configuration.adapter,
         
     | 
| 
       71 
     | 
    
         
            -
                                               :user => configuration.user,
         
     | 
| 
       72 
     | 
    
         
            -
                                               :password => configuration.password,
         
     | 
| 
       73 
     | 
    
         
            -
                                               :host => configuration.host,
         
     | 
| 
       74 
     | 
    
         
            -
                                               :port => configuration.port,
         
     | 
| 
       75 
     | 
    
         
            -
                                               :database => configuration.database,
         
     | 
| 
       76 
     | 
    
         
            -
                                               :test => true,
         
     | 
| 
       77 
     | 
    
         
            -
                                               :sslmode => :prefer,
         
     | 
| 
       78 
     | 
    
         
            -
                                               :max_connections => configuration.pool)
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                  # Reback our models with the new connection pool.
         
     | 
| 
       81 
     | 
    
         
            -
                  Tetrahedron::Model.db = @connection
         
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
                  true
         
     | 
| 
      
 30 
     | 
    
         
            +
                def self.connect
         
     | 
| 
      
 31 
     | 
    
         
            +
                  configured!
         
     | 
| 
      
 32 
     | 
    
         
            +
                  connected = self.class_variable_get(:@@provider).connect
         
     | 
| 
      
 33 
     | 
    
         
            +
                  # Back our models with the new connection.
         
     | 
| 
      
 34 
     | 
    
         
            +
                  model = self.class_variable_get(:@@application).const_get("Model")
         
     | 
| 
      
 35 
     | 
    
         
            +
                  model.db = self.connection if connected
         
     | 
| 
      
 36 
     | 
    
         
            +
                  connected
         
     | 
| 
       84 
37 
     | 
    
         
             
                end
         
     | 
| 
       85 
38 
     | 
    
         | 
| 
       86 
39 
     | 
    
         
             
                def self.disconnect
         
     | 
| 
       87 
     | 
    
         
            -
                   
     | 
| 
      
 40 
     | 
    
         
            +
                  configured!
         
     | 
| 
      
 41 
     | 
    
         
            +
                  # TODO(mtwilliams): Verify that this is thread-safe.
         
     | 
| 
      
 42 
     | 
    
         
            +
                  model = self.class_variable_get(:@@application).const_get("Model")
         
     | 
| 
      
 43 
     | 
    
         
            +
                  model.db = Sequel.mock
         
     | 
| 
      
 44 
     | 
    
         
            +
                  self.class_variable_get(:@@provider).disconnect
         
     | 
| 
      
 45 
     | 
    
         
            +
                end
         
     | 
| 
       88 
46 
     | 
    
         | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                   
     | 
| 
       91 
     | 
    
         
            -
                  Tetrahedron::Model.db = Sequel.mock
         
     | 
| 
       92 
     | 
    
         
            -
                  @connection = nil
         
     | 
| 
      
 47 
     | 
    
         
            +
                def self.install(application)
         
     | 
| 
      
 48 
     | 
    
         
            +
                  super(application)
         
     | 
| 
       93 
49 
     | 
    
         | 
| 
       94 
     | 
    
         
            -
                   
     | 
| 
       95 
     | 
    
         
            -
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
                  # TODO(mtwilliams): Refactor out this horrid mess.
         
     | 
| 
       96 
51 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
                   
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
      
 52 
     | 
    
         
            +
                  # We can't build an inheritence heirarchy.
         
     | 
| 
      
 53 
     | 
    
         
            +
                  # See https://groups.google.com/d/msg/sequel-talk/OG5ti9JAJIE/p1iqO57cwqwJ.
         
     | 
| 
      
 54 
     | 
    
         
            +
                  application.class_eval("Model = Class.new(Sequel::Model);")
         
     | 
| 
      
 55 
     | 
    
         
            +
                  model = application.const_get("Model")
         
     | 
| 
       100 
56 
     | 
    
         | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
                  #  
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
      
 57 
     | 
    
         
            +
                  # Stop Sequel from bitching when we users subclass models before the
         
     | 
| 
      
 58 
     | 
    
         
            +
                  # database connection is established.
         
     | 
| 
      
 59 
     | 
    
         
            +
                  model.db = Sequel.mock
         
     | 
| 
       104 
60 
     | 
    
         | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
       106 
     | 
    
         
            -
                   
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
                  # Back descendents.
         
     | 
| 
      
 62 
     | 
    
         
            +
                  model.send :define_singleton_method, :db= do |db|
         
     | 
| 
      
 63 
     | 
    
         
            +
                    super(db)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    # All the way down, boys.
         
     | 
| 
      
 65 
     | 
    
         
            +
                    self.descendents.each do |descendent|
         
     | 
| 
      
 66 
     | 
    
         
            +
                      descendent.db = db
         
     | 
| 
      
 67 
     | 
    
         
            +
                    end
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
       108 
69 
     | 
    
         | 
| 
       109 
     | 
    
         
            -
             
     | 
| 
       110 
     | 
    
         
            -
                   
     | 
| 
      
 70 
     | 
    
         
            +
                  # Custom names are cool, m'kay.
         
     | 
| 
      
 71 
     | 
    
         
            +
                  application.send :define_singleton_method, :Model do |source|
         
     | 
| 
      
 72 
     | 
    
         
            +
                    anonymous_model_class = model::ANONYMOUS_MODEL_CLASSES_MUTEX.synchronize do
         
     | 
| 
      
 73 
     | 
    
         
            +
                                              model::ANONYMOUS_MODEL_CLASSES[source]
         
     | 
| 
      
 74 
     | 
    
         
            +
                                            end
         
     | 
| 
      
 75 
     | 
    
         
            +
                    unless anonymous_model_class
         
     | 
| 
      
 76 
     | 
    
         
            +
                      anonymous_model_class = if source.is_a?(Sequel::Database)
         
     | 
| 
      
 77 
     | 
    
         
            +
                                                Class.new(model).db = source
         
     | 
| 
      
 78 
     | 
    
         
            +
                                              else
         
     | 
| 
      
 79 
     | 
    
         
            +
                                                Class.new(model).set_dataset(source)
         
     | 
| 
      
 80 
     | 
    
         
            +
                                              end
         
     | 
| 
      
 81 
     | 
    
         
            +
                      model::ANONYMOUS_MODEL_CLASSES_MUTEX.synchronize do
         
     | 
| 
      
 82 
     | 
    
         
            +
                        model::ANONYMOUS_MODEL_CLASSES[source] = anonymous_model_class
         
     | 
| 
      
 83 
     | 
    
         
            +
                      end
         
     | 
| 
      
 84 
     | 
    
         
            +
                    end
         
     | 
| 
      
 85 
     | 
    
         
            +
                    anonymous_model_class
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
       111 
87 
     | 
    
         
             
                end
         
     | 
| 
       112 
88 
     | 
    
         
             
              end
         
     | 
| 
       113 
89 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Databases
         
     | 
| 
      
 3 
     | 
    
         
            +
                class Postgres < Database::Provider
         
     | 
| 
      
 4 
     | 
    
         
            +
                  class Configuration < Database::Configuration
         
     | 
| 
      
 5 
     | 
    
         
            +
                    attr_accessor :host,
         
     | 
| 
      
 6 
     | 
    
         
            +
                                  :port,
         
     | 
| 
      
 7 
     | 
    
         
            +
                                  :user,
         
     | 
| 
      
 8 
     | 
    
         
            +
                                  :password,
         
     | 
| 
      
 9 
     | 
    
         
            +
                                  :database,
         
     | 
| 
      
 10 
     | 
    
         
            +
                                  :pool
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  def initialize
         
     | 
| 
      
 14 
     | 
    
         
            +
                    @configuration = Configuration.new
         
     | 
| 
      
 15 
     | 
    
         
            +
                    yield @configuration if block_given?
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  def connection
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @connection
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  def connect
         
     | 
| 
      
 23 
     | 
    
         
            +
                    # Wait some amount of time before assuming the database is down.
         
     | 
| 
      
 24 
     | 
    
         
            +
                    Service.wait_until_reachable!(:protocol => :tcp,
         
     | 
| 
      
 25 
     | 
    
         
            +
                                                  :host => @configuration.host,
         
     | 
| 
      
 26 
     | 
    
         
            +
                                                  :port => @configuration.port,
         
     | 
| 
      
 27 
     | 
    
         
            +
                                                  :timeout => 15)
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                    @connection = Sequel.postgres(:host => @configuration.host,
         
     | 
| 
      
 30 
     | 
    
         
            +
                                                  :port => @configuration.port,
         
     | 
| 
      
 31 
     | 
    
         
            +
                                                  :user => @configuration.user,
         
     | 
| 
      
 32 
     | 
    
         
            +
                                                  :password => @configuration.password,
         
     | 
| 
      
 33 
     | 
    
         
            +
                                                  :database => @configuration.database,
         
     | 
| 
      
 34 
     | 
    
         
            +
                                                  :test => true,
         
     | 
| 
      
 35 
     | 
    
         
            +
                                                  :sslmode => :prefer,
         
     | 
| 
      
 36 
     | 
    
         
            +
                                                  :max_connections => @configuration.pool)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    true
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  def disconnect
         
     | 
| 
      
 42 
     | 
    
         
            +
                    @connection.disconnect if @connection
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @connection = nil
         
     | 
| 
      
 44 
     | 
    
         
            +
                    true
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Databases
         
     | 
| 
      
 3 
     | 
    
         
            +
                class SQLite3 < Database::Provider
         
     | 
| 
      
 4 
     | 
    
         
            +
                  class Configuration < Database::Configuration
         
     | 
| 
      
 5 
     | 
    
         
            +
                    attr_accessor :path
         
     | 
| 
      
 6 
     | 
    
         
            +
                  end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  def initialize
         
     | 
| 
      
 9 
     | 
    
         
            +
                    @configuration = Configuration.new
         
     | 
| 
      
 10 
     | 
    
         
            +
                    yield @configuration if block_given?
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  def connection
         
     | 
| 
      
 14 
     | 
    
         
            +
                    @connection
         
     | 
| 
      
 15 
     | 
    
         
            +
                  end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                  def connect
         
     | 
| 
      
 18 
     | 
    
         
            +
                    # If no path was specified, default to a transient in-memory database.
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @connection = Sequel.sqlite(:database => (@configuration.path || ':memory:'))
         
     | 
| 
      
 20 
     | 
    
         
            +
                    true
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  def disconnect
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @connection.disconnect if @connection
         
     | 
| 
      
 25 
     | 
    
         
            +
                    @connection = nil
         
     | 
| 
      
 26 
     | 
    
         
            +
                    true
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/tetrahedron/gem.rb
    CHANGED
    
    | 
         @@ -32,7 +32,7 @@ module Tetrahedron 
     | 
|
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
                # A short summary of this Gem.
         
     | 
| 
       34 
34 
     | 
    
         
             
                def self.summary
         
     | 
| 
       35 
     | 
    
         
            -
                  " 
     | 
| 
      
 35 
     | 
    
         
            +
                  "Welcome to the Tet."
         
     | 
| 
       36 
36 
     | 
    
         
             
                end
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
38 
     | 
    
         
             
                # A full description of this Gem.
         
     | 
| 
         @@ -41,7 +41,7 @@ module Tetrahedron 
     | 
|
| 
       41 
41 
     | 
    
         
             
                end
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
       43 
43 
     | 
    
         
             
                module VERSION #:nodoc:
         
     | 
| 
       44 
     | 
    
         
            -
                  MAJOR, MINOR, PATCH, PRE = [0, 0,  
     | 
| 
      
 44 
     | 
    
         
            +
                  MAJOR, MINOR, PATCH, PRE = [0, 0, 1, 0]
         
     | 
| 
       45 
45 
     | 
    
         
             
                  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
         
     | 
| 
       46 
46 
     | 
    
         
             
                end
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Middleware
         
     | 
| 
      
 3 
     | 
    
         
            +
                def self.use(middleware, *args, &block)
         
     | 
| 
      
 4 
     | 
    
         
            +
                  stack = self.class_variable_get(:@@stack)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  stack << proc { |app| middleware.new(app, *args, &block) }
         
     | 
| 
      
 6 
     | 
    
         
            +
                  self.class_variable_set(:@@stack, stack)
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                def initialize(app)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @app = app
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def call(env)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  middlewares = self.class.class_variable_get(:@@stack).reverse
         
     | 
| 
      
 15 
     | 
    
         
            +
                  wrapped = middlewares.inject(@app) {|_, middleware| middleware[_]}
         
     | 
| 
      
 16 
     | 
    
         
            +
                  wrapped.call(env)
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def self.install(application)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  middleware = Class.new(self)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  application.const_set('Middleware', middleware)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  middleware.class_variable_set(:@@stack, [])
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Tetrahedron
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Service
         
     | 
| 
      
 3 
     | 
    
         
            +
                def self.install(application)
         
     | 
| 
      
 4 
     | 
    
         
            +
                  service = Class.new(self)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  service.class_variable_set(:@@application, application)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  application.const_set(self.to_s.split('::').last, service)
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                Unconfigured = Class.new(Tetrahedron::Error)
         
     | 
| 
      
 10 
     | 
    
         
            +
                Misconfigured = Class.new(Tetrahedron::Error)
         
     | 
| 
      
 11 
     | 
    
         
            +
                AlreadyConfigured = Class.new(Tetrahedron::Error)
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                class Configuration
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                def self.configured?
         
     | 
| 
      
 17 
     | 
    
         
            +
                  self.class_variable_defined?(:@@provider)
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                def self.configured!
         
     | 
| 
      
 21 
     | 
    
         
            +
                  raise Unconfigured unless self.configured?
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                def self.configure(&configurator)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  raise AlreadyConfigured if self.configured?
         
     | 
| 
      
 26 
     | 
    
         
            +
                  provider = configurator.call()
         
     | 
| 
      
 27 
     | 
    
         
            +
                  raise Misconfigured unless provider.is_a? Provider
         
     | 
| 
      
 28 
     | 
    
         
            +
                  self.class_variable_set(:@@provider, provider)
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                Unreachable = Class.new(Tetrahedron::Error)
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                class Provider
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                def self.wait_until_reachable(opts={})
         
     | 
| 
      
 37 
     | 
    
         
            +
                  Timeout::timeout(opts.fetch(:timeout, 15)) do
         
     | 
| 
      
 38 
     | 
    
         
            +
                    while true
         
     | 
| 
      
 39 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 40 
     | 
    
         
            +
                        case opts[:protocol]
         
     | 
| 
      
 41 
     | 
    
         
            +
                        when :tcp
         
     | 
| 
      
 42 
     | 
    
         
            +
                          TCPSocket.new(opts[:host], opts[:port]).close
         
     | 
| 
      
 43 
     | 
    
         
            +
                          return true
         
     | 
| 
      
 44 
     | 
    
         
            +
                        when :udp
         
     | 
| 
      
 45 
     | 
    
         
            +
                          raise "This makes no sense!"
         
     | 
| 
      
 46 
     | 
    
         
            +
                        end
         
     | 
| 
      
 47 
     | 
    
         
            +
                      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError
         
     | 
| 
      
 48 
     | 
    
         
            +
                        # We're all good citizens, right?
         
     | 
| 
      
 49 
     | 
    
         
            +
                        Kernel.sleep(1)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      end
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
                rescue Timeout::Error
         
     | 
| 
      
 54 
     | 
    
         
            +
                  false
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                def self.wait_until_reachable!(opts={})
         
     | 
| 
      
 58 
     | 
    
         
            +
                  raise Unreachable unless self.wait_until_reachable(opts)
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
              end
         
     | 
| 
      
 61 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/tetrahedron/sessions.rb
    CHANGED
    
    | 
         @@ -1,28 +1,37 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
               
     | 
| 
      
 2 
     | 
    
         
            +
              class Sessions
         
     | 
| 
       3 
3 
     | 
    
         
             
                class Configuration
         
     | 
| 
       4 
     | 
    
         
            -
                   
     | 
| 
       5 
     | 
    
         
            -
                   
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                     
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 4 
     | 
    
         
            +
                  OPTIONS = [:key, :domain, :path, :expires, :secret]
         
     | 
| 
      
 5 
     | 
    
         
            +
                  attr_accessor *OPTIONS
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def dsl(&block)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    config = self
         
     | 
| 
      
 8 
     | 
    
         
            +
                    dsl = Class.new
         
     | 
| 
      
 9 
     | 
    
         
            +
                    OPTIONS.each do |option|
         
     | 
| 
      
 10 
     | 
    
         
            +
                      dsl.send :define_method, option.to_sym do |value|
         
     | 
| 
      
 11 
     | 
    
         
            +
                        config.instance_variable_set(:"@#{option}", value)
         
     | 
| 
      
 12 
     | 
    
         
            +
                      end
         
     | 
| 
       10 
13 
     | 
    
         
             
                    end
         
     | 
| 
      
 14 
     | 
    
         
            +
                    dsl.new.instance_eval(&block)
         
     | 
| 
       11 
15 
     | 
    
         
             
                  end
         
     | 
| 
       12 
16 
     | 
    
         
             
                end
         
     | 
| 
       13 
17 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
                def self. 
     | 
| 
       15 
     | 
    
         
            -
                   
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                   
     | 
| 
      
 18 
     | 
    
         
            +
                def self.configure(&configurator)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  application = self.class_variable_get(:@@application)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  configuration = Configuration.new
         
     | 
| 
      
 21 
     | 
    
         
            +
                  configuration.key = (application.to_s.underscore.split('::')+['session']).join('.')
         
     | 
| 
      
 22 
     | 
    
         
            +
                  configuration.dsl(&configurator)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  middleware = application.const_get('Middleware')
         
     | 
| 
      
 24 
     | 
    
         
            +
                  middleware.use(Rack::Session::Cookie, :key => configuration.key,
         
     | 
| 
      
 25 
     | 
    
         
            +
                                                        :domain => configuration.domain,
         
     | 
| 
      
 26 
     | 
    
         
            +
                                                        :path => configuration.path,
         
     | 
| 
      
 27 
     | 
    
         
            +
                                                        :expire_after => configuration.expires,
         
     | 
| 
      
 28 
     | 
    
         
            +
                                                        :secret => configuration.secret)
         
     | 
| 
       20 
29 
     | 
    
         
             
                end
         
     | 
| 
       21 
30 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                def self. 
     | 
| 
       23 
     | 
    
         
            -
                   
     | 
| 
       24 
     | 
    
         
            -
                   
     | 
| 
       25 
     | 
    
         
            -
                   
     | 
| 
      
 31 
     | 
    
         
            +
                def self.install(application)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  sessions = Class.new(self)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  application.const_set('Sessions', sessions)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  sessions.class_variable_set(:@@application, application)
         
     | 
| 
       26 
35 
     | 
    
         
             
                end
         
     | 
| 
       27 
36 
     | 
    
         
             
              end
         
     | 
| 
       28 
37 
     | 
    
         
             
            end
         
     | 
    
        data/lib/tetrahedron.rb
    CHANGED
    
    | 
         @@ -1,59 +1,31 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'rubygems'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'bundler'
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            Bundler.require(:default)
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            # Some things aren't nicely cut gems, unforunately.
         
     | 
| 
       7 
     | 
    
         
            -
            require 'base64'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'erb'
         
     | 
| 
       9 
     | 
    
         
            -
            require 'net/http'
         
     | 
| 
       10 
     | 
    
         
            -
            require 'ostruct'
         
     | 
| 
       11 
     | 
    
         
            -
            require 'securerandom'
         
     | 
| 
       12 
     | 
    
         
            -
            require 'socket'
         
     | 
| 
       13 
     | 
    
         
            -
            require 'time'
         
     | 
| 
       14 
     | 
    
         
            -
            require 'uri'
         
     | 
| 
       15 
     | 
    
         
            -
            require 'yaml'
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
            # Smells like Rails...
         
     | 
| 
       18 
1 
     | 
    
         
             
            require 'active_support'
         
     | 
| 
       19 
2 
     | 
    
         
             
            require 'active_support/core_ext'
         
     | 
| 
       20 
3 
     | 
    
         | 
| 
       21 
4 
     | 
    
         
             
            module Tetrahedron
         
     | 
| 
       22 
     | 
    
         
            -
               
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
      
 5 
     | 
    
         
            +
              require 'tetrahedron/gem'
         
     | 
| 
      
 6 
     | 
    
         
            +
              require 'tetrahedron/error'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              require 'tetrahedron/middleware'
         
     | 
| 
      
 9 
     | 
    
         
            +
              require 'tetrahedron/sessions'
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              require 'tetrahedron/base'
         
     | 
| 
      
 12 
     | 
    
         
            +
                require 'tetrahedron/application'
         
     | 
| 
      
 13 
     | 
    
         
            +
                  require 'tetrahedron/application/base'
         
     | 
| 
      
 14 
     | 
    
         
            +
                    require 'tetrahedron/application/controller'
         
     | 
| 
      
 15 
     | 
    
         
            +
                    require 'tetrahedron/application/endpoint'
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              require 'tetrahedron/service'
         
     | 
| 
      
 18 
     | 
    
         
            +
                require 'tetrahedron/database'
         
     | 
| 
      
 19 
     | 
    
         
            +
                  require 'tetrahedron/databases/sqlite3'
         
     | 
| 
      
 20 
     | 
    
         
            +
                  require 'tetrahedron/databases/postgres'
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
              # require 'tetrahedron/cache'
         
     | 
| 
      
 23 
     | 
    
         
            +
              #   require 'tetrahedron/caches/null'     #=> ActiveSupport::Cache::NullStore
         
     | 
| 
      
 24 
     | 
    
         
            +
              #   require 'tetrahedron/caches/memory'   #=> ActiveSupport::Cache::MemoryStore
         
     | 
| 
      
 25 
     | 
    
         
            +
              #   require 'tetrahedron/caches/memcache' #=> Dalli
         
     | 
| 
      
 26 
     | 
    
         
            +
              #   require 'tetrahedron/caches/redis'    #=> Hiredis
         
     | 
| 
      
 27 
     | 
    
         
            +
              # require 'tetrahedron/queue'
         
     | 
| 
      
 28 
     | 
    
         
            +
              #   require 'tetrahedron/queues/null'     #=> .*~~~ The Abyss ~~~*.
         
     | 
| 
      
 29 
     | 
    
         
            +
              #   require 'tetrahedron/queues/spawn'    #=> Thread.new
         
     | 
| 
      
 30 
     | 
    
         
            +
              #   require 'tetrahedron/queues/sidekiq'  #=> Sidekiq (from Redis, with Love)
         
     | 
| 
       25 
31 
     | 
    
         
             
            end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
            require 'tetrahedron/gem'
         
     | 
| 
       28 
     | 
    
         
            -
            require 'tetrahedron/bundler'
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            require 'tetrahedron/error'
         
     | 
| 
       31 
     | 
    
         
            -
            require 'tetrahedron/errors'
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
            require 'tetrahedron/configuration'
         
     | 
| 
       34 
     | 
    
         
            -
            require 'tetrahedron/environment'
         
     | 
| 
       35 
     | 
    
         
            -
            require 'tetrahedron/bootfile'
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
            Tetrahedron::Bundler.require
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
            require 'sinatra/base'
         
     | 
| 
       40 
     | 
    
         
            -
            require 'sinatra/contrib'
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
            require 'sequel'
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
            Sequel.extension :migration
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
            Sequel::Model.plugin :timestamps
         
     | 
| 
       47 
     | 
    
         
            -
            Sequel::Model.plugin :subclasses
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
            require 'tetrahedron/base'
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
            require 'tetrahedron/assets'
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
            require 'tetrahedron/database'
         
     | 
| 
       54 
     | 
    
         
            -
            require 'tetrahedron/sessions'
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
            require 'tetrahedron/app'
         
     | 
| 
       57 
     | 
    
         
            -
            require 'tetrahedron/model'
         
     | 
| 
       58 
     | 
    
         
            -
            require 'tetrahedron/controller'
         
     | 
| 
       59 
     | 
    
         
            -
            require 'tetrahedron/endpoint'
         
     | 
    
        data/tetrahedron.gemspec
    CHANGED
    
    | 
         @@ -23,12 +23,17 @@ Gem::Specification.new do |s| 
     | 
|
| 
       23 
23 
     | 
    
         
             
              s.add_development_dependency("rake")
         
     | 
| 
       24 
24 
     | 
    
         
             
              s.add_development_dependency("pry")
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
      
 26 
     | 
    
         
            +
              s.add_dependency("thor")
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
       26 
28 
     | 
    
         
             
              s.add_dependency("activesupport")
         
     | 
| 
       27 
29 
     | 
    
         | 
| 
      
 30 
     | 
    
         
            +
              s.add_dependency("rack")
         
     | 
| 
      
 31 
     | 
    
         
            +
              s.add_dependency("rack-contrib")
         
     | 
| 
       28 
32 
     | 
    
         
             
              s.add_dependency("sinatra")
         
     | 
| 
       29 
33 
     | 
    
         
             
              s.add_dependency("sinatra-contrib")
         
     | 
| 
      
 34 
     | 
    
         
            +
              s.add_dependency("erubis")
         
     | 
| 
       30 
35 
     | 
    
         | 
| 
       31 
36 
     | 
    
         
             
              s.add_dependency("sequel")
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
              s.add_dependency(" 
     | 
| 
      
 37 
     | 
    
         
            +
              s.add_dependency("redis")
         
     | 
| 
      
 38 
     | 
    
         
            +
              s.add_dependency("mail")
         
     | 
| 
       34 
39 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: tetrahedron
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.0.0 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.1.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Michael Williams
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2015-11- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2015-11-30 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: rake
         
     | 
| 
         @@ -38,6 +38,20 @@ dependencies: 
     | 
|
| 
       38 
38 
     | 
    
         
             
                - - ">="
         
     | 
| 
       39 
39 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       40 
40 
     | 
    
         
             
                    version: '0'
         
     | 
| 
      
 41 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 42 
     | 
    
         
            +
              name: thor
         
     | 
| 
      
 43 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 44 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 45 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 46 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 48 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 49 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 50 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 51 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 52 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 53 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       41 
55 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       42 
56 
     | 
    
         
             
              name: activesupport
         
     | 
| 
       43 
57 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -52,6 +66,34 @@ dependencies: 
     | 
|
| 
       52 
66 
     | 
    
         
             
                - - ">="
         
     | 
| 
       53 
67 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       54 
68 
     | 
    
         
             
                    version: '0'
         
     | 
| 
      
 69 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 70 
     | 
    
         
            +
              name: rack
         
     | 
| 
      
 71 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 72 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 73 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 74 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 75 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 76 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 77 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 78 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 79 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 80 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 81 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 82 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 83 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 84 
     | 
    
         
            +
              name: rack-contrib
         
     | 
| 
      
 85 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 86 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 87 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 88 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 89 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 90 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 91 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 92 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 93 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 94 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 95 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 96 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       55 
97 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       56 
98 
     | 
    
         
             
              name: sinatra
         
     | 
| 
       57 
99 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -80,6 +122,20 @@ dependencies: 
     | 
|
| 
       80 
122 
     | 
    
         
             
                - - ">="
         
     | 
| 
       81 
123 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       82 
124 
     | 
    
         
             
                    version: '0'
         
     | 
| 
      
 125 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 126 
     | 
    
         
            +
              name: erubis
         
     | 
| 
      
 127 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 128 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 129 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 130 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 131 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 132 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 133 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 134 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 135 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 136 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 137 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 138 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       83 
139 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       84 
140 
     | 
    
         
             
              name: sequel
         
     | 
| 
       85 
141 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -95,7 +151,21 @@ dependencies: 
     | 
|
| 
       95 
151 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       96 
152 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       97 
153 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       98 
     | 
    
         
            -
              name:  
     | 
| 
      
 154 
     | 
    
         
            +
              name: redis
         
     | 
| 
      
 155 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 156 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 157 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 158 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 159 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 160 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 161 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 162 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 163 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 164 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 165 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 166 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 167 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 168 
     | 
    
         
            +
              name: mail
         
     | 
| 
       99 
169 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       100 
170 
     | 
    
         
             
                requirements:
         
     | 
| 
       101 
171 
     | 
    
         
             
                - - ">="
         
     | 
| 
         @@ -123,29 +193,20 @@ files: 
     | 
|
| 
       123 
193 
     | 
    
         
             
            - README.md
         
     | 
| 
       124 
194 
     | 
    
         
             
            - Rakefile
         
     | 
| 
       125 
195 
     | 
    
         
             
            - bin/tetrahedron
         
     | 
| 
       126 
     | 
    
         
            -
            - config/app.ru
         
     | 
| 
       127 
     | 
    
         
            -
            - config/application.rb
         
     | 
| 
       128 
     | 
    
         
            -
            - config/environment.rb
         
     | 
| 
       129 
     | 
    
         
            -
            - config/puma.rb
         
     | 
| 
       130 
196 
     | 
    
         
             
            - lib/tetrahedron.rb
         
     | 
| 
       131 
     | 
    
         
            -
            - lib/tetrahedron/ 
     | 
| 
       132 
     | 
    
         
            -
            - lib/tetrahedron/ 
     | 
| 
      
 197 
     | 
    
         
            +
            - lib/tetrahedron/application.rb
         
     | 
| 
      
 198 
     | 
    
         
            +
            - lib/tetrahedron/application/base.rb
         
     | 
| 
      
 199 
     | 
    
         
            +
            - lib/tetrahedron/application/controller.rb
         
     | 
| 
      
 200 
     | 
    
         
            +
            - lib/tetrahedron/application/endpoint.rb
         
     | 
| 
       133 
201 
     | 
    
         
             
            - lib/tetrahedron/base.rb
         
     | 
| 
       134 
     | 
    
         
            -
            - lib/tetrahedron/bootfile.rb
         
     | 
| 
       135 
     | 
    
         
            -
            - lib/tetrahedron/bundler.rb
         
     | 
| 
       136 
     | 
    
         
            -
            - lib/tetrahedron/configuration.rb
         
     | 
| 
       137 
     | 
    
         
            -
            - lib/tetrahedron/controller.rb
         
     | 
| 
       138 
202 
     | 
    
         
             
            - lib/tetrahedron/database.rb
         
     | 
| 
       139 
     | 
    
         
            -
            - lib/tetrahedron/ 
     | 
| 
       140 
     | 
    
         
            -
            - lib/tetrahedron/ 
     | 
| 
      
 203 
     | 
    
         
            +
            - lib/tetrahedron/databases/postgres.rb
         
     | 
| 
      
 204 
     | 
    
         
            +
            - lib/tetrahedron/databases/sqlite3.rb
         
     | 
| 
       141 
205 
     | 
    
         
             
            - lib/tetrahedron/error.rb
         
     | 
| 
       142 
     | 
    
         
            -
            - lib/tetrahedron/errors.rb
         
     | 
| 
       143 
206 
     | 
    
         
             
            - lib/tetrahedron/gem.rb
         
     | 
| 
       144 
     | 
    
         
            -
            - lib/tetrahedron/ 
     | 
| 
       145 
     | 
    
         
            -
            - lib/tetrahedron/ 
     | 
| 
       146 
     | 
    
         
            -
            - lib/tetrahedron/redis.rb
         
     | 
| 
      
 207 
     | 
    
         
            +
            - lib/tetrahedron/middleware.rb
         
     | 
| 
      
 208 
     | 
    
         
            +
            - lib/tetrahedron/service.rb
         
     | 
| 
       147 
209 
     | 
    
         
             
            - lib/tetrahedron/sessions.rb
         
     | 
| 
       148 
     | 
    
         
            -
            - lib/tetrahedron/tasks/tet.rake
         
     | 
| 
       149 
210 
     | 
    
         
             
            - tetrahedron.gemspec
         
     | 
| 
       150 
211 
     | 
    
         
             
            homepage: http://github.com/mtwilliams/tetrahedron
         
     | 
| 
       151 
212 
     | 
    
         
             
            licenses:
         
     | 
| 
         @@ -170,5 +231,5 @@ rubyforge_project: 
     | 
|
| 
       170 
231 
     | 
    
         
             
            rubygems_version: 2.4.5.1
         
     | 
| 
       171 
232 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       172 
233 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       173 
     | 
    
         
            -
            summary:  
     | 
| 
      
 234 
     | 
    
         
            +
            summary: Welcome to the Tet.
         
     | 
| 
       174 
235 
     | 
    
         
             
            test_files: []
         
     | 
    
        data/config/app.ru
    DELETED
    
    | 
         @@ -1,21 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            #!/usr/bin/env rackup
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            require_relative 'application'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative 'environment'
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            # TODO(mtwilliams): Request tracking (make Heroku compatiable).
         
     | 
| 
       7 
     | 
    
         
            -
            # TODO(mtwilliams): Performance monitoring (make Heroku compatiable).
         
     | 
| 
       8 
     | 
    
         
            -
            # TODO(mtwilliams): Error handling.
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            if Tetrahedron::Sessions.configured?
         
     | 
| 
       11 
     | 
    
         
            -
              use Rack::Session::Cookie, :key => Tetrahedron::Sessions.config.cookie,
         
     | 
| 
       12 
     | 
    
         
            -
                                         :domain => Tetrahedron::Sessions.config.domain,
         
     | 
| 
       13 
     | 
    
         
            -
                                         :expire_after => Tetrahedron::Sessions.config.lifetime,
         
     | 
| 
       14 
     | 
    
         
            -
                                         :secret => Tetrahedron::Sessions.config.secret
         
     | 
| 
       15 
     | 
    
         
            -
            else
         
     | 
| 
       16 
     | 
    
         
            -
              # TODO(mtwilliams): Use a logger.
         
     | 
| 
       17 
     | 
    
         
            -
              $stderr.puts "Sessions not configured!\n => Use Tetrahedron::Sessions.configure in config/environment.rb!"
         
     | 
| 
       18 
     | 
    
         
            -
            end
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
            # TODO(mtwilliams): Remove cylcical dependency so we can use a constantized version.
         
     | 
| 
       21 
     | 
    
         
            -
            run Tetrahedron.config.app.constantize
         
     | 
    
        data/config/application.rb
    DELETED
    
    
    
        data/config/environment.rb
    DELETED
    
    | 
         @@ -1,18 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require_relative 'application'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            Tetrahedron::Environment.load
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            if Tetrahedron.env.development?
         
     | 
| 
       6 
     | 
    
         
            -
              # Synchronize STDOUT and STDERR to make debugging easier.
         
     | 
| 
       7 
     | 
    
         
            -
              STDOUT.sync = STDERR.sync = true
         
     | 
| 
       8 
     | 
    
         
            -
            end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            require File.join(Tetrahedron.config.root, "config", "environment")
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            unless Tetrahedron::Database.configured?
         
     | 
| 
       13 
     | 
    
         
            -
              $stderr.puts "Database not configured!\n => Use Tetrahedron::Database.configure in config/environment.rb!"
         
     | 
| 
       14 
     | 
    
         
            -
            end
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
            # unless Tetrahedron::Redis.configured?
         
     | 
| 
       17 
     | 
    
         
            -
            #   $stderr.puts "Redis not configured!\n => Use Tetrahedron::Redis.configure in config/environment.rb!"
         
     | 
| 
       18 
     | 
    
         
            -
            # end
         
     | 
    
        data/config/puma.rb
    DELETED
    
    | 
         @@ -1,29 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require_relative 'application'
         
     | 
| 
       2 
     | 
    
         
            -
            require_relative 'environment'
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            rackup      File.join(Tetrahedron.root, 'config', 'app.ru')
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
            environment Tetrahedron.env.to_s
         
     | 
| 
       7 
     | 
    
         
            -
            bind        "tcp://#{ENV['HOST'] || '0.0.0.0'}:#{ENV['PORT'] || 80}"
         
     | 
| 
       8 
     | 
    
         
            -
            port        (ENV['PORT'] || 80).to_i
         
     | 
| 
       9 
     | 
    
         
            -
            workers     (ENV['PUMA_WORKERS'] || 1).to_i
         
     | 
| 
       10 
     | 
    
         
            -
            threads     (ENV['PUMA_MIN_THREADS'] || 1).to_i,
         
     | 
| 
       11 
     | 
    
         
            -
                        (ENV['PUMA_MAX_THREADS'] || 1).to_i
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
            preload_app!
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
            before_fork do
         
     | 
| 
       16 
     | 
    
         
            -
              if Tetrahedron.env.production?
         
     | 
| 
       17 
     | 
    
         
            -
                # TODO(mtwilliams): Precompile assets.
         
     | 
| 
       18 
     | 
    
         
            -
                Tetrahedron::Assets.precompile
         
     | 
| 
       19 
     | 
    
         
            -
              end
         
     | 
| 
       20 
     | 
    
         
            -
            end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            on_worker_boot do
         
     | 
| 
       23 
     | 
    
         
            -
              Tetrahedron.bootfile.up.call() if Tetrahedron.bootfile.up
         
     | 
| 
       24 
     | 
    
         
            -
            end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
            # TODO(mtwilliams): Report low-level errors in production.
         
     | 
| 
       27 
     | 
    
         
            -
             # lowlevel_error_handler do |e|
         
     | 
| 
       28 
     | 
    
         
            -
             #   ...
         
     | 
| 
       29 
     | 
    
         
            -
             # end
         
     | 
    
        data/lib/tetrahedron/app.rb
    DELETED
    
    | 
         @@ -1,16 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              class App < Tetrahedron::Base
         
     | 
| 
       3 
     | 
    
         
            -
                configure do
         
     | 
| 
       4 
     | 
    
         
            -
                  environment = Tetrahedron::Assets::Environment.new
         
     | 
| 
       5 
     | 
    
         
            -
                  set :assets, environment: environment
         
     | 
| 
       6 
     | 
    
         
            -
                  sprockets_based_server = Tetrahedron::Assets::Server.new(settings.assets[:environment])
         
     | 
| 
       7 
     | 
    
         
            -
                  set :assets, server: sprockets_based_server
         
     | 
| 
       8 
     | 
    
         
            -
                end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                get %r{^/assets/*} do
         
     | 
| 
       11 
     | 
    
         
            -
                  # Assets are handled by Sprockets.
         
     | 
| 
       12 
     | 
    
         
            -
                  env['PATH_INFO'].sub('/assets', '')
         
     | 
| 
       13 
     | 
    
         
            -
                  settings.assets[:server].call!(env)
         
     | 
| 
       14 
     | 
    
         
            -
                end
         
     | 
| 
       15 
     | 
    
         
            -
              end
         
     | 
| 
       16 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/tetrahedron/assets.rb
    DELETED
    
    | 
         @@ -1,43 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              module Assets
         
     | 
| 
       3 
     | 
    
         
            -
                class Environment < Sprockets::Environment
         
     | 
| 
       4 
     | 
    
         
            -
                  def initialize
         
     | 
| 
       5 
     | 
    
         
            -
                    super(Tetrahedron.config.root)
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                    self.append_path('vendor/assets/styles')
         
     | 
| 
       8 
     | 
    
         
            -
                    self.append_path('vendor/assets/scripts')
         
     | 
| 
       9 
     | 
    
         
            -
                    self.append_path('vendor/assets/fonts')
         
     | 
| 
       10 
     | 
    
         
            -
                    self.append_path('vendor/assets/images')
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                    self.append_path('assets/styles')
         
     | 
| 
       13 
     | 
    
         
            -
                    self.append_path('assets/scripts')
         
     | 
| 
       14 
     | 
    
         
            -
                    self.append_path('assets/fonts')
         
     | 
| 
       15 
     | 
    
         
            -
                    self.append_path('assets/images')
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                    if Tetrahedron.env.production?
         
     | 
| 
       18 
     | 
    
         
            -
                      self.css_compressor = CSSminify.new
         
     | 
| 
       19 
     | 
    
         
            -
                      self.js_compressor = Uglifier.new
         
     | 
| 
       20 
     | 
    
         
            -
                    end
         
     | 
| 
       21 
     | 
    
         
            -
                  end
         
     | 
| 
       22 
     | 
    
         
            -
                end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                class Server
         
     | 
| 
       25 
     | 
    
         
            -
                  def initialize(environment)
         
     | 
| 
       26 
     | 
    
         
            -
                    @environment = environment
         
     | 
| 
       27 
     | 
    
         
            -
                  end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                  def call(env)
         
     | 
| 
       30 
     | 
    
         
            -
                    @environment.call(env)
         
     | 
| 
       31 
     | 
    
         
            -
                  end
         
     | 
| 
       32 
     | 
    
         
            -
                end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                class Precompiler
         
     | 
| 
       35 
     | 
    
         
            -
                  # Precompile.
         
     | 
| 
       36 
     | 
    
         
            -
                end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                def self.precompile
         
     | 
| 
       39 
     | 
    
         
            -
                  # TODO(mtwilliams): Implement asset precompilation.
         
     | 
| 
       40 
     | 
    
         
            -
                  $stderr.puts "Asset precompilation is not implemented yet!"
         
     | 
| 
       41 
     | 
    
         
            -
                end
         
     | 
| 
       42 
     | 
    
         
            -
              end
         
     | 
| 
       43 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/tetrahedron/bootfile.rb
    DELETED
    
    | 
         @@ -1,43 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              class Bootfile
         
     | 
| 
       3 
     | 
    
         
            -
                DEFAULT = "config/boot.rb"
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                attr_reader :up
         
     | 
| 
       6 
     | 
    
         
            -
                attr_reader :down
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                def initialize()
         
     | 
| 
       9 
     | 
    
         
            -
                  # TODO(mtwilliams): Provide reasonable defaults.
         
     | 
| 
       10 
     | 
    
         
            -
                end
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                def self.load(filename=Tetrahedron::Bootfile::DEFAULT)
         
     | 
| 
       13 
     | 
    
         
            -
                  bootfile = Tetrahedron::Bootfile.new
         
     | 
| 
       14 
     | 
    
         
            -
                  require File.join(Tetrahedron.root, "config", "application")
         
     | 
| 
       15 
     | 
    
         
            -
                  DomainSpecificLanguage.for(bootfile).instance_eval(File.read(filename), filename)
         
     | 
| 
       16 
     | 
    
         
            -
                  bootfile
         
     | 
| 
       17 
     | 
    
         
            -
                end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                class DomainSpecificLanguage
         
     | 
| 
       20 
     | 
    
         
            -
                  def initialize(bootfile)
         
     | 
| 
       21 
     | 
    
         
            -
                    @bootfile = bootfile
         
     | 
| 
       22 
     | 
    
         
            -
                  end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
                  def up(&block)
         
     | 
| 
       25 
     | 
    
         
            -
                    @bootfile.instance_variable_set(:@up, block)
         
     | 
| 
       26 
     | 
    
         
            -
                  end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                  def down(&block)
         
     | 
| 
       29 
     | 
    
         
            -
                    @bootfile.instance_variable_set(:@down, block)
         
     | 
| 
       30 
     | 
    
         
            -
                  end
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                  def self.for(bootfile)
         
     | 
| 
       33 
     | 
    
         
            -
                    DomainSpecificLanguage.new(bootfile)
         
     | 
| 
       34 
     | 
    
         
            -
                  end
         
     | 
| 
       35 
     | 
    
         
            -
                end
         
     | 
| 
       36 
     | 
    
         
            -
              end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
              def self.bootfile(path=Tetrahedron::Bootfile::DEFAULT)
         
     | 
| 
       39 
     | 
    
         
            -
                @bootfile ||= begin
         
     | 
| 
       40 
     | 
    
         
            -
                  Bootfile.load(path)
         
     | 
| 
       41 
     | 
    
         
            -
                end
         
     | 
| 
       42 
     | 
    
         
            -
              end
         
     | 
| 
       43 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/tetrahedron/bundler.rb
    DELETED
    
    
| 
         @@ -1,44 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              class Configuration
         
     | 
| 
       3 
     | 
    
         
            -
                DEFAULT = "config/tetrahedron.rb"
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                attr_reader :app
         
     | 
| 
       6 
     | 
    
         
            -
                attr_reader :root
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                def initialize()
         
     | 
| 
       9 
     | 
    
         
            -
                  # TODO(mtwilliams): Best guess @app and @root.
         
     | 
| 
       10 
     | 
    
         
            -
                end
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                def self.load(filename=Tetrahedron::Configuration::DEFAULT)
         
     | 
| 
       13 
     | 
    
         
            -
                  configuration = Tetrahedron::Configuration.new
         
     | 
| 
       14 
     | 
    
         
            -
                  DomainSpecificLanguage.for(configuration).instance_eval(File.read(filename), filename)
         
     | 
| 
       15 
     | 
    
         
            -
                  configuration
         
     | 
| 
       16 
     | 
    
         
            -
                end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                class DomainSpecificLanguage
         
     | 
| 
       19 
     | 
    
         
            -
                  def initialize(configuration)
         
     | 
| 
       20 
     | 
    
         
            -
                    @configuration = configuration
         
     | 
| 
       21 
     | 
    
         
            -
                  end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                  def app(name)
         
     | 
| 
       24 
     | 
    
         
            -
                    @configuration.instance_variable_set(:@app, name)
         
     | 
| 
       25 
     | 
    
         
            -
                  end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                  def root(directory)
         
     | 
| 
       28 
     | 
    
         
            -
                    raise Tetrahedron::MisconfiguredError.new(:root, 'the path given does not exist') unless File.exist?(directory)
         
     | 
| 
       29 
     | 
    
         
            -
                    raise Tetrahedron::MisconfiguredError.new(:root, 'the path given is not a directory') unless File.directory?(directory)
         
     | 
| 
       30 
     | 
    
         
            -
                    @configuration.instance_variable_set(:@root, directory)
         
     | 
| 
       31 
     | 
    
         
            -
                  end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                  def self.for(configuration)
         
     | 
| 
       34 
     | 
    
         
            -
                    DomainSpecificLanguage.new(configuration)
         
     | 
| 
       35 
     | 
    
         
            -
                  end
         
     | 
| 
       36 
     | 
    
         
            -
                end
         
     | 
| 
       37 
     | 
    
         
            -
              end
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
              def self.config(path=Tetrahedron::Configuration::DEFAULT)
         
     | 
| 
       40 
     | 
    
         
            -
                @configuration ||= begin
         
     | 
| 
       41 
     | 
    
         
            -
                  Configuration.load(path)
         
     | 
| 
       42 
     | 
    
         
            -
                end
         
     | 
| 
       43 
     | 
    
         
            -
              end
         
     | 
| 
       44 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,17 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              class Controller < Tetrahedron::Base
         
     | 
| 
       3 
     | 
    
         
            -
                set :views, File.join(Tetrahedron.config.root, 'app', Tetrahedron.config.app.underscore, 'views')
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                # Use app/<app>/views/_layouts/default as the default layout.
         
     | 
| 
       6 
     | 
    
         
            -
                set :erb, :layout => :'_layouts/default'
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                # Recognize *.html.erb as Erubis templates.
         
     | 
| 
       9 
     | 
    
         
            -
                Tilt.register Tilt::ErubisTemplate, 'html.erb'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                # Don't recognize *.erb templates.
         
     | 
| 
       12 
     | 
    
         
            -
                def erb(template, options={}, locals={})
         
     | 
| 
       13 
     | 
    
         
            -
                  options[:layout] = settings.erb[:layout] if options[:layout].nil?
         
     | 
| 
       14 
     | 
    
         
            -
                  render 'html.erb', template, options, locals
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
              end
         
     | 
| 
       17 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/tetrahedron/endpoint.rb
    DELETED
    
    
| 
         @@ -1,28 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              module Environment
         
     | 
| 
       3 
     | 
    
         
            -
                # Loads `ENV` from `.env` if available.
         
     | 
| 
       4 
     | 
    
         
            -
                def self.load
         
     | 
| 
       5 
     | 
    
         
            -
                  # TODO(mtwilliams): Use a proper logger.
         
     | 
| 
       6 
     | 
    
         
            -
                  $stdout.puts "Loading environment from `.env` if available..."
         
     | 
| 
       7 
     | 
    
         
            -
                  require 'dotenv'
         
     | 
| 
       8 
     | 
    
         
            -
                  Dotenv.load! File.join(Tetrahedron.config.root, '.env')
         
     | 
| 
       9 
     | 
    
         
            -
                  $stdout.puts " => Loaded from `.env`."
         
     | 
| 
       10 
     | 
    
         
            -
                rescue LoadError => _
         
     | 
| 
       11 
     | 
    
         
            -
                  $stderr.puts " => The 'dotenv' Gem is not available on this system."
         
     | 
| 
       12 
     | 
    
         
            -
                  false
         
     | 
| 
       13 
     | 
    
         
            -
                rescue Errno::ENOENT
         
     | 
| 
       14 
     | 
    
         
            -
                  $stderr.puts " => No `.env' file."
         
     | 
| 
       15 
     | 
    
         
            -
                  false
         
     | 
| 
       16 
     | 
    
         
            -
                end
         
     | 
| 
       17 
     | 
    
         
            -
              end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
              def self.env
         
     | 
| 
       20 
     | 
    
         
            -
                env = ENV["#{Tetrahedron.config.app.upcase.gsub(/::/,'_')}_ENV"] || ENV['TETRAHEDRON_ENV'] || ENV['RACK_ENV']
         
     | 
| 
       21 
     | 
    
         
            -
                @env ||= ::ActiveSupport::StringInquirer.new(env)
         
     | 
| 
       22 
     | 
    
         
            -
              end
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
              def self.env=(new_environment)
         
     | 
| 
       25 
     | 
    
         
            -
                ENV["#{Tetrahedron.config.app.upcase.gsub(/::/,'_')}_ENV"] = ENV['TETRAHEDRON_ENV'] = new_environment
         
     | 
| 
       26 
     | 
    
         
            -
                @env = ::ActiveSupport::StringInquirer.new(new_environment)
         
     | 
| 
       27 
     | 
    
         
            -
              end
         
     | 
| 
       28 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/tetrahedron/errors.rb
    DELETED
    
    
    
        data/lib/tetrahedron/model.rb
    DELETED
    
    | 
         @@ -1,32 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              Model = Class.new(Sequel::Model)
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
              # Stop Sequel from bitching if it's subclassed before the first database
         
     | 
| 
       5 
     | 
    
         
            -
              # connection is established.
         
     | 
| 
       6 
     | 
    
         
            -
              Model.db = Sequel.mock if Sequel::DATABASES.empty?
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
              class Model
         
     | 
| 
       9 
     | 
    
         
            -
                def self::db=(db)
         
     | 
| 
       10 
     | 
    
         
            -
                  super(db)
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                  # All the way down, boys.
         
     | 
| 
       13 
     | 
    
         
            -
                  self.descendents.each do |subclass|
         
     | 
| 
       14 
     | 
    
         
            -
                    subclass.db = db
         
     | 
| 
       15 
     | 
    
         
            -
                  end
         
     | 
| 
       16 
     | 
    
         
            -
                end
         
     | 
| 
       17 
     | 
    
         
            -
              end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
              def self::Model(source)
         
     | 
| 
       20 
     | 
    
         
            -
                unless Sequel::Model::ANONYMOUS_MODEL_CLASSES.key?(source)
         
     | 
| 
       21 
     | 
    
         
            -
                  anonymous_model_class = nil
         
     | 
| 
       22 
     | 
    
         
            -
                  if source.is_a?(Sequel::Database)
         
     | 
| 
       23 
     | 
    
         
            -
                    anonymous_model_class = Class.new(Tetrahedron::Model)
         
     | 
| 
       24 
     | 
    
         
            -
                    anonymous_model_class.db = source
         
     | 
| 
       25 
     | 
    
         
            -
                  else
         
     | 
| 
       26 
     | 
    
         
            -
                    anonymous_model_class = Class.new(Tetrahedron::Model).set_dataset(source)
         
     | 
| 
       27 
     | 
    
         
            -
                  end
         
     | 
| 
       28 
     | 
    
         
            -
                  Sequel::Model::ANONYMOUS_MODEL_CLASSES[source] = anonymous_model_class
         
     | 
| 
       29 
     | 
    
         
            -
                end
         
     | 
| 
       30 
     | 
    
         
            -
                return Sequel::Model::ANONYMOUS_MODEL_CLASSES[source]
         
     | 
| 
       31 
     | 
    
         
            -
              end
         
     | 
| 
       32 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/tetrahedron/rake.rb
    DELETED
    
    | 
         @@ -1,16 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Tetrahedron
         
     | 
| 
       2 
     | 
    
         
            -
              module Rake
         
     | 
| 
       3 
     | 
    
         
            -
                def self.install
         
     | 
| 
       4 
     | 
    
         
            -
                  root = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
         
     | 
| 
       5 
     | 
    
         
            -
                  require_relative 'configuration'
         
     | 
| 
       6 
     | 
    
         
            -
                  Tetrahedron::Configuration.load
         
     | 
| 
       7 
     | 
    
         
            -
                  require_relative 'environment'
         
     | 
| 
       8 
     | 
    
         
            -
                  Tetrahedron::Environment.load
         
     | 
| 
       9 
     | 
    
         
            -
                  require File.join(root, 'config', 'application')
         
     | 
| 
       10 
     | 
    
         
            -
                  require File.join(root, 'config', 'environment')
         
     | 
| 
       11 
     | 
    
         
            -
                  Dir.glob(File.join(root, 'lib', 'tetrahedron', 'tasks', '**.rake')).each do |path|
         
     | 
| 
       12 
     | 
    
         
            -
                    Kernel.load(path)
         
     | 
| 
       13 
     | 
    
         
            -
                  end
         
     | 
| 
       14 
     | 
    
         
            -
                end
         
     | 
| 
       15 
     | 
    
         
            -
              end
         
     | 
| 
       16 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/tetrahedron/redis.rb
    DELETED