piano 0.10.4 → 0.10.6

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,2 +1,2 @@
1
1
  require 'bundler'
2
- Bundler::GemHelper.install_tasks
2
+ Bundler::GemHelper.install_tasks
data/bin/piano CHANGED
@@ -1,87 +1,62 @@
1
- #!/usr/bin/env ruby
2
- require "metafun/delegator"
3
-
4
- unless ARGV.empty?
5
-
6
- args = {}
7
-
8
- ARGV.each do |arg|
9
- if arg =~ /^\d+$/
10
- args[:port] = arg
11
- elsif arg =~ /^noetags$/
12
- args[:etags] = :off
13
- elsif arg =~ /^views:/
14
- matches = arg.match(/^views:(.+)$/)
15
- args[:views] = matches[1]
16
- elsif arg =~ /^public:/
17
- matches = arg.match(/^public:(.+)$/)
18
- args[:public] = matches[1]
19
- elsif arg =~ /^sample$/
20
- puts "Warning: the sample site folder files will be created in the current directory."
21
- puts "Any files with the same name will be overwritten."
22
- print "Do you want to continue? (Yn): "
23
- while answer = gets
24
- puts answer
25
- # if answer =~ /^Y/
26
- # puts "Building sample..."
27
- # make_sample
28
- # break
29
- # elsif answer =~ /^n/
30
- # puts "Exiting now"
31
- # Process.exit!
32
- # else
33
- # print "Couldn't understand the answer, please do it again (Yn): "
34
- # end
35
- end
36
- elsif arg =~ /^[a-z]+$/
37
- args[:environment] = arg.to_sym
38
- end
39
- end
40
-
41
- end
42
-
43
- require "piano"
44
-
45
- if args
46
- Piano::Base.port = args[:port] if args[:port]
47
- Piano::Base.environment = args[:environment] if args[:environment]
48
- Piano::Base.etags = args[:etags] if args[:etags]
49
- Piano::Base.views = File.expand_path(Dir.pwd) + "/" +args[:views] if args[:views]
50
- Piano::Base.public = File.expand_path(Dir.pwd) + "/" + args[:public] if args[:public]
51
- end
52
-
53
- def make_sample
54
- require "fileutils"
55
-
56
- source_dir = File.dirname(File.dirname(File.expand_path(__FILE__)))
57
-
58
- this_dir = File.expand_path(Dir.pwd)
59
-
60
- FileUtils.cp_r "#{source_dir}/sample", this_dir
61
- end
62
-
63
- self.extend Metafun::Delegator
64
- self.delegate Piano::Base, :get, :patch, :put, :post, :delete,
65
- :head, :options, :template, :layout,
66
- :before, :after, :error, :not_found,
67
- :configure, :set, :mime_type, :enable,
68
- :disable, :use, :development?, :test?,
69
- :production?, :helpers, :settings
70
-
71
- self.helpers Sinatra::Piano
72
-
73
- $LOAD_PATH << Dir.pwd
74
-
75
- if File.exists?(File.expand_path(Dir.pwd) + "/Pianofile")
76
- puts "Pianofile found, loading..."
77
- load File.expand_path(Dir.pwd) + "/Pianofile"
78
- end
79
-
80
- if File.exist?("controllers") && File.directory?("controllers")
81
- puts "'controllers' directory found, loading '.controller' files"
82
- Piano::ControllerLoader.folder "controllers"
83
- end
84
-
85
- require "piano/routes"
86
-
87
- Piano::Base.play!
1
+ #!/usr/bin/env ruby
2
+ require "piano"
3
+ require "metafun/delegator"
4
+
5
+ unless ARGV.empty?
6
+
7
+ args = {}
8
+
9
+ ARGV.each do |arg|
10
+ if arg =~ /^\d+$/
11
+ args[:port] = arg
12
+ elsif arg =~ /^noetags$/
13
+ args[:etags] = :off
14
+ elsif arg == "-v"
15
+ puts Piano::VERSION
16
+ Process.exit!
17
+ elsif arg =~ /^views:/
18
+ matches = arg.match(/^views:(.+)$/)
19
+ args[:views] = matches[1]
20
+ elsif arg =~ /^public:/
21
+ matches = arg.match(/^public:(.+)$/)
22
+ args[:public] = matches[1]
23
+ elsif arg =~ /^[a-z]+$/
24
+ args[:environment] = arg.to_sym
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ if args
31
+ Piano::Base.port = args[:port] if args[:port]
32
+ Piano::Base.environment = args[:environment] if args[:environment]
33
+ Piano::Base.etags = args[:etags] if args[:etags]
34
+ Piano::Base.views = File.expand_path(Dir.pwd) + "/" +args[:views] if args[:views]
35
+ Piano::Base.public = File.expand_path(Dir.pwd) + "/" + args[:public] if args[:public]
36
+ end
37
+
38
+ self.extend Metafun::Delegator
39
+ self.delegate Piano::Base, :get, :patch, :put, :post, :delete,
40
+ :head, :options, :template, :layout,
41
+ :before, :after, :error, :not_found,
42
+ :configure, :set, :mime_type, :enable,
43
+ :disable, :use, :development?, :test?,
44
+ :production?, :helpers, :settings
45
+
46
+ self.helpers Sinatra::Piano
47
+
48
+ $LOAD_PATH << Dir.pwd
49
+
50
+ if File.exists?(File.expand_path(Dir.pwd) + "/Pianofile")
51
+ puts "Pianofile found, loading..."
52
+ load File.expand_path(Dir.pwd) + "/Pianofile"
53
+ end
54
+
55
+ if File.exist?("controllers") && File.directory?("controllers")
56
+ puts "'controllers' directory found, loading '.controller' files"
57
+ Piano::ControllerLoader.folder "controllers"
58
+ end
59
+
60
+ require "piano/routes"
61
+
62
+ Piano::Base.play!
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+ require "metafun/delegator"
3
+
4
+ unless ARGV.empty?
5
+
6
+ args = {}
7
+
8
+ ARGV.each do |arg|
9
+ if arg =~ /^\d+$/
10
+ args[:port] = arg
11
+ elsif arg =~ /^noetags$/
12
+ args[:etags] = :off
13
+ elsif arg =~ /^views:/
14
+ matches = arg.match(/^views:(.+)$/)
15
+ args[:views] = matches[1]
16
+ elsif arg =~ /^public:/
17
+ matches = arg.match(/^public:(.+)$/)
18
+ args[:public] = matches[1]
19
+ elsif arg =~ /^sample$/
20
+ puts "Warning: the sample site folder files will be created in the current directory."
21
+ puts "Any files with the same name will be overwritten."
22
+ print "Do you want to continue? (Yn): "
23
+ while answer = gets
24
+ puts answer
25
+ # if answer =~ /^Y/
26
+ # puts "Building sample..."
27
+ # make_sample
28
+ # break
29
+ # elsif answer =~ /^n/
30
+ # puts "Exiting now"
31
+ # Process.exit!
32
+ # else
33
+ # print "Couldn't understand the answer, please do it again (Yn): "
34
+ # end
35
+ end
36
+ elsif arg =~ /^[a-z]+$/
37
+ args[:environment] = arg.to_sym
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ require "piano"
44
+
45
+ if args
46
+ Piano::Base.port = args[:port] if args[:port]
47
+ Piano::Base.environment = args[:environment] if args[:environment]
48
+ Piano::Base.etags = args[:etags] if args[:etags]
49
+ Piano::Base.views = File.expand_path(Dir.pwd) + "/" +args[:views] if args[:views]
50
+ Piano::Base.public = File.expand_path(Dir.pwd) + "/" + args[:public] if args[:public]
51
+ end
52
+
53
+ def make_sample
54
+ require "fileutils"
55
+
56
+ source_dir = File.dirname(File.dirname(File.expand_path(__FILE__)))
57
+
58
+ this_dir = File.expand_path(Dir.pwd)
59
+
60
+ FileUtils.cp_r "#{source_dir}/sample", this_dir
61
+ end
62
+
63
+ self.extend Metafun::Delegator
64
+ self.delegate Piano::Base, :get, :patch, :put, :post, :delete,
65
+ :head, :options, :template, :layout,
66
+ :before, :after, :error, :not_found,
67
+ :configure, :set, :mime_type, :enable,
68
+ :disable, :use, :development?, :test?,
69
+ :production?, :helpers, :settings
70
+
71
+ self.helpers Sinatra::Piano
72
+
73
+ $LOAD_PATH << Dir.pwd
74
+
75
+ if File.exists?(File.expand_path(Dir.pwd) + "/Pianofile")
76
+ puts "Pianofile found, loading..."
77
+ load File.expand_path(Dir.pwd) + "/Pianofile"
78
+ end
79
+
80
+ if File.exist? "controllers" && File.directory? "controllers"
81
+ puts "'controllers' directory found, loading '.controller' files"
82
+ Piano::ControllerLoader.folder "controllers"
83
+ end
84
+
85
+ require "piano/routes"
86
+
87
+ Piano::Base.play!
@@ -1,186 +1,46 @@
1
- require "sinatra/base"
2
- require "haml"
3
- require "sass"
4
- require "yaml"
5
- require "i18n"
6
-
7
- begin
8
- require "coffee-script"
9
- rescue Exception => error
10
- puts "No JavaScript environment was found. Please install therubyracer gem"
11
- puts " gem install therubyracer"
12
- Process.exit!
13
- end
14
-
15
- module Sinatra
16
-
17
- # Piano was originally though as a Sinatra extension
18
- # That's why the code was defined here
19
- module Piano
20
-
21
- # Like Sinatra's/Tilt's `haml`, but adds etags and
22
- # returns a 404 with some hints if the haml is not found
23
- def try_haml(template)
24
- file_name = "#{pwd}/#{template}.haml"
25
- bad_luck file_name unless File.exists? file_name
26
-
27
- if etags?
28
- hash = hash_for template, :haml
29
- hash += hash_for "data/#{template}", :yaml if File.exists? "#{pwd}/data/#{template}.yaml"
30
- etag hash
31
- end
32
- haml template.to_sym
33
- end
34
-
35
- # Loads and parses a `sass` template from the :views directory.
36
- # Adds an etag if `etags?` is enabled and returns 404 and hints
37
- # if it can't find the .sass file.
38
- def sass(template)
39
- file_name = "#{pwd}/#{template}.sass"
40
- bad_luck file_name unless File.exists? file_name
41
-
42
- etag hash_for(template, :sass) if etags?
43
- Sass.compile File.read(file_name), :syntax => :sass
44
- end
45
-
46
- # Loads and parses a `coffee-script` template from the :views
47
- # directory.
48
- # Adds an etag if `etags?` is enabled and returns 404 and hints
49
- # if it can't find the .coffee file.
50
- def coffee(template)
51
- file_name = "#{pwd}/#{template}.coffee"
52
- bad_luck file_name unless File.exists? file_name
53
-
54
- etag hash_for(template, :coffee) if etags?
55
- CoffeeScript.compile(File.read(file_name))
56
- end
57
-
58
- # Loads and parses the YAML data from the data directory
59
- def data_for(template)
60
- file_name = "#{settings.data}/#{template}.yaml"
61
- YAML.load_file(file_name) if File.exists?(file_name)
62
- end
63
-
64
- # Sugar: formats a css stylesheet <link /> tag with the input
65
- def style(path)
66
- "<link rel='stylesheet' type='text/css' href='#{path}' />"
67
- end
68
-
69
- # Sugar: formats a javascript <script> tag with the input
70
- def script(path)
71
- "<script type='text/javascript' src='#{path}'></script>"
72
- end
73
-
74
- # Returns the path to the :views directory
75
- def pwd
76
- settings.views
77
- end
78
-
79
- # Fails. Shouts a 404 response and prints hints
80
- #
81
- # If Piano is running in production mode, prints a plain 404 html
82
- # or, if a 404.haml exists in the :views directory, returns it
83
- def bad_luck(path)
84
- content_type :html
85
- if settings.environment == :production
86
- if File.exists? "#{pwd}/404.haml"
87
- @data = data_for "404"
88
- halt 404, haml(:"404")
89
- else
90
- halt 404, "<h1>404 - Not Found</h1><p>Piano has found nothing in this address</p>"
91
- end
92
- else
93
- halt 404, "<h1>You have still to put something here.</h1><p>This is <em>#{path}</em></p><blockquote>Good luck!</blockquote>"
94
- end
95
- end
96
-
97
- # Builds a hash for a file within the :views directory
98
- # Note: I feel like this functionality should be private
99
- def hash_for(name, type)
100
- "#{name}.#{type} - " + File.mtime("#{pwd}/#{name}.#{type}").to_s
101
- end
102
-
103
- # Makes an extract out of the given text with the default length
104
- # of 80 words
105
- #
106
- # If an integer is passed as the second argument, the length
107
- # of the result is adjusted properly:
108
- #
109
- # extract "Hello World! Too much text is inconvenient", 2
110
- #
111
- # returns
112
- #
113
- # => "Hello World!..."
114
- #
115
- def extract(text, length = 80)
116
- words = text.gsub(/<.+?>/, "").split
117
- return text if words.length <= length
118
- words[0..(length-1)].join(" ") + "..."
119
- end
120
-
121
- # Returns a url-friendly version of the given link, with a
122
- # default maximum of 5 words.
123
- # `link` strips any non-letter or special character, downcases the
124
- # string and replaces whitespace with "-"
125
- # For example:
126
- #
127
- # link "This is a special text! This won't be shown"
128
- #
129
- # returns
130
- #
131
- # => "this-is-a-special-text"
132
- #
133
- # You can specify a word length in the second argument.
134
- def link(text, length = 5)
135
- words = text.gsub(/<.+?>/, "").gsub(" ", "-").downcase.gsub(/[^a-z0-9\-]/, "").split("-")
136
- words[0..(length-1)].join("-")
137
- end
138
-
139
- # Shorthand to settings.etags == :on
140
- def etags?
141
- if settings.respond_to? :etags
142
- settings.etags == :on
143
- else
144
- true
145
- end
146
- end
147
-
148
- # Non implemented yet
149
- def t(key)
150
- I18n.translate key
151
- end
152
- end
153
-
154
- register Piano
155
- end
156
-
157
-
158
- module Piano
159
- class Base < Sinatra::Base
160
- register Sinatra::Piano
161
-
162
- set :root, File.expand_path(Dir.pwd)
163
- set :views, File.expand_path(Dir.pwd)
164
- set :data, File.expand_path(Dir.pwd + "/data")
165
- set :etags, :on
166
- set :i18n_path, File.expand_path(Dir.pwd) + "/config/locale"
167
-
168
- def self.i18n!
169
- return unless Dir.exists? self.i18n_path
170
- dir = Dir.new self.i18n_path
171
- i18n_files = []
172
- dir.each do |file|
173
- if file.end_with?(".yml") or file.end_with?(".yaml")
174
- i18n_files << "#{dir.path}/#{file}"
175
- end
176
- end
177
- I18n.load_path = i18n_files
178
- end
179
-
180
- def self.play!
181
- self.run!
182
- end
183
- end
184
- end
185
-
186
- require "piano/controllerloader"
1
+ require "sinatra/base"
2
+ require "haml"
3
+ require "sass"
4
+ require "yaml"
5
+ require "i18n"
6
+
7
+ begin
8
+ require "coffee-script"
9
+ rescue Exception => error
10
+ puts "No JavaScript environment was found. Please install therubyracer gem"
11
+ puts " gem install therubyracer"
12
+ Process.exit!
13
+ end
14
+
15
+ require "sinatra/piano"
16
+
17
+ module Piano
18
+ class Base < Sinatra::Base
19
+ register Sinatra::Piano
20
+
21
+ set :root, File.expand_path(Dir.pwd)
22
+ set :views, File.expand_path(Dir.pwd)
23
+ set :data, File.expand_path(Dir.pwd + "/data")
24
+ set :etags, :on
25
+ set :i18n_path, File.expand_path(Dir.pwd) + "/config/locale"
26
+
27
+ def self.i18n!
28
+ return unless Dir.exists? self.i18n_path
29
+ dir = Dir.new self.i18n_path
30
+ i18n_files = []
31
+ dir.each do |file|
32
+ if file.end_with?(".yml") or file.end_with?(".yaml")
33
+ i18n_files << "#{dir.path}/#{file}"
34
+ end
35
+ end
36
+ I18n.load_path = i18n_files
37
+ end
38
+
39
+ def self.play!
40
+ self.run!
41
+ end
42
+ end
43
+ end
44
+
45
+ require "piano/controllerloader"
46
+ require "piano/version"