smeagol 0.2.3 → 0.2.4

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/bin/smeagol CHANGED
@@ -6,78 +6,23 @@ require 'ostruct'
6
6
  require File.expand_path(File.dirname(__FILE__) + '/../lib/smeagol')
7
7
 
8
8
  # Parse options
9
- options = OpenStruct.new
10
- options.port = 4567
11
- options.auto_update = false
12
- options.cache_enabled = true
13
- opts = OptionParser.new do |opts|
14
- opts.banner = 'usage: smeagol [OPTIONS] [PATH]\n\n'
15
-
16
- opts.on('--port [PORT]', 'Bind port (default 4567).') do |port|
17
- options.port = port.to_i
18
- end
19
-
20
- opts.on('--git [GIT]', 'Path to Git binary.') do |path|
21
- options.git = path
22
- end
23
-
24
- opts.on('--autoupdate', 'Updates the repository on a daily basis.') do |flag|
25
- options.auto_update = flag
26
- end
27
-
28
- opts.on('--[no-]cache', 'Enables page caching.') do |flag|
29
- options.cache_enabled = flag
30
- end
31
-
32
- opts.on('-v', '--version', 'Display current version.') do
33
- puts "Smeagol #{Smeagol::VERSION}"
34
- exit 0
35
- end
36
- end
37
-
38
- # Read command line options into `options` hash
39
- begin
40
- opts.parse!
41
- rescue OptionParser::InvalidOption
42
- puts "smeagol: #{$!.message}"
43
- puts "smeagol: try 'smeagol --help' for more information"
44
- exit
45
- end
46
-
47
- # Attempt to find the git binary
48
- if options.git.nil?
49
- ['/usr/bin', '/usr/sbin', '/usr/local/bin', '/opt/local/bin'].each do |path|
50
- file = "#{path}/git"
51
- options.git = file if File.executable?(file)
52
- break if options.git
53
- end
54
- end
55
-
56
- # Alert user that updates are unavailable if git is not found
57
- if options.git.nil? || !File.executable?(options.git)
58
- puts "warning: git executable could not be found."
59
- else
60
- puts "git found: #{options.git}"
61
- end
62
-
63
- # Set the path to the Gollum repository
64
- gollum_path = ARGV[0] || Dir.pwd
9
+ options = Smeagol::OptionParser.parse(ARGV)
65
10
 
66
11
  # Run the auto update process
67
12
  if options.git && options.auto_update
68
13
  Thread.new do
69
14
  while true do
70
15
  sleep 86400
71
- Smeagol::Updater.update(options.git, gollum_path)
16
+ Smeagol::Updater.update(options.git, options.gollum_path)
72
17
  end
73
18
  end
74
19
  end
75
20
 
76
21
  # Clear the cache
77
- Smeagol::Cache.new(Gollum::Wiki.new(gollum_path)).clear()
22
+ Smeagol::Cache.new(Gollum::Wiki.new(options.gollum_path)).clear()
78
23
 
79
24
  # Run the web server
80
- Smeagol::App.set(:gollum_path, gollum_path)
25
+ Smeagol::App.set(:gollum_path, options.gollum_path)
81
26
  Smeagol::App.set(:git, options.git)
82
27
  Smeagol::App.set(:cache_enabled, options.cache_enabled)
83
28
  Smeagol::App.run!(:port => options.port)
data/lib/smeagol.rb CHANGED
@@ -4,6 +4,7 @@ require 'file'
4
4
  require 'smeagol/app'
5
5
  require 'smeagol/cache'
6
6
  require 'smeagol/hash'
7
+ require 'smeagol/option_parser'
7
8
  require 'smeagol/updater'
8
9
  require 'smeagol/wiki'
9
10
  require 'smeagol/version'
data/lib/smeagol/app.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'gollum'
2
+ require 'rack/file'
2
3
  require 'sinatra'
3
4
  require 'mustache'
4
5
  require 'tmpdir'
@@ -34,7 +35,9 @@ module Smeagol
34
35
  get '/*' do
35
36
  name = params[:splat].first
36
37
  name = "Home" if name == ""
38
+ name = name.gsub(/\/+$/, '')
37
39
  name = File.sanitize_path(name)
40
+ file_path = "#{settings.gollum_path}/#{name}"
38
41
 
39
42
  # Load the wiki settings
40
43
  wiki = Smeagol::Wiki.new(settings.gollum_path)
@@ -48,8 +51,12 @@ module Smeagol
48
51
  content = Mustache.render(page_template, Smeagol::Views::Page.new(page))
49
52
  cache.set_page(name, content) if settings.cache_enabled
50
53
  content
54
+ # If it is a directory, redirect to the index page
55
+ elsif File.directory?(file_path)
56
+ redirect "/#{name}/index.html"
51
57
  # If it is not a wiki page then try to find the file
52
58
  elsif file = wiki.file(name)
59
+ content_type get_mime_type(name)
53
60
  file.raw_data
54
61
  # Otherwise return a 404 error
55
62
  else
@@ -77,5 +84,19 @@ module Smeagol
77
84
  IO.read(File.join(File.dirname(__FILE__), 'templates/page.mustache'))
78
85
  end
79
86
  end
