mongo_web 0.0.1 → 0.0.2
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/README.markdown +18 -6
- data/bin/mongo-web +6 -1
- data/lib/server.rb +124 -6
- data/lib/server/views/collection.haml +6 -12
- data/lib/server/views/database.haml +4 -10
- data/lib/server/views/document.haml +8 -0
- data/lib/server/views/layout.haml +13 -5
- data/lib/server/views/overview.haml +3 -2
- data/lib/server/views/stylesheet.sass +72 -44
- data/public/images/PoweredMongoDBblue50.png +0 -0
- metadata +30 -3
data/README.markdown
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
MongoWeb
|
|
2
2
|
========
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
MongoWeb is the stylish way of inspecting MongoDB databases.
|
|
5
5
|
|
|
6
6
|
Installing
|
|
7
7
|
----------
|
|
@@ -15,17 +15,29 @@ Starting MongoWeb is simple
|
|
|
15
15
|
|
|
16
16
|
$ mongo-web
|
|
17
17
|
|
|
18
|
-
You can also pass it a specific port
|
|
18
|
+
You can also pass it a specific port for the MongoWeb web server
|
|
19
19
|
|
|
20
20
|
$ mongo-web -p 6969
|
|
21
|
+
|
|
22
|
+
You can connect to remote databases as well
|
|
23
|
+
|
|
24
|
+
$ mongo-web [DATABASE CONNECTION STRING] --mongo-username USERNAME --mongo-password PASSWORD
|
|
25
|
+
|
|
26
|
+
Valid connection strings are
|
|
27
|
+
|
|
28
|
+
foo # equivalent to localhost:27017/foo
|
|
29
|
+
localhost/foo # equivalent to localhost:27017/foo
|
|
30
|
+
localhost:27018/foo
|
|
21
31
|
|
|
22
32
|
TODO
|
|
23
33
|
-----------
|
|
24
34
|
|
|
25
35
|
Support for:
|
|
36
|
+
|
|
26
37
|
* GridFS
|
|
27
38
|
* Editing Data
|
|
28
|
-
* Ports
|
|
29
|
-
* Usernames, passwords
|
|
30
39
|
|
|
31
|
-
|
|
40
|
+
Screenshot
|
|
41
|
+
-----------------
|
|
42
|
+
|
|
43
|
+

