mongo_browser 0.2.0.rc2 → 0.2.5

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.
Files changed (141) hide show
  1. data/.gitignore +3 -1
  2. data/.rspec +1 -1
  3. data/.travis.yml +6 -1
  4. data/CHANGELOG.md +15 -0
  5. data/{grunt.js → Gruntfile.js} +10 -8
  6. data/Procfile +1 -0
  7. data/README.md +44 -2
  8. data/Rakefile +1 -12
  9. data/app/assets/images/ajax-loader.gif +0 -0
  10. data/app/assets/javascripts/app/controllers/{breadcrumbs.js.coffee → breadcrumbs_controller.js.coffee} +4 -7
  11. data/app/assets/javascripts/app/controllers/collections/index_controller.js.coffee +38 -0
  12. data/app/assets/javascripts/app/controllers/collections/stats_controller.js.coffee +17 -0
  13. data/app/assets/javascripts/app/controllers/{databases.js.coffee → databases/index_controller.js.coffee} +11 -15
  14. data/app/assets/javascripts/app/controllers/databases/stats_controller.js.coffee +15 -0
  15. data/app/assets/javascripts/app/controllers/documents/index_controller.js.coffee +54 -0
  16. data/app/assets/javascripts/app/controllers/documents/show_controller.js.coffee +38 -0
  17. data/app/assets/javascripts/app/controllers/main_controller.js.coffee +15 -0
  18. data/app/assets/javascripts/app/controllers/servers/show_controller.js.coffee +17 -0
  19. data/app/assets/javascripts/app/directives.js.coffee +23 -0
  20. data/app/assets/javascripts/app/filters.js.coffee +14 -1
  21. data/app/assets/javascripts/app/modules/alerts.js.coffee +58 -0
  22. data/app/assets/javascripts/app/modules/pager.js.coffee +2 -2
  23. data/app/assets/javascripts/app/modules/spinner.js.coffee +29 -0
  24. data/app/assets/javascripts/app/modules/table_filter.js.coffee +4 -4
  25. data/app/assets/javascripts/app/resources.js.coffee +14 -8
  26. data/app/assets/javascripts/app/services.js.coffee +11 -33
  27. data/app/assets/javascripts/application.js.coffee +62 -34
  28. data/app/assets/javascripts/application.test.js.coffee +5 -0
  29. data/app/assets/javascripts/compiled_templates.js.coffee +1 -0
  30. data/app/assets/javascripts/vendor.js.coffee +0 -1
  31. data/app/assets/stylesheets/application.css.scss +36 -18
  32. data/{public/index.html → app/views/index.erb} +8 -8
  33. data/bin/mongo_browser +2 -13
  34. data/config.ru +3 -1
  35. data/lib/mongo_browser.rb +1 -0
  36. data/lib/mongo_browser/api.rb +11 -0
  37. data/lib/mongo_browser/api/collections.rb +34 -0
  38. data/lib/mongo_browser/api/databases.rb +32 -0
  39. data/lib/mongo_browser/api/documents.rb +37 -0
  40. data/lib/mongo_browser/api/mongo.rb +41 -0
  41. data/lib/mongo_browser/application.rb +8 -174
  42. data/lib/mongo_browser/application/development.rb +32 -0
  43. data/lib/mongo_browser/cli.rb +48 -0
  44. data/lib/mongo_browser/entities.rb +43 -0
  45. data/lib/mongo_browser/models/collection.rb +7 -12
  46. data/lib/mongo_browser/models/document.rb +5 -1
  47. data/lib/mongo_browser/models/pager.rb +22 -9
  48. data/lib/mongo_browser/version.rb +1 -1
  49. data/mongo_browser.gemspec +22 -15
  50. data/package.json +30 -0
  51. data/public/ng/templates/alerts.html +6 -0
  52. data/public/ng/templates/collections/index.html +39 -0
  53. data/public/ng/templates/collections/stats.html +18 -0
  54. data/public/ng/templates/databases/index.html +35 -0
  55. data/public/ng/templates/databases/stats.html +18 -0
  56. data/public/ng/templates/documents/index.html +40 -0
  57. data/public/ng/templates/documents/show.html +17 -0
  58. data/{app/assets → public/ng}/templates/pager.html +0 -0
  59. data/{app/assets/templates/server_info.html → public/ng/templates/server/show.html} +1 -1
  60. data/{app/assets → public/ng}/templates/table_filter.html +0 -0
  61. data/script/ci_all +5 -1
  62. data/script/ci_e2e +5 -2
  63. data/script/ci_javascripts +1 -1
  64. data/script/ci_rspec +1 -1
  65. data/spec/javascripts/app/controllers/{breadcrumbs_spec.js.coffee → breadcrumbs_controller_spec.js.coffee} +1 -1
  66. data/spec/javascripts/app/controllers/collections/index_controller_spec.js.coffee +95 -0
  67. data/spec/javascripts/app/controllers/collections/stats_controller_spec.js.coffee +34 -0
  68. data/spec/javascripts/app/controllers/databases/index_controller_spec.js.coffee +93 -0
  69. data/spec/javascripts/app/controllers/databases/stats_controller_spec.js.coffee +30 -0
  70. data/spec/javascripts/app/controllers/documents/index_controller_spec.js.coffee +108 -0
  71. data/spec/javascripts/app/controllers/documents/show_controller_spec.js.coffee +94 -0
  72. data/spec/javascripts/app/controllers/{main_spec.js.coffee → main_controller_spec.js.coffee} +2 -2
  73. data/spec/javascripts/app/controllers/{server_info_spec.js.coffee → server/show_controller_spec.js.coffee} +5 -6
  74. data/spec/javascripts/app/directives_spec.js.coffee +108 -24
  75. data/spec/javascripts/app/filters_spec.js.coffee +31 -5
  76. data/spec/javascripts/app/modules/alerts_spec.js.coffee +138 -0
  77. data/spec/javascripts/app/modules/dialogs_spec.js.coffee +1 -2
  78. data/spec/javascripts/app/modules/pager_spec.js.coffee +0 -1
  79. data/spec/javascripts/app/modules/spinner_spec.js.coffee +65 -0
  80. data/spec/javascripts/app/modules/table_filter_spec.js.coffee +9 -9
  81. data/spec/javascripts/app/resources_spec.js.coffee +99 -0
  82. data/spec/javascripts/app/services_spec.js.coffee +31 -71
  83. data/spec/javascripts/config/{testacular-e2e.conf.js → karma-e2e.conf.js} +1 -1
  84. data/spec/javascripts/config/{testacular.conf.js → karma.conf.js} +2 -3
  85. data/spec/javascripts/e2e/collection_stats_scenario.js.coffee +12 -0
  86. data/spec/javascripts/e2e/collections_scenario.js.coffee +59 -20
  87. data/spec/javascripts/e2e/database_stats_scenario.js.coffee +11 -0
  88. data/spec/javascripts/e2e/databases_scenario.js.coffee +37 -36
  89. data/spec/javascripts/e2e/document_show_scenario.js.coffee +31 -0
  90. data/spec/javascripts/e2e/documents_pagination_scenario.js.coffee +33 -0
  91. data/spec/javascripts/e2e/documents_scenario.js.coffee +43 -4
  92. data/spec/javascripts/e2e/server_info_scenario.js.coffee +8 -2
  93. data/spec/javascripts/helpers/mocks.js.coffee +2 -0
  94. data/spec/javascripts/helpers_e2e/dsl.js.coffee +20 -0
  95. data/spec/javascripts/lib/angular-mocks.js +64 -16
  96. data/spec/javascripts/lib/angular-scenario.js +724 -561
  97. data/spec/javascripts/runner.html +5 -5
  98. data/spec/lib/api/collections_spec.rb +62 -0
  99. data/spec/lib/api/databases_spec.rb +58 -0
  100. data/spec/lib/api/documents_spec.rb +135 -0
  101. data/spec/lib/api/mongo_spec.rb +27 -0
  102. data/spec/lib/cli_spec.rb +19 -0
  103. data/spec/lib/entities_spec.rb +39 -0
  104. data/spec/lib/models/collection_spec.rb +16 -10
  105. data/spec/lib/models/database_spec.rb +4 -4
  106. data/spec/lib/models/document_spec.rb +5 -5
  107. data/spec/lib/models/pager_spec.rb +20 -11
  108. data/spec/spec_helper.rb +7 -15
  109. data/spec/support/api_example_group.rb +45 -0
  110. data/spec/support/fixtures.rb +10 -6
  111. data/spec/support/matchers/expose.rb +18 -0
  112. data/vendor/assets/javascripts/angular/angular-bootstrap.js +1 -1
  113. data/vendor/assets/javascripts/angular/angular-resource.js +78 -56
  114. data/vendor/assets/javascripts/angular/angular-sanitize.js +3 -1
  115. data/vendor/assets/javascripts/angular/angular.js +720 -404
  116. metadata +323 -183
  117. data/app/assets/javascripts/app.js.coffee +0 -8
  118. data/app/assets/javascripts/app/controllers.js.coffee +0 -2
  119. data/app/assets/javascripts/app/controllers/alerts.js.coffee +0 -12
  120. data/app/assets/javascripts/app/controllers/collections.js.coffee +0 -40
  121. data/app/assets/javascripts/app/controllers/documents.js.coffee +0 -49
  122. data/app/assets/javascripts/app/controllers/main.js.coffee +0 -10
  123. data/app/assets/javascripts/app/controllers/server_info.js.coffee +0 -14
  124. data/app/assets/javascripts/templates.js.coffee +0 -1
  125. data/app/assets/javascripts/templates/.gitkeep +0 -0
  126. data/app/assets/templates/collections.html +0 -53
  127. data/app/assets/templates/databases.html +0 -32
  128. data/app/assets/templates/documents.html +0 -45
  129. data/config-e2e.ru +0 -20
  130. data/spec/features/collections_list_spec.rb +0 -64
  131. data/spec/features/documents_list_spec.rb +0 -139
  132. data/spec/features/server_info_spec.rb +0 -23
  133. data/spec/javascripts/app/controllers/alerts_spec.js.coffee +0 -36
  134. data/spec/javascripts/app/controllers/collections_spec.js.coffee +0 -78
  135. data/spec/javascripts/app/controllers/databases_spec.js.coffee +0 -55
  136. data/spec/javascripts/app/controllers/documents_spec.js.coffee +0 -62
  137. data/spec/javascripts/helpers_e2e/app_element.js.coffee +0 -6
  138. data/spec/support/feature_example_group.rb +0 -53
  139. data/spec/support/matchers/have_flash_message.rb +0 -16
  140. data/spec/support/mongod.rb +0 -91
  141. data/spec/support/mongodb.conf +0 -47
