misosoup 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.
- data/.gitignore +4 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +22 -0
- data/README +2 -0
- data/Rakefile +5 -0
- data/bin/miso +64 -0
- data/lib/miso/commands.rb +45 -0
- data/lib/miso/loader.rb +13 -0
- data/lib/miso/rewrite.rb +30 -0
- data/lib/miso/static.rb +39 -0
- data/lib/miso/version.rb +5 -0
- data/lib/miso.rb +6 -0
- data/misosoup.gemspec +28 -0
- data/spec/404.html +1 -0
- data/spec/config.ru +5 -0
- data/spec/index.html +1 -0
- data/spec/loader_spec.rb +11 -0
- data/spec/rewrite_spec.rb +28 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/static_spec.rb +30 -0
- data/template/_app/miso/config.ru +19 -0
- data/template/_app/miso/miso.erb +17 -0
- data/template/_site/index.html +1 -0
- data/template/config.ru +18 -0
- metadata +99 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.2)
|
5
|
+
rack (1.2.1)
|
6
|
+
rake (0.8.7)
|
7
|
+
rspec (2.5.0)
|
8
|
+
rspec-core (~> 2.5.0)
|
9
|
+
rspec-expectations (~> 2.5.0)
|
10
|
+
rspec-mocks (~> 2.5.0)
|
11
|
+
rspec-core (2.5.1)
|
12
|
+
rspec-expectations (2.5.0)
|
13
|
+
diff-lcs (~> 1.1.2)
|
14
|
+
rspec-mocks (2.5.0)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
rack (~> 1.2.0)
|
21
|
+
rake
|
22
|
+
rspec (~> 2.5.0)
|
data/README
ADDED
data/Rakefile
ADDED
data/bin/miso
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'getoptlong'
|
4
|
+
|
5
|
+
require File.expand_path('../lib/miso/commands', File.dirname(__FILE__))
|
6
|
+
require File.expand_path('../lib/miso/version', File.dirname(__FILE__))
|
7
|
+
|
8
|
+
module Miso
|
9
|
+
class Cli
|
10
|
+
def self.usage
|
11
|
+
puts <<EOF
|
12
|
+
USAGE: #{File.basename($0)} [GLOBAL OPTIONS] <command> [COMMAND OPTIONS]
|
13
|
+
|
14
|
+
GLOBAL OPTIONS
|
15
|
+
--help, -h Display this message.
|
16
|
+
--version, -v Display version number.
|
17
|
+
|
18
|
+
COMMANDS
|
19
|
+
new <path> Create a new Miso project.
|
20
|
+
EOF
|
21
|
+
exit 0
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.version
|
25
|
+
puts "Miso #{Miso::VERSION}"
|
26
|
+
exit 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.parse_command_line
|
30
|
+
opts = GetoptLong.new(
|
31
|
+
['--help', '-h', GetoptLong::NO_ARGUMENT],
|
32
|
+
['--version', '-v', GetoptLong::NO_ARGUMENT]
|
33
|
+
)
|
34
|
+
options = {}
|
35
|
+
opts.each do |opt, arg|
|
36
|
+
case opt
|
37
|
+
when '--help'
|
38
|
+
usage
|
39
|
+
when '--version'
|
40
|
+
version
|
41
|
+
else
|
42
|
+
options[opt.sub(/^--/, '')] = arg
|
43
|
+
end
|
44
|
+
end
|
45
|
+
options
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.main(options)
|
49
|
+
command = ARGV.shift
|
50
|
+
command.nil? && usage
|
51
|
+
case command
|
52
|
+
when 'new'
|
53
|
+
Miso::Commands::New.new(ARGV[0], options).execute
|
54
|
+
else
|
55
|
+
usage
|
56
|
+
end
|
57
|
+
rescue StandardError => e
|
58
|
+
$stderr.puts "ERROR: #{e}"
|
59
|
+
usage
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
Miso::Cli.main(Miso::Cli.parse_command_line)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Miso
|
4
|
+
module Commands
|
5
|
+
class UsageError < RuntimeError; end
|
6
|
+
|
7
|
+
class New
|
8
|
+
def initialize(path, options = {})
|
9
|
+
path.nil? && (raise UsageError.new('path not specified'))
|
10
|
+
fail("#{path} already exists") if File.exist?(path)
|
11
|
+
@path = path
|
12
|
+
@options = options
|
13
|
+
end
|
14
|
+
|
15
|
+
def template_root
|
16
|
+
File.expand_path('../../template', File.dirname(__FILE__))
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy_template(src, dest)
|
20
|
+
FileUtils.cp(File.join(template_root, src), dest)
|
21
|
+
end
|
22
|
+
|
23
|
+
def copy_templates(templates)
|
24
|
+
templates.each { |src, dest| copy_template(src, dest) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def make_directories
|
28
|
+
%w[_app/miso _site].each do |dir|
|
29
|
+
FileUtils.mkdir_p(File.join(@path, dir))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def execute
|
34
|
+
make_directories
|
35
|
+
templates = {
|
36
|
+
'config.ru' => "#{@path}/config.ru",
|
37
|
+
'_app/miso/config.ru' => "#{@path}/_app/miso/config.ru",
|
38
|
+
'_app/miso/miso.erb' => "#{@path}/_app/miso/miso.erb",
|
39
|
+
'_site/index.html' => "#{@path}/_site/index.html"
|
40
|
+
}
|
41
|
+
copy_templates(templates)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/miso/loader.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Miso
|
2
|
+
# Load a Rack application from a config.ru file.
|
3
|
+
def load(app_path)
|
4
|
+
currentDir = Dir.getwd
|
5
|
+
Dir.chdir(currentDir+'/'+app_path)
|
6
|
+
rackup_code = ::File.read('config.ru')
|
7
|
+
app = eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app")
|
8
|
+
Dir.chdir(currentDir)
|
9
|
+
app
|
10
|
+
end
|
11
|
+
|
12
|
+
module_function :load
|
13
|
+
end
|
data/lib/miso/rewrite.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Miso
|
2
|
+
#Rack middleware that intercept request to the Rack application
|
3
|
+
#rewrite the path so that is seems to target the base URL.
|
4
|
+
class Rewrite
|
5
|
+
#Request env variable to rewrite.
|
6
|
+
@@REWRITE= ['REQUEST_PATH', 'PATH_INFO', 'REQUEST_URI']
|
7
|
+
|
8
|
+
#Receive the app and the option list (for now only the :app_path).
|
9
|
+
def initialize (app, option)
|
10
|
+
@app = app
|
11
|
+
@path = option[:app_path]
|
12
|
+
end
|
13
|
+
|
14
|
+
#Execute request.
|
15
|
+
def call(env)
|
16
|
+
rewritePath(env)
|
17
|
+
status, headers, response = @app.call(env)
|
18
|
+
[status, headers, response]
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
#Rewrite the path in the original request.
|
24
|
+
def rewritePath(env)
|
25
|
+
@@REWRITE.each do |key|
|
26
|
+
env[key] = env[key].gsub(@path, '')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/miso/static.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rack'
|
2
|
+
|
3
|
+
module Miso
|
4
|
+
#Rack application to handle static site.
|
5
|
+
class StaticSite
|
6
|
+
@@NOT_FOUND_PAGE = '404.html'
|
7
|
+
|
8
|
+
#Receives static site base path.
|
9
|
+
def initialize(static_site_path)
|
10
|
+
@root = static_site_path
|
11
|
+
@static_page_server = Rack::Directory.new(@root)
|
12
|
+
end
|
13
|
+
|
14
|
+
#Execute request.
|
15
|
+
def call(env)
|
16
|
+
path = Rack::Utils.unescape(env['PATH_INFO'])
|
17
|
+
not_found = false
|
18
|
+
|
19
|
+
#if / then route to index.html
|
20
|
+
if path == "/"
|
21
|
+
# Return the index
|
22
|
+
env['PATH_INFO']="/index.html"
|
23
|
+
path = path+'index.html'
|
24
|
+
end
|
25
|
+
|
26
|
+
#if page does not exists then route to 404.html
|
27
|
+
if !::File.exists?(@root+path) and ::File.exists?(@root+'/'+@@NOT_FOUND_PAGE)
|
28
|
+
env['PATH_INFO']=@@NOT_FOUND_PAGE
|
29
|
+
not_found = true
|
30
|
+
end
|
31
|
+
|
32
|
+
#call Directory to resolve
|
33
|
+
code, headers, body = @static_page_server.call(env)
|
34
|
+
|
35
|
+
#override to 404 if page not found
|
36
|
+
[not_found ? 404 : code, headers, body]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/miso/version.rb
ADDED
data/lib/miso.rb
ADDED
data/misosoup.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "miso/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "misosoup"
|
7
|
+
s.version = Miso::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Felix Trepanier"]
|
10
|
+
s.email = ["felixtrepanier@gmail.com"]
|
11
|
+
s.homepage = "http://side-experiment.com"
|
12
|
+
s.summary = %q{Rack application aggregator}
|
13
|
+
s.description = <<-EOF
|
14
|
+
MisoSoup is a Rack application which can server any number of sub-Rack applications
|
15
|
+
and a static web site.
|
16
|
+
EOF
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
s.add_dependency('rack', '~> 1.2.0')
|
24
|
+
|
25
|
+
# Test libraries
|
26
|
+
s.add_development_dependency('rspec', '2.5.0')
|
27
|
+
end
|
28
|
+
|
data/spec/404.html
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
404 Error! Notfound...
|
data/spec/config.ru
ADDED
data/spec/index.html
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
for test
|
data/spec/loader_spec.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Miso do
|
4
|
+
it 'should load config.ru' do
|
5
|
+
app = Miso.load 'spec'
|
6
|
+
code, headers, body = app.call({:dummy => 'dummy'})
|
7
|
+
code.should == 200
|
8
|
+
headers['Content-Type'].should == 'text/plain'
|
9
|
+
body.should == 'test'
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Miso::Rewrite do
|
4
|
+
before do
|
5
|
+
@initial_env = {'REQUEST_PATH' => '/spec/hello', 'PATH_INFO' => '/spec/hello', 'REQUEST_URI' => '/spec/hello'}
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should return app return value' do
|
9
|
+
mock_app = mock('mock_app')
|
10
|
+
mock_app.should_receive(:call).with(@initial_env).once.and_return([200, {'header' => 'value'}, 'body'])
|
11
|
+
app = Miso::Rewrite.new mock_app, :app_path => '/spec'
|
12
|
+
code, header, body = app.call(@initial_env)
|
13
|
+
code.should == 200
|
14
|
+
header['header'].should == 'value'
|
15
|
+
body.should == 'body'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should rewrite path' do
|
19
|
+
expected_env = {'REQUEST_PATH' => '/hello', 'PATH_INFO' => '/hello', 'REQUEST_URI' => '/hello'}
|
20
|
+
mock_app = mock('mock_app')
|
21
|
+
mock_app.should_receive(:call).with(expected_env).once.and_return([200, {'header' => 'value'}, 'body'])
|
22
|
+
app = Miso::Rewrite.new mock_app, :app_path => '/spec'
|
23
|
+
code, header, body = app.call(@initial_env)
|
24
|
+
code.should == 200
|
25
|
+
header['header'].should == 'value'
|
26
|
+
body.should == 'body'
|
27
|
+
end
|
28
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/static_spec.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Miso::StaticSite do
|
4
|
+
it 'should return serve files from directory' do
|
5
|
+
initial_env = {'PATH_INFO' => '/spec_helper.rb'}
|
6
|
+
app = Miso::StaticSite.new 'spec'
|
7
|
+
code, header, body = app.call(initial_env)
|
8
|
+
code.should == 200
|
9
|
+
body.instance_of? Rack::File
|
10
|
+
body.path.should match(/spec_helper.rb/)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should map / to index.html' do
|
14
|
+
initial_env = {'PATH_INFO' => '/'}
|
15
|
+
app = Miso::StaticSite.new 'spec'
|
16
|
+
code, header, body = app.call(initial_env)
|
17
|
+
code.should == 200
|
18
|
+
body.instance_of? Rack::File
|
19
|
+
body.path.should match(/index.html/)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should return 404.html is file do not exists' do
|
23
|
+
initial_env = {'PATH_INFO' => '/dummy.dumb'}
|
24
|
+
app = Miso::StaticSite.new 'spec'
|
25
|
+
code, header, body = app.call(initial_env)
|
26
|
+
code.should == 404
|
27
|
+
body.instance_of? Rack::File
|
28
|
+
body.path.should match(/404.html/)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'miso'
|
3
|
+
|
4
|
+
$miso_app_folder = ::File.expand_path(::File.dirname(__FILE__))+'/..'
|
5
|
+
$miso_app_dir_list = ::Dir[$miso_app_folder+'/*'].reject{|o| not ::File.directory?(o)}
|
6
|
+
$miso_version = Miso::VERSION
|
7
|
+
|
8
|
+
$miso_page = ''
|
9
|
+
::File.open("miso.erb", "r") do |infile|
|
10
|
+
infile.each do |line|
|
11
|
+
$miso_page<<line
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@app = lambda do |env|
|
16
|
+
[200, {'Content-Type'=>'text/html'}, ERB.new($miso_page).result]
|
17
|
+
end
|
18
|
+
|
19
|
+
run @app
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml\" xml:lang="en" lang="en-us">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
5
|
+
<title>miso</title>
|
6
|
+
<meta name="author" content="Felix Trepanier" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<center>
|
10
|
+
<h2>running on miso version <%= Miso::VERSION %></h2>
|
11
|
+
<h3>app running:</h3>
|
12
|
+
<% $miso_app_dir_list.each do |app_name|%>
|
13
|
+
<p><%= app_name.split('/')[-1] %></p>
|
14
|
+
<% end %>
|
15
|
+
</center>
|
16
|
+
</body>
|
17
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
hello world
|
data/template/config.ru
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'miso'
|
2
|
+
|
3
|
+
$MISO_STATIC_ROOT = "_site"
|
4
|
+
$MISO_APP_ROOT = "_app"
|
5
|
+
|
6
|
+
app_dir_list = ::Dir[$MISO_APP_ROOT+'/*'].reject{|o| not ::File.directory?(o)}
|
7
|
+
app_dir_list.each do |app_folder|
|
8
|
+
app = Miso.load app_folder
|
9
|
+
app_name = app_folder.split('/')[-1]
|
10
|
+
map '/'+app_name do
|
11
|
+
use Miso::Rewrite, {:app_path => '/'+app_folder}
|
12
|
+
run app
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
map '/' do
|
17
|
+
run Miso::StaticSite.new $MISO_STATIC_ROOT
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: misosoup
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Felix Trepanier
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-03-19 00:00:00.000000000 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rack
|
17
|
+
requirement: &78646370 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.2.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *78646370
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &78646120 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - =
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.5.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *78646120
|
37
|
+
description: ! 'MisoSoup is a Rack application which can server any number of sub-Rack
|
38
|
+
applications
|
39
|
+
|
40
|
+
and a static web site.
|
41
|
+
|
42
|
+
'
|
43
|
+
email:
|
44
|
+
- felixtrepanier@gmail.com
|
45
|
+
executables:
|
46
|
+
- miso
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- .gitignore
|
51
|
+
- Gemfile
|
52
|
+
- Gemfile.lock
|
53
|
+
- README
|
54
|
+
- Rakefile
|
55
|
+
- bin/miso
|
56
|
+
- lib/miso.rb
|
57
|
+
- lib/miso/commands.rb
|
58
|
+
- lib/miso/loader.rb
|
59
|
+
- lib/miso/rewrite.rb
|
60
|
+
- lib/miso/static.rb
|
61
|
+
- lib/miso/version.rb
|
62
|
+
- misosoup.gemspec
|
63
|
+
- spec/404.html
|
64
|
+
- spec/config.ru
|
65
|
+
- spec/index.html
|
66
|
+
- spec/loader_spec.rb
|
67
|
+
- spec/rewrite_spec.rb
|
68
|
+
- spec/spec_helper.rb
|
69
|
+
- spec/static_spec.rb
|
70
|
+
- template/_app/miso/config.ru
|
71
|
+
- template/_app/miso/miso.erb
|
72
|
+
- template/_site/index.html
|
73
|
+
- template/config.ru
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: http://side-experiment.com
|
76
|
+
licenses: []
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.6.2
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Rack application aggregator
|
99
|
+
test_files: []
|