buzzard 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /pkg
2
+
data/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ Copyright (c) 2010, Thomas Lee
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in the
11
+ documentation and/or other materials provided with the distribution.
12
+ 3. All advertising materials mentioning features or use of this software
13
+ must display the following acknowledgement:
14
+ This product includes software developed by the <organization>.
15
+ 4. Neither the name of the <organization> nor the
16
+ names of its contributors may be used to endorse or promote products
17
+ derived from this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY
20
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
23
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require 'rubygems'
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gemspec|
4
+ gemspec.name = "buzzard"
5
+ gemspec.summary = "Sane web app microframework built on Sinatra."
6
+ gemspec.description = "Buzzard is a framework and application generator"
7
+ gemspec.email = "buzzard@tomlee.co"
8
+ gemspec.homepage = "http://github.com/thomaslee/buzzard"
9
+ gemspec.authors = ["Thomas Lee"]
10
+
11
+ gemspec.add_dependency('dbi', '>= 0.4.4')
12
+ gemspec.add_dependency('sinatra', '>= 1.1.0')
13
+ # gemspec.add_dependency('erubis', '>= 2.6.0')
14
+ gemspec.add_dependency('rack-flash', '>= 0.1.1')
15
+
16
+ gemspec.rubyforge_project = gemspec.name
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+
data/TODO ADDED
@@ -0,0 +1 @@
1
+ * How can we package templates in the gem?
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.1
data/bin/buzzard ADDED
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "erb"
4
+ require "fileutils"
5
+
6
+ include FileUtils
7
+
8
+ BUZZARDDIR = File.dirname(__FILE__)
9
+ TEMPLATEDIR = File.join(BUZZARDDIR, "..", "data")
10
+
11
+ def usage
12
+ puts "usage: #{ARGV[0]} appname [ModuleName]"
13
+ exit 1
14
+ end
15
+
16
+ def render_template(name, binding)
17
+ ERB.new(File.open(File.join(TEMPLATEDIR, "#{name}.erb")) { |f| f.read }).result(binding)
18
+ end
19
+
20
+ def main
21
+ appname = ARGV[0]
22
+ modname = ARGV[1]
23
+
24
+ dirname = appname + ".git"
25
+
26
+ usage if appname.nil? || appname.empty?
27
+ modname = appname.capitalize if modname.nil? || modname.empty?
28
+ modname.gsub!(/[-_]([a-z])/) { |s| s.gsub(/[-_]/, "").upcase }
29
+
30
+ #
31
+ # Build directory structure
32
+ #
33
+ ["app", "test", "views", "public/css", "public/js", "script"].each do |dir|
34
+ path = File.join(dirname, dir)
35
+ if !File.exists?(path)
36
+ mkdir_p path
37
+ end
38
+ end
39
+
40
+ #
41
+ # Generate skeleton files
42
+ #
43
+ [
44
+ ["app.rb", "#{appname}.rb"],
45
+ ["home.rb", "app/home.rb"],
46
+ ["app.css", "public/css/style.css"],
47
+ ["app.js", "public/js/#{appname}.js"],
48
+ ["helpers.rb", "app/helpers.rb"],
49
+ ["index.erb", "views/index.erb"],
50
+ ["layout.erb", "views/layout.erb"],
51
+ ["server.rb", "script/server"],
52
+ ["test_func.rb", "test/functional.rb"]
53
+ ].each do |source, target|
54
+ target_path = File.join(dirname, target)
55
+ if !File.exists?(target_path)
56
+ File.open(target_path, "w+b") do |stream|
57
+ stream.write(render_template(source, binding))
58
+ end
59
+ else
60
+ STDERR.puts "WARN: #{target_path} already exists: skipping."
61
+ end
62
+ end
63
+
64
+ #
65
+ # Mark scripts as executable
66
+ #
67
+ Dir.glob(File.join(dirname, "script", "*")).each do |filename|
68
+ chmod 0755, filename
69
+ end
70
+ end
71
+
72
+ main
73
+
data/buzzard.gemspec ADDED
@@ -0,0 +1,69 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{buzzard}
8
+ s.version = "0.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Thomas Lee"]
12
+ s.date = %q{2010-11-14}
13
+ s.default_executable = %q{buzzard}
14
+ s.description = %q{Buzzard is a framework and application generator}
15
+ s.email = %q{buzzard@tomlee.co}
16
+ s.executables = ["buzzard"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "TODO"
20
+ ]
21
+ s.files = [
22
+ ".gitignore",
23
+ "LICENSE",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "bin/buzzard",
27
+ "buzzard.gemspec",
28
+ "data/app.css.erb",
29
+ "data/app.js.erb",
30
+ "data/app.rb.erb",
31
+ "data/helpers.rb.erb",
32
+ "data/home.rb.erb",
33
+ "data/index.erb.erb",
34
+ "data/layout.erb.erb",
35
+ "data/server.rb.erb",
36
+ "data/test_func.rb.erb",
37
+ "lib/buzzard/dbi.rb",
38
+ "lib/buzzard/helpers.rb",
39
+ "lib/buzzard/json.rb",
40
+ "lib/buzzard/security.rb",
41
+ "lib/buzzard/session.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/thomaslee/buzzard}
44
+ s.rdoc_options = ["--charset=UTF-8"]
45
+ s.require_paths = ["lib"]
46
+ s.rubyforge_project = %q{buzzard}
47
+ s.rubygems_version = %q{1.3.7}
48
+ s.summary = %q{Sane web app microframework built on Sinatra.}
49
+
50
+ if s.respond_to? :specification_version then
51
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
+ s.specification_version = 3
53
+
54
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
+ s.add_runtime_dependency(%q<dbi>, [">= 0.4.4"])
56
+ s.add_runtime_dependency(%q<sinatra>, [">= 1.1.0"])
57
+ s.add_runtime_dependency(%q<rack-flash>, [">= 0.1.1"])
58
+ else
59
+ s.add_dependency(%q<dbi>, [">= 0.4.4"])
60
+ s.add_dependency(%q<sinatra>, [">= 1.1.0"])
61
+ s.add_dependency(%q<rack-flash>, [">= 0.1.1"])
62
+ end
63
+ else
64
+ s.add_dependency(%q<dbi>, [">= 0.4.4"])
65
+ s.add_dependency(%q<sinatra>, [">= 1.1.0"])
66
+ s.add_dependency(%q<rack-flash>, [">= 0.1.1"])
67
+ end
68
+ end
69
+
data/data/app.css.erb ADDED
@@ -0,0 +1,8 @@
1
+ html, body {
2
+ margin: 0;
3
+ padding: 0;
4
+ background: white;
5
+ font-size: 9pt;
6
+ font-family: Verdana, Arial, Sans-Serif;
7
+ }
8
+
data/data/app.js.erb ADDED
File without changes
data/data/app.rb.erb ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'sinatra/base'
5
+
6
+ require 'buzzard/dbi'
7
+ require 'buzzard/helpers'
8
+ require 'buzzard/json'
9
+ require 'buzzard/session'
10
+
11
+ require 'app/helpers'
12
+ require 'app/home'
13
+
14
+ module <%= modname %>
15
+ class Application < Sinatra::Base
16
+ include Buzzard::Helpers
17
+ include Buzzard::DBI
18
+ include Buzzard::JSON
19
+ include Buzzard::Session
20
+
21
+ set :public, 'public'
22
+ set :dbi_dsn, "DBI:Mysql:<%= appname %>"
23
+ set :dbi_username, "<%= appname %>"
24
+ set :dbi_password, "<%= appname %>"
25
+
26
+ helpers App::Helpers
27
+
28
+ register App::Home
29
+ end
30
+ end
31
+
@@ -0,0 +1,4 @@
1
+ module App
2
+ module Helpers
3
+ end
4
+ end
data/data/home.rb.erb ADDED
@@ -0,0 +1,10 @@
1
+ module App
2
+ module Home
3
+ def self.registered(app)
4
+ app.get("/") do
5
+ erb :index
6
+ end
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,4 @@
1
+ <h1>Success!</h1>
2
+
3
+ <p>If you're seeing this message, everything is ready to go!</p>
4
+
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= appname %> v1.0</title>
5
+ <link rel="stylesheet" href="/css/style.css">
6
+ <script type="text/javascript" src="/js/<%= appname %>.js"></script>
7
+ </head>
8
+ <body>
9
+ <%= "<%= yield %" + ">" %>
10
+ </body>
11
+ </html>
12
+
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.dirname(__FILE__), '..', '<%= appname %>.rb')
4
+
5
+ <%= modname %>::Application.run!
6
+
@@ -0,0 +1,20 @@
1
+ require "rubygems"
2
+ require "<%= appname %>"
3
+ require "test/unit"
4
+ require "rack/test"
5
+
6
+ module <%= modname %>
7
+ class ApplicationTest < Test::Unit::TestCase
8
+ include Rack::Test::Methods
9
+
10
+ def app
11
+ <%= modname %>::Application
12
+ end
13
+
14
+ def test_home_works
15
+ get "/"
16
+ assert last_response.ok?
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,115 @@
1
+ require 'dbi'
2
+
3
+ module Buzzard
4
+ module DBI
5
+ def with_db(&block)
6
+ dsn = settings.dbi_dsn
7
+ username = settings.dbi_username
8
+ password = settings.dbi_password
9
+
10
+ dbh = ::DBI.connect(dsn, username, password)
11
+ begin
12
+ return yield Wrapper.new(self, dbh)
13
+ ensure
14
+ dbh.disconnect
15
+ end
16
+ end
17
+
18
+ def with_sql(sql, *params, &block)
19
+ with_db do |db|
20
+ db.all(sql, *params, &block)
21
+ end
22
+ end
23
+
24
+ class Wrapper
25
+ def initialize(app, dbh)
26
+ @app = app
27
+ @dbh = dbh
28
+ end
29
+
30
+ def one(sql, *params)
31
+ sth = @dbh.prepare(sql)
32
+ res = nil
33
+ begin
34
+ sth.execute(*params)
35
+ row = sth.fetch
36
+ res = row.shift if row
37
+ ensure
38
+ sth.finish
39
+ end
40
+ res
41
+ end
42
+
43
+ def row(sql, *params)
44
+ sth = @dbh.prepare(sql)
45
+ res = nil
46
+ begin
47
+ sth.execute(*params)
48
+ res = sth.fetch_hash
49
+ ensure
50
+ sth.finish
51
+ end
52
+ _maybe_normalize(res)
53
+ end
54
+
55
+ def all(sql, *params, &block)
56
+ sth = @dbh.prepare(sql)
57
+ res = []
58
+ begin
59
+ sth.execute(*params)
60
+ while row=sth.fetch_hash do
61
+ if block
62
+ yield _maybe_normalize(row)
63
+ else
64
+ res << row
65
+ end
66
+ end
67
+ ensure
68
+ sth.finish
69
+ end
70
+ _maybe_normalize_all(res)
71
+ end
72
+
73
+ def exec(sql, *params)
74
+ @dbh.do(sql, *params)
75
+ end
76
+
77
+ def _symbolic_keys?
78
+ if @app.settings.respond_to?(:dbi_symbolic_keys)
79
+ @app.settings.dbi_symbolic_keys
80
+ else
81
+ true
82
+ end
83
+ end
84
+
85
+ def _maybe_normalize(hash)
86
+ _symbolic_keys? ? _normalize(hash) : hash
87
+ end
88
+
89
+ def _maybe_normalize_all(arr)
90
+ if _symbolic_keys?
91
+ r = []
92
+ arr.each_with_index do |hash, index|
93
+ r[index] = _normalize(hash)
94
+ end
95
+ r
96
+ else
97
+ arr
98
+ end
99
+ end
100
+
101
+ def _normalize(hash)
102
+ if !hash.nil? && hash.kind_of?(Hash)
103
+ r = {}
104
+ hash.each_pair do |key,value|
105
+ key = key.to_s if !key.kind_of?(Symbol)
106
+ key = key.to_sym if key.kind_of?(String)
107
+ r[key] = value
108
+ end
109
+ r
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+
@@ -0,0 +1,7 @@
1
+ module Buzzard
2
+ module Helpers
3
+ include Rack::Utils
4
+ alias_method :h, :escape_html
5
+ end
6
+ end
7
+
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'json'
3
+
4
+ module Buzzard
5
+ module JSON
6
+ def json(obj)
7
+ content_type "text/json"
8
+ ::JSON.generate(obj)
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,74 @@
1
+ #
2
+ # Simple security module providing login/logout
3
+ #
4
+ # Dependencies:
5
+ #
6
+ # * Buzzard::Session
7
+ # * Buzzard::DBI (optional)
8
+ #
9
+ module Buzzard
10
+ module Security
11
+ module Extension
12
+ def self.registered(app)
13
+ app.get("/login") do
14
+ redirect "/" if logged_in?
15
+
16
+ erb :login
17
+ end
18
+
19
+ app.post("/login") do
20
+ redirect "/" if logged_in?
21
+
22
+ user = authenticate(params[:username], params[:password])
23
+ if !user.nil?
24
+ session[:user] = user
25
+ redirect post_auth_url
26
+ else
27
+ flash[:errors] = ["Invalid username or password"]
28
+ redirect "/login"
29
+ end
30
+ end
31
+
32
+ app.get("/logout") do
33
+ redirect "/" if !logged_in?
34
+
35
+ session.delete(:user)
36
+ flash[:messages] = ["You have been logged out"]
37
+ redirect "/login"
38
+ end
39
+ end
40
+ end
41
+
42
+ def self.included(base)
43
+ base.register Extension
44
+ end
45
+
46
+ def current_user
47
+ session[:user]
48
+ end
49
+
50
+ def logged_in?
51
+ !session[:user].nil?
52
+ end
53
+
54
+ #
55
+ # Default implementation of login. Assumes use of Sinatra::DBI.
56
+ #
57
+ def authenticate(username, password)
58
+ with_db do |db|
59
+ db.row("
60
+ SELECT * FROM users
61
+ WHERE
62
+ (username=? OR email=?) AND
63
+ password=SHA(?)
64
+ ", username, username, password)
65
+ end
66
+ end
67
+
68
+ #
69
+ # The URL a user is sent to following a successful login.
70
+ #
71
+ def post_auth_url; "/"; end
72
+ end
73
+ end
74
+
@@ -0,0 +1,21 @@
1
+ require 'rack/flash'
2
+
3
+ module Buzzard
4
+ module Session
5
+ module Extension
6
+ def self.registered(app)
7
+ app.enable :sessions
8
+ app.use Rack::Flash
9
+ end
10
+ end
11
+
12
+ def self.included(base)
13
+ base.register Extension
14
+ end
15
+
16
+ def flash
17
+ env["x-rack.flash"]
18
+ end
19
+ end
20
+ end
21
+
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buzzard
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
11
+ platform: ruby
12
+ authors:
13
+ - Thomas Lee
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-14 00:00:00 +11:00
19
+ default_executable: buzzard
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: dbi
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 0
32
+ - 4
33
+ - 4
34
+ version: 0.4.4
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: sinatra
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 19
46
+ segments:
47
+ - 1
48
+ - 1
49
+ - 0
50
+ version: 1.1.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: rack-flash
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 25
62
+ segments:
63
+ - 0
64
+ - 1
65
+ - 1
66
+ version: 0.1.1
67
+ type: :runtime
68
+ version_requirements: *id003
69
+ description: Buzzard is a framework and application generator
70
+ email: buzzard@tomlee.co
71
+ executables:
72
+ - buzzard
73
+ extensions: []
74
+
75
+ extra_rdoc_files:
76
+ - LICENSE
77
+ - TODO
78
+ files:
79
+ - .gitignore
80
+ - LICENSE
81
+ - Rakefile
82
+ - VERSION
83
+ - bin/buzzard
84
+ - buzzard.gemspec
85
+ - data/app.css.erb
86
+ - data/app.js.erb
87
+ - data/app.rb.erb
88
+ - data/helpers.rb.erb
89
+ - data/home.rb.erb
90
+ - data/index.erb.erb
91
+ - data/layout.erb.erb
92
+ - data/server.rb.erb
93
+ - data/test_func.rb.erb
94
+ - lib/buzzard/dbi.rb
95
+ - lib/buzzard/helpers.rb
96
+ - lib/buzzard/json.rb
97
+ - lib/buzzard/security.rb
98
+ - lib/buzzard/session.rb
99
+ - TODO
100
+ has_rdoc: true
101
+ homepage: http://github.com/thomaslee/buzzard
102
+ licenses: []
103
+
104
+ post_install_message:
105
+ rdoc_options:
106
+ - --charset=UTF-8
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ hash: 3
115
+ segments:
116
+ - 0
117
+ version: "0"
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ hash: 3
124
+ segments:
125
+ - 0
126
+ version: "0"
127
+ requirements: []
128
+
129
+ rubyforge_project: buzzard
130
+ rubygems_version: 1.3.7
131
+ signing_key:
132
+ specification_version: 3
133
+ summary: Sane web app microframework built on Sinatra.
134
+ test_files: []
135
+