@@ -4,11 +4,11 @@
4
4
  <title>Mongo Browser</title>
5
5
  <link href="/assets/application.css" rel="stylesheet" media="screen">
6
6
  </head>
7
- <body ng-controller="main">
7
+ <body ng-controller="main" ng-cloak>
8
8
  <div class="navbar navbar navbar-fixed-top">
9
9
  <div class="navbar-inner">
10
10
  <div class="container">
11
- <a class="brand" href="/">MongoBrowser</a>
11
+ <a class="brand" href="/">Mongo Browser</a>
12
12
  <div class="nav-collapse collapse">
13
13
  <ul ng-controller="breadcrumbs" class="nav breadcrumbs">
14
14
  <li ng-show="showDatabase()">
@@ -23,18 +23,15 @@
23
23
  <ul class="nav pull-right">
24
24
  <li><a href="/server_info">Server Info</a></li>
25
25
  <li><a>v. {{appVersion}}</a></li>
26
+ <li ng-show="showEnvironment()"><a>env {{environment}}</a></li>
27
+ <spinner></spinner>
26
28
  </ul>
27
29
  </div>
28
30
  </div>
29
31
  </div>
30
32
  </div>
31
33
 
32
- <aside ng-controller="alerts" id="alerts">
33
- <div ng-repeat="message in alertMessages" class="alert alert-{{message.type}}">
34
- <button ng-click="disposeAlert(message.id)" type="button" class="close">×</button>
35
- <strong>{{message.type}}</strong> <span>{{message.text}}</span>
36
- </div>
37
- </aside>
34
+ <alerts></alerts>
38
35
 
