bowtie-io 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5360d7e0e671fa845bddcfe5a6cda678b8dcfb01
4
+ data.tar.gz: bad2df10cd7c15a48acc6623a413f5cdc74a7a78
5
+ SHA512:
6
+ metadata.gz: 23e077ba6c186549ac386df5e73bbb5453ed3505eb03e489f7011654ca43af459af5089a2dadb3901b3879f5174f100cead1b499fb9d6aa8ca4064371f42053e
7
+ data.tar.gz: f6b491ba5338b2cbbb8da49ad0f9a432f84ed4b842c3ce33f7490aaffb953ab510f90438fa00ea1b12d1bdac6bffa200322f5caa9d504deae5172f14b0cc45e1
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # BowTie is based heavily on and utilizes the Jekyll blogging platform.
4
+ # (https://github.com/jekyll/jekyll)
5
+
6
+ STDOUT.sync = true
7
+
8
+ $:.unshift File.join(File.dirname(__FILE__), *%w{ .. lib })
9
+
10
+ require 'bowtie'
11
+ require 'mercenary'
12
+
13
+ Mercenary.program(:bowtie) do |p|
14
+ p.version Bowtie::VERSION
15
+ p.description "bowtie is a Jekyll-based API frontend development tool"
16
+ p.syntax 'bowtie <subcommand> [options]'
17
+
18
+ jekyll_commands = Jekyll::Command.subclasses
19
+ jekyll_commands.delete Jekyll::Commands::Serve
20
+ jekyll_commands.delete Jekyll::Commands::New
21
+ jekyll_commands.delete Jekyll::Commands::Build
22
+
23
+ bowtie_commands = Bowtie::Command.subclasses
24
+
25
+ (jekyll_commands + bowtie_commands).each { |c| c.init_with_program(p) }
26
+
27
+ p.action do |args, options|
28
+ if args.empty?
29
+ Jekyll.logger.error "A subcommand is required"
30
+ puts p
31
+ else
32
+ unless p.has_command?(args.first)
33
+ Jekyll.logger.abort_with "Invalid command. Use --help for more information"
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ # vim: set syntax=ruby
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'json'
3
+ require 'jekyll'
4
+ require 'rack'
5
+ require 'rack/streaming_proxy'
6
+
7
+ module Bowtie
8
+ module Middleware
9
+ autoload :Proxy, 'bowtie/middleware/proxy'
10
+ autoload :Static, 'bowtie/middleware/static'
11
+ autoload :Rewrite, 'bowtie/middleware/rewrite'
12
+ end
13
+
14
+ autoload :Settings, 'bowtie/settings'
15
+ autoload :VERSION, 'bowtie/version'
16
+ end
17
+
18
+ require 'bowtie/command'
19
+ require 'bowtie/commands/serve'
@@ -0,0 +1,14 @@
1
+ module Bowtie
2
+ class Command
3
+ class << self
4
+ def subclasses
5
+ @subclasses ||= []
6
+ end
7
+
8
+ def inherited(base)
9
+ subclasses << base
10
+ super(base)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,57 @@
1
+ module Bowtie
2
+ module Commands
3
+ class Serve < Command
4
+ class << self
5
+ def init_with_program(prog)
6
+ command = Jekyll::Commands::Serve.init_with_program(prog)
7
+ command.description 'Development server'
8
+ command.actions.clear
9
+
10
+ command.action do |args, options|
11
+ options['serving'] = true
12
+ options['watch'] = true unless options.key?('watch')
13
+
14
+ Jekyll::Commands::Build.process(options)
15
+ Bowtie::Commands::Serve.process(options)
16
+ end
17
+ end
18
+
19
+ def process(options)
20
+ Rack::Server.start(app: application(options),
21
+ Port: options['port'] || 4000,
22
+ Host: options['host'],
23
+ daemonize: options['detach'])
24
+ end
25
+
26
+ private
27
+ def application(options)
28
+ options = Jekyll.configuration(options)
29
+
30
+ Rack::Builder.new do
31
+ use Rack::CommonLogger
32
+ use Rack::ShowExceptions
33
+ use Bowtie::Middleware::Rewrite, options
34
+
35
+ # User management provided by BowTie /users/*
36
+ map '/users' do
37
+ use Bowtie::Middleware::Proxy
38
+ end
39
+
40
+ # Bowtie APIs available at /bowtie/*
41
+ map '/bowtie' do
42
+ use Bowtie::Middleware::Proxy
43
+ end
44
+
45
+ # Static file server
46
+ use Bowtie::Middleware::Static, urls: [''],
47
+ root: options['destination'],
48
+ index: 'index.html'
49
+
50
+ # Backend API proxy through BowTie
51
+ run Bowtie::Middleware::Proxy.new(nil)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,15 @@
1
+ module Bowtie::Middleware
2
+ class Proxy < Rack::StreamingProxy::Proxy
3
+ def destination_uri(rack_request)
4
+ fqdn = Bowtie::Settings['project']['fqdn']['development']
5
+ base_url = "https://#{fqdn}"
6
+ path = rack_request.path
7
+
8
+ rack_request.env[:proxy_addon_headers] = {
9
+ 'X-Forwarded-Host' => fqdn
10
+ }
11
+
12
+ URI.join(base_url, path).to_s
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ # Rewrites header values referencing the fqdn to make redirects behave
2
+ # nicely without requiring overrides on the BowTie platform.
3
+
4
+ module Bowtie::Middleware
5
+ class Rewrite
6
+ def initialize(app, options)
7
+ @app = app
8
+ @remote_base_url = "https://#{Bowtie::Settings['project']['fqdn']['development']}"
9
+ @local_base_url = "http://#{options['host']}:#{options['port']}"
10
+ end
11
+
12
+ def call(env)
13
+ status, headers, response = @app.call(env)
14
+
15
+ headers.each do |k, v|
16
+ headers[k] = v.gsub(@remote_base_url, @local_base_url)
17
+ end
18
+
19
+ [status, headers, response]
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,35 @@
1
+ module Bowtie::Middleware
2
+ class Static
3
+ def initialize(app, options)
4
+ @app = app
5
+ @options = options
6
+ @rack_static = Rack::Static.new(app, options)
7
+ end
8
+
9
+ def call(env)
10
+ status, response, headers = @rack_static.call(env)
11
+ status = status.to_i
12
+
13
+ if status != 200 && !status.between?(300, 399)
14
+ status, response, headers = @app.call(env)
15
+ status = status.to_i
16
+
17
+ if status == 404
18
+ env['PATH_INFO'] = '/404.html'
19
+ elsif status == 403
20
+ env['PATH_INFO'] = '/403.html'
21
+ elsif status.between?(500, 599)
22
+ env['PATH_INFO'] = '/500.html'
23
+ elsif status.between?(400, 499)
24
+ env['PATH_INFO'] = '/400.html'
25
+ else
26
+ return [status, response, headers]
27
+ end
28
+
29
+ return @rack_static.call(env)
30
+ else
31
+ [status, response, headers]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ module Bowtie
2
+ class Settings
3
+ class << self
4
+ def [](key)
5
+ @settings ||= JSON.parse(File.read('settings.json'))
6
+ @settings[key]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module Bowtie
2
+ VERSION = '1.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bowtie-io
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - James Kassemi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.5'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bowtie-io-rack-streaming-proxy
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ description: Client interface to the BowTie frontend development service
56
+ email:
57
+ - james@seedworthy.com
58
+ executables:
59
+ - bowtie
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - bin/bowtie
64
+ - lib/bowtie.rb
65
+ - lib/bowtie/command.rb
66
+ - lib/bowtie/commands/serve.rb
67
+ - lib/bowtie/middleware/proxy.rb
68
+ - lib/bowtie/middleware/rewrite.rb
69
+ - lib/bowtie/middleware/static.rb
70
+ - lib/bowtie/settings.rb
71
+ - lib/bowtie/version.rb
72
+ homepage: https://bowtie.io
73
+ licenses:
74
+ - MIT
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.2.2
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Contains command line interface for interacting with BowTie Projects and
96
+ tools for local development
97
+ test_files: []