87
+
88
+ # Retrieves the mime type for a filename based on its extension.
89
+ #
90
+ # file - The filename.
91
+ #
92
+ # Returns the mime type for a file.
93
+ def get_mime_type(file)
94
+ if !file.nil?
95
+ extension = file.slice(file.rindex('.')..-1) if file.rindex('.')
96
+ return Rack::Mime::MIME_TYPES[extension] || 'text/plain'
97
+ end
98
+
99
+ return 'text/plain'
100
+ end
80
101
  end
81
102
  end
@@ -0,0 +1,123 @@
1
+ module Smeagol
2
+ class OptionParser
3
+ # Parses the command line options.
4
+ #
5
+ # args - The arguments to parse. Typically use `ARGV`.
6
+ #
7
+ # Returns an OpenStruct of the options.
8
+ def self.parse(args)
9
+ # Set parse options
10
+ options = {}
11
+ parser = ::OptionParser.new do |parser|
12
+ parser.banner = 'usage: smeagol [OPTIONS] [PATH]\n\n'
13
+
14
+ parser.on('--port [PORT]', 'Bind port (default 4567).') do |port|
15
+ options['port'] = port.to_i
16
+ end
17
+
18
+ parser.on('--git [GIT]', 'Path to Git binary.') do |path|
19
+ options['git'] = path
20
+ end
21
+
22
+ parser.on('-c', '--config [PATH]', 'Loads the config file. (default /etc/smeagol/config.yml)') do |path|
23
+ puts "Cannot find configuration file: #{path}" unless File.exists?(path)
24
+ puts "Cannot read configuration file: #{path}" unless File.readable?(path)
25
+ options['config_path'] = path
26
+ end
27
+
28
+ parser.on('--autoupdate', 'Updates the repository on a daily basis.') do |flag|
29
+ options['auto_update'] = flag
30
+ end
31
+
32
+ parser.on('--[no-]cache', 'Enables page caching.') do |flag|
33
+ options['cache_enabled'] = flag
34
+ end
35
+
36
+ parser.on('-v', '--version', 'Display current version.') do
37
+ puts "Smeagol #{Smeagol::VERSION}"
38
+ exit 0
39
+ end
40
+ end
41
+
42
+ # Read command line options into `options` hash
43
+ begin
44
+ parser.parse!
45
+ rescue ::OptionParser::InvalidOption
46
+ puts "smeagol: #{$!.message}"
47
+ puts "smeagol: try 'smeagol --help' for more information"
48
+ exit
49
+ end
50
+
51
+ # Load config
52
+ config_path = options['config_path'] || '/etc/smeagol/config.yml'
53
+ config = load_config(config_path)
54
+ opts = default_options.merge(config).merge(options)
55
+ opts = opts.to_ostruct()
56
+
57
+ # Attempt to find the git binary
58
+ update_git_path(opts)
59
+
60
+ # Set the path to the Gollum repository if not already set
61
+ opts.gollum_path ||= args[0] || Dir.pwd
62
+
63
+ # Merge all options
64
+ return opts
65
+ end
66
+
67
+
68
+ ###########################################################################
69
+ #
70
+ # Private Methods
71
+ #
72
+ ###########################################################################
73
+
74
+ private
75
+
76
+ # The default options for Smeagol.
77
+ def self.default_options
78
+ options = Hash.new
79
+ options['port'] = 4567
80
+ options['auto_update'] = false
81
+ options['cache_enabled'] = true
82
+ options
83
+ end
84
+
85
+ # Loads a configuration file.
86
+ #
87
+ # Returns a hash of options from the config file.
88
+ def self.load_config(path)
89
+ config = {}
90
+
91
+ if File.exists?(path)
92
+ # Notify the user if the config file exists but is not readable.
93
+ if !File.readable?(path)
94
+ puts "Config file not readable: #{path}"
95
+ exit
96
+ end
97
+
98
+ config = YAML.load(IO.read(path))
99
+ p config
100
+ end
101
+
102
+ return config
103
+ end
104
+
105
+ # Locates the git binary in common places in the file system.
106
+ def self.update_git_path(options)
107
+ if options.git.nil?
108
+ ['/usr/bin', '/usr/sbin', '/usr/local/bin', '/opt/local/bin'].each do |path|
109
+ file = "#{path}/git"
110
+ options.git = file if File.executable?(file)
111
+ break if options.git
112
+ end
113
+ end
114
+
115
+ # Alert user that updates are unavailable if git is not found
116
+ if options.git.nil? || !File.executable?(options.git)
117
+ puts "warning: git executable could not be found."
118
+ else
119
+ puts "git found: #{options.git}"
120
+ end
121
+ end
122
+ end
123
+ end
@@ -1,3 +1,3 @@
1
1
  module Smeagol
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smeagol
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 3
10
- version: 0.2.3
9
+ - 4
10
+ version: 0.2.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ben Johnson
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-24 00:00:00 -06:00
18
+ date: 2010-09-30 00:00:00 -06:00
19
19
  default_executable: smeagol
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -251,6 +251,7 @@ files:
251
251
  - lib/smeagol/app.rb
252
252
  - lib/smeagol/cache.rb
253
253
  - lib/smeagol/hash.rb
254
+ - lib/smeagol/option_parser.rb
254
255
  - lib/smeagol/public/smeagol/main.css
255
256
  - lib/smeagol/public/smeagol/pygment.css
256
257
  - lib/smeagol/templates/page.mustache