39
36
  <section class="container fluid">
40
37
  <section ng-view></section>
@@ -43,5 +40,8 @@
43
40
  <!--<link type="text/css" rel="stylesheet" href="//fonts.googleapis.com/css?family=Rokkitt:400,700|Source+Code+Pro">-->
44
41
  <script src="/assets/vendor.js"></script>
45
42
  <script src="/assets/application.js"></script>
43
+ <% if settings.test? %>
44
+ <script src="/assets/application.test.js"></script>
45
+ <% end %>
46
46
  </body>
47
47
  </html>
@@ -1,16 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "vegas"
4
- require "mongo_browser"
3
+ require "mongo_browser/cli"
5
4
 
6
- Vegas::Runner.new(MongoBrowser::Application, "mongo_browser") do |runner, opts, app|
7
- opts.on("--mongodb-port PORT", "Specify mongodb port") do |port|
8
- runner.logger.info "Using mongodb port #{port}"
9
- MongoBrowser.mongodb_port = port.to_i
10
- end
11
-
12
- opts.on("--mongodb-host HOST", "Specify mongodb host") do |host|
13
- runner.logger.info "Using mongodb host #{host}"
14
- MongoBrowser.mongodb_host = host.to_i
15
- end
16
- end
5
+ MongoBrowser::CLI.start(ARGV)
data/config.ru CHANGED
@@ -1,4 +1,6 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "lib"))
2
2
 