|
data/bin/mongo-web
CHANGED
data/lib/server.rb
CHANGED
|
@@ -2,17 +2,57 @@ require 'rubygems'
|
|
|
2
2
|
require 'sinatra'
|
|
3
3
|
require 'haml'
|
|
4
4
|
require 'mongo'
|
|
5
|
+
require 'yajl'
|
|
5
6
|
|
|
6
7
|
module MongoWeb
|
|
7
8
|
class Server < Sinatra::Base
|
|
9
|
+
DEFAULT_MONGO_HOST = "localhost"
|
|
10
|
+
DEFAULT_MONGO_PORT = 27017
|
|
11
|
+
MONGO_CONNECTION_SETUP = lambda { |r| r.app.set_mongo_connection_from_args(r.args.first) }
|
|
12
|
+
OPTIONS_SETUP = proc do |runner, opts, app|
|
|
13
|
+
opts.on('--mongo-username USERNAME', 'username for authentication against MongoDB database') do |mongo_username|
|
|
14
|
+
app.set(:mongo_username, mongo_username)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
opts.on('--mongo-password PASSWORD', 'password for authentication against MongoDB database') do |mongo_password|
|
|
18
|
+
app.set(:mongo_password, mongo_password)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
opts.banner = "Usage: #{$0 || app_name} [options] [database_connection_string]"
|
|
22
|
+
end
|
|
23
|
+
|
|
8
24
|
dir = File.dirname(File.expand_path(__FILE__))
|
|
9
25
|
set :views, "#{dir}/server/views"
|
|
26
|
+
set :public, "public"
|
|
10
27
|
set :static, true
|
|
11
28
|
set :haml, { :format => :html5 }
|
|
12
29
|
|
|
30
|
+
set :mongo, nil
|
|
31
|
+
set :mongo_username, nil
|
|
32
|
+
set :mongo_password, nil
|
|
33
|
+
set :mongo_database_name, nil
|
|
34
|
+
set :mongo_admin, false
|
|
35
|
+
|
|
36
|
+
def self.set_mongo_connection_from_args(connection_string)
|
|
37
|
+
host, port, database_name = connection_string.to_s.scan(/^(?:([^:]+?)(?::([^\/]+?))?\/)?(.+)$/).first
|
|
38
|
+
effective_host = host || DEFAULT_MONGO_HOST
|
|
39
|
+
effective_port = port || DEFAULT_MONGO_PORT
|
|
40
|
+
|
|
41
|
+
connection = Mongo::Connection.new(effective_host, effective_port)
|
|
42
|
+
set(:mongo, connection)
|
|
43
|
+
|
|
44
|
+
if database_name && self.mongo_username && self.mongo_password
|
|
45
|
+
database = mongo.db(database_name)
|
|
46
|
+
database.authenticate(self.mongo_username, self.mongo_password)
|
|
47
|
+
set(:mongo_database_name, database_name)
|
|
48
|
+
else
|
|
49
|
+
set(:mongo_admin, true)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
13
53
|
helpers do
|
|
14
54
|
def mongo
|
|
15
|
-
|
|
55
|
+
settings.mongo
|
|
16
56
|
end
|
|
17
57
|
|
|
18
58
|
def databases
|
|
@@ -20,30 +60,108 @@ module MongoWeb
|
|
|
20
60
|
end
|
|
21
61
|
|
|
22
62
|
def collections(database_name)
|
|
23
|
-
mongo.db(database_name).collections
|
|
63
|
+
collections = mongo.db(database_name).collections
|
|
64
|
+
unless settings.mongo_admin
|
|
65
|
+
collections.reject { |collection| collection.name.match(/^system\./) }
|
|
66
|
+
else
|
|
67
|
+
collections
|
|
68
|
+
end
|
|
24
69
|
end
|
|
25
70
|
|
|
26
71
|
def documents(database_name, collection_name)
|
|
27
72
|
mongo.db(database_name)[collection_name].find()
|
|
28
|
-
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def document(database_name, collection_name, id)
|
|
76
|
+
mongo.db(database_name)[collection_name].find_one({ '_id' => BSON::ObjectID.from_string(id) })
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def breadcrumbs
|
|
80
|
+
bc = []
|
|
81
|
+
|
|
82
|
+
if @database_name && @collection && @document
|
|
83
|
+
bc << %Q{<a href="/overview">databases</a>}
|
|
84
|
+
bc << %Q{<a href="/database/#{@database_name}">#{@database_name}</a>}
|
|
85
|
+
bc << %Q{<a href="/database/#{@database_name}/#{@collection}">#{@collection}</a>}
|
|
86
|
+
bc << @document_id
|
|
87
|
+
elsif @database_name && @collection
|
|
88
|
+
bc << %Q{<a href="/overview">databases</a>}
|
|
89
|
+
bc << %Q{<a href="/database/#{@database_name}">#{@database_name}</a>}
|
|
90
|
+
bc << @collection
|
|
91
|
+
elsif @database_name
|
|
92
|
+
bc << %Q{<a href="/overview">databases</a>}
|
|
93
|
+
bc << @database_name
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
bc
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def pretty_value(value)
|
|
100
|
+
case value
|
|
101
|
+
when String, Fixnum, BSON::ObjectID
|
|
102
|
+
value.to_s
|
|
103
|
+
when Hash, Array
|
|
104
|
+
"<pre>#{Yajl::Encoder.encode(value, :pretty => true)}</pre>"
|
|
105
|
+
else
|
|
106
|
+
value.inspect
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def truncate(text, length = 30, omission = '...')
|
|
111
|
+
return unless text
|
|
112
|
+
return text if text.length < length
|
|
113
|
+
|
|
114
|
+
out_text_length = (length / 2).floor
|
|
115
|
+
text.slice(0, out_text_length) + omission + text.slice(-out_text_length, out_text_length)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def hash_without(hash, *keys)
|
|
119
|
+
hash.inject({}) do |out, pair|
|
|
120
|
+
key, value = pair
|
|
121
|
+
next out if keys.include?(key)
|
|
122
|
+
|
|
123
|
+
out[key] = value
|
|
124
|
+
out
|
|
125
|
+
end
|
|
126
|
+
end
|
|
29
127
|
end
|
|
30
128
|
|
|
31
129
|
get '/' do
|
|
32
|
-
|
|
130
|
+
if settings.mongo_admin
|
|
131
|
+
redirect '/overview'
|
|
132
|
+
else
|
|
133
|
+
redirect "/database/#{settings.mongo_database_name}"
|
|
134
|
+
end
|
|
33
135
|
end
|
|
34
136
|
|
|
35
137
|
get '/overview' do
|
|
138
|
+
unless settings.mongo_admin
|
|
139
|
+
redirect "/database/#{settings.mongo_database_name}"
|
|
140
|
+
end
|
|
141
|
+
|
|
36
142
|
haml :overview
|
|
37
143
|
end
|
|
38
144
|
|
|
39
|
-
get '/database/:
|
|
145
|
+
get '/database/:database_name' do |database_name|
|
|
146
|
+
@database_name = database_name
|
|
40
147
|
haml :database
|
|
41
148
|
end
|
|
42
149
|
|
|
43
|
-
get '/database/:
|
|
150
|
+
get '/database/:database_name/:collection' do |database_name, collection|
|
|
151
|
+
@database_name = database_name
|
|
152
|
+
@collection = collection
|
|
44
153
|
haml :collection
|
|
45
154
|
end
|
|
46
155
|
|
|
156
|
+
get '/database/:database_name/:collection/:id' do |database_name, collection, id|
|
|
157
|
+
@database_name = database_name
|
|
158
|
+
@collection = collection
|
|
159
|
+
@document_id = id
|
|
160
|
+
|
|
161
|
+
@document = document(database_name, collection, id)
|
|
162
|
+
haml :document
|
|
163
|
+
end
|
|
164
|
+
|
|
47
165
|
get '/stylesheet.css' do
|
|
48
166
|
content_type 'text/css', :charset => 'utf-8'
|
|
49
167
|
sass :stylesheet
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
-name = params[:name]
|
|
2
|
-
-collection = params[:collection]
|
|
3
|
-
|
|
4
|
-
%h2 #{name} >> #{collection} >> documents
|
|
5
|
-
|
|
6
1
|
%table
|
|
7
2
|
%tr
|
|
8
|
-
%th
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
%h3 Values
|
|
12
|
-
-for document in documents(name, collection)
|
|
3
|
+
%th ID
|
|
4
|
+
%th Values
|
|
5
|
+
-for document in documents(@database_name, @collection)
|
|
13
6
|
%tr
|
|
14
|
-
%td
|
|
15
|
-
|
|
7
|
+
%td{ :class => 'monospace' }
|
|
8
|
+
%a{ :href => "/database/#{@database_name}/#{@collection}/#{document['_id']}" }= document['_id']
|
|
9
|
+
%td{ :class => 'monospace' }= truncate(hash_without(document, '_id').inspect, 80)
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
-name = params[:name]
|
|
2
|
-
|
|
3
|
-
%h2 #{name} >> collections
|
|
4
|
-
|
|
5
1
|
%table
|
|
6
2
|
%tr
|
|
7
|
-
%th
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
%h3 Size
|
|
11
|
-
-for collection in collections(name)
|
|
3
|
+
%th Name
|
|
4
|
+
%th Size
|
|
5
|
+
-for collection in collections(@database_name)
|
|
12
6
|
%tr
|
|
13
7
|
%td
|
|
14
|
-
%a{:href => "#{
|
|
8
|
+
%a{:href => "#{@database_name}/#{collection.name}"}= collection.name
|
|
15
9
|
%td= collection.size
|
|
@@ -4,8 +4,16 @@
|
|
|
4
4
|
%title MongoWeb
|
|
5
5
|
%link{ :href => '/stylesheet.css', :media => 'screen', :rel => 'stylesheet', :type => 'text/css'}
|
|
6
6
|
%body
|
|
7
|
-
#
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
#container
|
|
8
|
+
#header
|
|
9
|
+
%h1 MongoWeb
|
|
10
|
+
|
|
11
|
+
-unless breadcrumbs.empty?
|
|
12
|
+
%ul
|
|
13
|
+
-for breadcrumb in breadcrumbs
|
|
14
|
+
%li= breadcrumb
|
|
15
|
+
|
|
16
|
+
#content= yield
|
|
17
|
+
|
|
18
|
+
#footer
|
|
19
|
+
%img{ :src => '/images/PoweredMongoDBblue50.png' }
|
|
@@ -1,49 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
body
|
|
2
|
+
background-color= #CCC
|
|
3
|
+
font-family= Helvetica, Arial, sans-serif
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
text-decoration: none
|
|
8
|
-
color: black
|
|
9
|
-
font:
|
|
10
|
-
size: 1.2em
|
|
11
|
-
weight: 600
|
|
12
|
-
a:hover
|
|
13
|
-
text-decoration: underline
|
|
5
|
+
a
|
|
6
|
+
color= #000
|
|
14
7
|
|
|
15
|
-
|
|
16
|
-
background-color=
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
8
|
+
#container
|
|
9
|
+
background-color= #FFF
|
|
10
|
+
margin= 40px auto 0
|
|
11
|
+
width= 960px
|
|
12
|
+
-webkit-box-shadow= 0 0 5px rgba(0, 0, 0, .2)
|
|
13
|
+
-moz-box-shadow= 0 0 5px rgba(0, 0, 0, .2)
|
|
14
|
+
-webkit-border-radius= 5px
|
|
15
|
+
-moz-border-radius= 5px
|
|
21
16
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
17
|
+
#header
|
|
18
|
+
h1
|
|
19
|
+
font-size= 1.5em
|
|
20
|
+
background-color= #77BED2
|
|
21
|
+
margin= 0
|
|
22
|
+
padding= 7px 0 7px 15px
|
|
23
|
+
-webkit-border-top-left-radius= 5px
|
|
24
|
+
-webkit-border-top-right-radius= 5px
|
|
25
|
+
-moz-border-radius-topleft= 5px
|
|
26
|
+
-moz-border-radius-topright= 5px
|
|
27
|
+
|
|
28
|
+
ul
|
|
29
|
+
border-bottom= 1px solid #CCC
|
|
30
|
+
list-style= none
|
|
31
|
+
padding= 10px 0 10px 15px
|
|
32
|
+
margin= 0
|
|
33
|
+
overflow= auto
|
|
34
|
+
|
|
35
|
+
li
|
|
36
|
+
float= left
|
|
37
|
+
margin-right= 15px
|
|
38
|
+
text-transform= uppercase
|
|
39
|
+
|
|
40
|
+
&:after
|
|
41
|
+
:content '>>'
|
|
42
|
+
:padding-left 15px
|
|
43
|
+
|
|
44
|
+
&:last-child
|
|
45
|
+
:font-weight bold
|
|
46
|
+
|
|
47
|
+
&:after
|
|
48
|
+
:content ''
|
|
49
|
+
|
|
50
|
+
#content
|
|
51
|
+
padding= 5px 15px 15px 15px
|
|
52
|
+
|
|
39
53
|
table
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
54
|
+
border-collapse= collapse
|
|
55
|
+
width= 100%
|
|
56
|
+
text-align= left
|
|
57
|
+
|
|
58
|
+
th
|
|
59
|
+
padding= 10px
|
|
60
|
+
text-transform= uppercase
|
|
61
|
+
|
|
44
62
|
td
|
|
45
|
-
padding
|
|
46
|
-
border
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
63
|
+
padding= 10px
|
|
64
|
+
border= 1px solid black
|
|
65
|
+
vertical-align= top
|
|
66
|
+
|
|
67
|
+
td.monospace
|
|
68
|
+
font-family= monospace
|
|
69
|
+
|
|
70
|
+
td.key
|
|
71
|
+
font-weight= bold
|
|
72
|
+
|
|
73
|
+
#footer
|
|
74
|
+
margin= 0 auto 25px
|
|
75
|
+
padding-top= 10px
|
|
76
|
+
text-align= right
|
|
77
|
+
width= 960px
|
|
Binary file
|
metadata
CHANGED
|
@@ -5,16 +5,17 @@ version: !ruby/object:Gem::Version
|
|
|
5
5
|
segments:
|
|
6
6
|
- 0
|
|
7
7
|
- 0
|
|
8
|
-
-
|
|
9
|
-
version: 0.0.
|
|
8
|
+
- 2
|
|
9
|
+
version: 0.0.2
|
|
10
10
|
platform: ruby
|
|
11
11
|
authors:
|
|
12
12
|
- Ethan Gunderson
|
|
13
|
+
- Ryan Briones
|
|
13
14
|
autorequire:
|
|
14
15
|
bindir: bin
|
|
15
16
|
cert_chain: []
|
|
16
17
|
|
|
17
|
-
date: 2010-
|
|
18
|
+
date: 2010-06-03 00:00:00 -05:00
|
|
18
19
|
default_executable:
|
|
19
20
|
dependencies:
|
|
20
21
|
- !ruby/object:Gem::Dependency
|
|
@@ -57,6 +58,30 @@ dependencies:
|
|
|
57
58
|
version: 0.9.2
|
|
58
59
|
type: :runtime
|
|
59
60
|
version_requirements: *id003
|
|
61
|
+
- !ruby/object:Gem::Dependency
|
|
62
|
+
name: haml
|
|
63
|
+
prerelease: false
|
|
64
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
segments:
|
|
69
|
+
- 0
|
|
70
|
+
version: "0"
|
|
71
|
+
type: :runtime
|
|
72
|
+
version_requirements: *id004
|
|
73
|
+
- !ruby/object:Gem::Dependency
|
|
74
|
+
name: yajl-ruby
|
|
75
|
+
prerelease: false
|
|
76
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - ">="
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
segments:
|
|
81
|
+
- 0
|
|
82
|
+
version: "0"
|
|
83
|
+
type: :runtime
|
|
84
|
+
version_requirements: *id005
|
|
60
85
|
description: " Mongo_Web is a sinatra application for viewing MongoDB databases.\n \n If the code looks a lot like resque_web, that would be because I borrowed heavily from their implementation.\n"
|
|
61
86
|
email: ethan@ethangunderson.com
|
|
62
87
|
executables:
|
|
@@ -69,6 +94,7 @@ files:
|
|
|
69
94
|
- README.markdown
|
|
70
95
|
- lib/server/views/collection.haml
|
|
71
96
|
- lib/server/views/database.haml
|
|
97
|
+
- lib/server/views/document.haml
|
|
72
98
|
- lib/server/views/layout.haml
|
|
73
99
|
- lib/server/views/overview.haml
|
|
74
100
|
- lib/server/views/stylesheet.css
|
|
@@ -76,6 +102,7 @@ files:
|
|
|
76
102
|
- lib/server.rb
|
|
77
103
|
- bin/mongo-web
|
|
78
104
|
- spec/mongo_web_spec.rb
|
|
105
|
+
- public/images/PoweredMongoDBblue50.png
|
|
79
106
|
has_rdoc: true
|
|
80
107
|
homepage: http://github.com/ethangunderson/mongo_web
|
|
81
108
|
licenses: []
|