3
3
  require "mongo_browser"
4
- run MongoBrowser::Application
4
+ run Rack::URLMap.new \
5
+ "/" => MongoBrowser::Application.new,
6
+ "/api" => MongoBrowser::API::Mongo.new
@@ -28,3 +28,4 @@ require "mongo_browser/models/collection"
28
28
  require "mongo_browser/models/document"
29
29
 
30
30
  require "mongo_browser/application"
31
+ require "mongo_browser/api"
@@ -0,0 +1,11 @@
1
+ require "grape"
2
+ require "grape-entity"
3
+
4
+ require "mongo_browser/entities"
5
+ require "mongo_browser/api/documents"
6
+ require "mongo_browser/api/collections"
7
+ require "mongo_browser/api/databases"
8
+ require "mongo_browser/api/mongo"
9
+
10
+ module MongoBrowser::API
11
+ end
@@ -0,0 +1,34 @@
1
+ module MongoBrowser::API
2
+ class Collections < Grape::API
3
+
4
+ desc "Get a list of all collections for the given database"
5
+ get do
6
+ database = server.database(params[:db_name])
7
+ collections = database.collections
8
+ present collections, with: MongoBrowser::Entities::Collection
9
+ end
10
+
11
+ params do
12
+ requires :collection_name, type: String, desc: "Collection name"
13
+ end
14
+ segment "/:collection_name" do
15
+ desc "Get stats for a collection with the given name"
16
+ get "/stats" do
17
+ collection = server.database(params[:db_name]).collection(params[:collection_name])
18
+ collection.stats
19
+ end
20
+
21
+ desc "Drop a collection with the given name"
22
+ delete do
23
+ collection = server.database(params[:db_name]).collection(params[:collection_name])
24
+ collection.drop!
25
+ { success: true }
26
+ end
27
+
28
+ resources :documents do
29
+ mount MongoBrowser::API::Documents
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ module MongoBrowser::API
2
+ class Databases < Grape::API
3
+
4
+ desc "Get a list of all databases for the current server"
5
+ get do
6
+ present server.databases, with: MongoBrowser::Entities::Database
7
+ end
8
+
9
+ params do
10
+ requires :db_name, type: String, desc: "Database name"
11
+ end
12
+ segment "/:db_name" do
13
+ desc "Deletes a database with the given name"
14
+ delete do
15
+ database = server.database(params[:db_name])
16
+ database.drop!
17
+ { success: true }
18
+ end
19
+
20
+ desc "Get stats for the given database"
21
+ get "/stats" do
22
+ database = server.database(params[:db_name])
23
+ database.stats
24
+ end
25
+
26
+ resources :collections do
27
+ mount MongoBrowser::API::Collections
28
+ end
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,37 @@
1
+ module MongoBrowser::API
2
+ class Documents < Grape::API
3
+
4
+ desc "Get a list of paginated documents"
5
+ params do
6
+ optional :page, type: Integer, desc: "Page number"
7
+ end
8
+ get do
9
+ collection = server.database(params[:db_name]).collection(params[:collection_name])
10
+ documents = collection.documents_with_pagination(params[:page])
11
+ present documents, with: MongoBrowser::Entities::PagedDocuments
12
+ end
13
+
14
+ params do
15
+ requires :id, type: String, desc: "Document id"
16
+ end
17
+ segment "/:id" do
18
+ desc "Get a document"
19
+ get do
20
+ collection = server.database(params[:db_name]).collection(params[:collection_name])
21
+ document = collection.find(params[:id])
22
+
23
+ error!("Document not found", 404) if document.nil?
24
+ present document, with: MongoBrowser::Entities::Document
25
+ end
26
+
27
+ desc "Deletes a document with the given id"
28
+ delete do
29
+ collection = server.database(params[:db_name]).collection(params[:collection_name])
30
+ document = collection.find(params[:id])
31
+ collection.remove!(document)
32
+ { success: true }
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,41 @@
1
+ module MongoBrowser::API
2
+ class Mongo < Grape::API
3
+ format :json
4
+ rescue_from :all, backtrace: true
5
+
6
+ before do
7
+ method = env["REQUEST_METHOD"]
8
+ path = env["PATH_INFO"]
9
+
10
+ logger.info "[api] #{method} #{path}"
11
+ end
12
+
13
+ helpers do
14
+ def server
15
+ @server ||= MongoBrowser::Models::Server.current
16
+ end
17
+
18
+ def logger
19
+ Grape::API.logger
20
+ end
21
+ end
22
+
23
+ resource :databases do
24
+ mount MongoBrowser::API::Databases
25
+ end
26
+
27
+ desc "Returns info about the server"
28
+ get "/server_info" do
29
+ server.info
30
+ end
31
+
32
+ desc "Returns application version"
33
+ get "/version" do
34
+ {
35
+ version: MongoBrowser::VERSION,
36
+ environment: ENV["RACK_ENV"]
37
+ }
38
+ end
39
+
40
+ end
41
+ end
@@ -1,6 +1,6 @@
1
1
  require "sinatra"
2
2
  require "sinatra/reloader"
3
- require "sinatra/respond_with"
3
+ require "sinatra/json"
4
4
 
5
5
  require "sprockets"
6
6
  require "sass"
@@ -10,189 +10,23 @@ require "mongo_browser/middleware/sprockets_sinatra"
10
10
 
11
11
  module MongoBrowser
12
12
  class Application < Sinatra::Base
13
- include Models
14
-
15
- configure :development do
16
- register Sinatra::Reloader
17
- end
18
-
19
- enable :sessions
20
-
13
+ set :logging, true
21
14
  set :root, File.join(File.dirname(__FILE__), "../../app")
22
- set :public_folder, File.join(settings.root, "../public")
23
-
24
- set :method_override, true
25
-
26
- register Sinatra::RespondWith
15
+ set :public_folder, Proc.new { File.join(root, "../public") }
27
16
 
28
17
  use Middleware::SprocketsSinatra, :root => File.join(settings.root, "..")
29
18
 
30
- if settings.test?
31
- require File.join(settings.root, "../spec/support/fixtures")
32
-
19
+ if settings.development? or settings.test?
33
20
  require "mongo_browser/middleware/sprockets_specs"
34
21
  use Middleware::SprocketsSpecs, :root => File.join(settings.root, "..")
35
22
 
36
- get "/jasmine" do
37
- File.read(File.join(settings.root, "../spec/javascripts/runner.html"))
38
- end
39
-
40
- # Execute e2e runner
41
- get "/e2e" do
42
- File.read(File.join(settings.root, "../spec/javascripts/runner_e2e.html"))
43
- end
44
-
45
- # Load database fixtures
46
- get "/e2e/load_fixtures" do
47
- Fixtures.instance.load!
48
-
49
- respond_to do |format|
50
- format.json { true }
51
- end
52
- end
53
- end
54
-
55
- # Loads given template from assets/templates directory
56
- get "/ng/templates/:name.html" do |template_name|
57
- send_file File.join(settings.root, "assets/templates/#{template_name}.html")
23
+ require "mongo_browser/application/development"
24
+ register Development
58
25
  end
59
26
 
60
27
  # Welcome page
61
- # All routes without `/api` prefix
62
- get /^(?!\/api).+/ do
63
- File.read(File.join(settings.public_folder, "index.html"))
64
- end
65
-
66
- # Databases list
67
- get "/api/databases.json" do
68
- databases = server.databases.map do |db|
69
- {
70
- id: db.id,
71
- name: db.name,
72
- size: db.size,
73
- count: db.count
74
- }
75
- end
76
-
77
- respond_to do |format|
78
- format.json { databases.to_json }
79
- end
80
- end
81
-
82
- # Delete a database
83
- delete "/api/databases.json" do
84
- database = server.database(params[:id])
85
- database.drop!
86
-
87
- respond_to do |format|
88
- format.json { true }
89
- end
90
- end
91
-
92
- # Database stats
93
- get "/api/databases/:db_name/stats.json" do |db_name|
94
- database = server.database(db_name)
95
-
96
- respond_to do |format|
97
- format.json { database.stats.to_json }
98
- end
99
- end
100
-
101
- # Collections list
102
- get "/api/databases/:db_name/collections.json" do |db_name|
103
- database = server.database(db_name)
104
- collections = database.collections.map do |collection|
105
- {
106
- dbName: collection.db_name,
107
- name: collection.name,
108
- size: collection.size
109
- }
110
- end
111
-
112
- respond_to do |format|
113
- format.json { collections.to_json }
114
- end
115
- end
116
-
117
- # Delete a collection
118
- delete "/api/databases/:db_name/collections.json" do |db_name|
119
- success = begin
120
- collection = server.database(db_name).collection(params[:id])
121
- collection.drop!
122
- true
123
- rescue Mongo::OperationFailure => e
124
- false
125
- end
126
-
127
- respond_to do |format|
128
- format.json { success }
129
- end
130
- end
131
-
132
- # Collection stats
133
- get "/api/databases/:db_name/collections/:collection_name/stats.json" do |db_name, collection_name|
134
- collection = server.database(db_name).collection(collection_name)
135
-
136
- respond_to do |format|
137
- format.json { collection.stats.to_json }
138
- end
139
- end
140
-
141
- # Documents list
142
- get "/api/databases/:db_name/collections/:collection_name/documents.json" do |db_name, collection_name|
143
- collection = server.database(db_name).collection(collection_name)
144
- documents, pagination = collection.documents_with_pagination(params[:page])
145
-
146
- documents.map! do |doc|
147
- {
148
- id: doc.id.to_s,
149
- data: doc.data
150
- }
151
- end
152
-
153
- respond_to do |format|
154
- format.json do
155
- {
156
- documents: documents,
157
- size: pagination.size,
158
- page: pagination.current_page,
159
- totalPages: pagination.total_pages
160
- }.to_json
161
- end
162
- end
163
- end
164
-
165
- # Delete a document
166
- delete "/api/databases/:db_name/collections/:collection_name/documents.json" do |db_name, collection_name|
167
- collection = server.database(db_name).collection(collection_name)
168
- document = collection.find(params[:id])
169
- collection.remove!(document)
170
-
171
- respond_to do |format|
172
- format.json { true }
173
- end
174
- end
175
-
176
- get "/api/server_info.json" do
177
- server_info = server.info
178
-
179
- respond_to do |format|
180
- format.json { server_info.to_json }
181
- end
182
- end
183
-
184
- get "/api/version.json" do
185
- respond_to do |format|
186
- format.json do
187
- { version: MongoBrowser::VERSION }.to_json
188
- end
189
- end
190
- end
191
-
192
- private
193
-
194
- def server
195
- @server ||= Server.current
28
+ get "/*" do
29
+ erb :index
196
30
  end
197
31
  end
198
32
  end
@@ -0,0 +1,32 @@
1
+ class MongoBrowser::Application
2
+ module Development
3
+ def self.registered(app)
4
+ app.helpers Sinatra::JSON
5
+
6
+ app.register Sinatra::Reloader
7
+
8
+ app.set :spec_root, File.join(app.settings.root, "../spec")
9
+
10
+ # Execute jasmine runner
11
+ app.get "/jasmine" do
12
+ File.read(File.join(app.settings.spec_root, "javascripts/runner.html"))
13
+ end
14
+
15
+ # Execute e2e runner
16
+ app.get "/e2e" do
17
+ File.read(File.join(app.settings.spec_root, "javascripts/runner_e2e.html"))
18
+ end
19
+
20
+ # Load database fixtures
21
+ app.get "/e2e/load_fixtures" do
22
+ require File.join(app.settings.spec_root, "support/fixtures")
23
+ fixtures = Fixtures.instance
24
+
25
+ fixtures.load!
26
+ fixtures.load_documents!
27
+
28
+ json success: true
29
+ end
30
+ end
31
+ end
32
+ end