adhoq 0.3.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +1 -1
  3. data/app/assets/javascripts/adhoq/current_tables.js +23 -0
  4. data/app/assets/javascripts/adhoq/previewer.js +52 -0
  5. data/app/controllers/adhoq/queries_controller.rb +1 -1
  6. data/app/models/adhoq/execution.rb +5 -3
  7. data/app/models/adhoq/time_based_orders.rb +1 -1
  8. data/app/views/adhoq/application/_global_nav.html.erb +18 -0
  9. data/app/views/adhoq/current_tables/index.html.erb +53 -0
  10. data/app/views/adhoq/explains/create.html.erb +1 -0
  11. data/app/views/adhoq/explains/statement_invalid.html.erb +5 -0
  12. data/app/views/adhoq/previews/create.html.erb +21 -0
  13. data/app/views/adhoq/previews/statement_invalid.html.erb +4 -0
  14. data/app/views/adhoq/queries/_current_tables_leftbar.html.erb +14 -0
  15. data/app/views/adhoq/queries/_execution.html.erb +10 -0
  16. data/app/views/adhoq/queries/_form.html.erb +124 -0
  17. data/app/views/adhoq/queries/_queries.html.erb +16 -0
  18. data/app/views/adhoq/queries/_query.html.erb +67 -0
  19. data/app/views/adhoq/queries/edit.html.erb +13 -0
  20. data/app/views/adhoq/queries/index.html.erb +15 -0
  21. data/app/views/adhoq/queries/new.html.erb +12 -0
  22. data/app/views/adhoq/queries/show.html.erb +14 -0
  23. data/app/views/layouts/adhoq/application.html.erb +18 -0
  24. data/config/database.yml +25 -0
  25. data/lib/adhoq/configuration.rb +1 -0
  26. data/lib/adhoq/engine.rb +1 -1
  27. data/lib/adhoq/executor/connection_wrapper.rb +12 -8
  28. data/lib/adhoq/global_variable.rb +1 -0
  29. data/lib/adhoq/storage.rb +1 -0
  30. data/lib/adhoq/storage/cache.rb +27 -0
  31. data/lib/adhoq/version.rb +1 -1
  32. data/spec/factories/adhoq_queries.rb +9 -9
  33. data/spec/models/adhoq/execution_spec.rb +18 -0
  34. metadata +44 -71
  35. data/app/assets/javascripts/adhoq/current_tables.js.coffee +0 -18
  36. data/app/assets/javascripts/adhoq/previewer.js.coffee +0 -34
  37. data/app/views/adhoq/application/_global_nav.html.slim +0 -12
  38. data/app/views/adhoq/current_tables/index.html.slim +0 -34
  39. data/app/views/adhoq/explains/create.html.slim +0 -2
  40. data/app/views/adhoq/explains/statement_invalid.html.slim +0 -5
  41. data/app/views/adhoq/previews/create.html.slim +0 -12
  42. data/app/views/adhoq/previews/statement_invalid.html.slim +0 -5
  43. data/app/views/adhoq/queries/_current_tables_leftbar.html.slim +0 -9
  44. data/app/views/adhoq/queries/_execution.html.slim +0 -10
  45. data/app/views/adhoq/queries/_form.html.slim +0 -93
  46. data/app/views/adhoq/queries/_queries.html.slim +0 -14
  47. data/app/views/adhoq/queries/_query.html.slim +0 -48
  48. data/app/views/adhoq/queries/edit.html.slim +0 -11
  49. data/app/views/adhoq/queries/index.html.slim +0 -11
  50. data/app/views/adhoq/queries/new.html.slim +0 -10
  51. data/app/views/adhoq/queries/show.html.slim +0 -11
  52. data/app/views/layouts/adhoq/application.html.slim +0 -15
@@ -0,0 +1,13 @@
1
+ <div class="col-md-12">
2
+ <ol class="breadcrumb">
3
+ <li><%= link_to 'Index', :queries %></li>
4
+ <li><%= link_to query_friendly_name(@query), @query %></li>
5
+ <li class="active"> Edit</li>
6
+ </ol>
7
+ </div>
8
+ <div class="col-md-12" id="main">
9
+ <section class="edit-query">
10
+ <%= render 'form', query: @query, title: "Edit query > #{query_friendly_name(@query)}" %>
11
+ </section>
12
+ </div>
13
+ <%= render 'current_tables_leftbar' %>
@@ -0,0 +1,15 @@
1
+ <div class="col-md-12">
2
+ <ol class="breadcrumb">
3
+ <li class="active">Index</li>
4
+ </ol>
5
+ </div>
6
+ <div class="col-md-3" id="queries">
7
+ <section class="queries">
8
+ <%= render 'queries', queries: @queries %>
9
+ </section>
10
+ </div>
11
+ <div class="col-md-9" id="the-query">
12
+ <% if first_query = @queries.first %>
13
+ <%= render 'query', query: first_query %>
14
+ <% end %>
15
+ </div>
@@ -0,0 +1,12 @@
1
+ <div class="col-md-12">
2
+ <ol class="breadcrumb">
3
+ <li><%= link_to 'Index', :queries %></li>
4
+ <li class="active"> New query</li>
5
+ </ol>
6
+ </div>
7
+ <div class="col-md-12" id="main">
8
+ <section class="new-query">
9
+ <%= render 'form', query: @query, title: 'New query' %>
10
+ </section>
11
+ </div>
12
+ <%= render 'current_tables_leftbar' %>
@@ -0,0 +1,14 @@
1
+ <div class="col-md-12">
2
+ <ol class="breadcrumb">
3
+ <li><%= link_to 'Index', :queries %></li>
4
+ <li class="active"><%= query_friendly_name(@query) %></li>
5
+ </ol>
6
+ </div>
7
+ <div class="col-md-3" id="queries">
8
+ <section class="queries">
9
+ <%= render 'queries', queries: ::Adhoq::Query.recent_first, highlight: @query %>
10
+ </section>
11
+ </div>
12
+ <div class="col-md-9" id="the-query">
13
+ <%= render 'query', query: @query %>
14
+ </div>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Adhoq</title>
5
+ <%= stylesheet_link_tag 'adhoq/application', media: 'all' %>
6
+ <%= javascript_include_tag 'adhoq/application' %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+ <div class="container">
11
+ <%= render 'global_nav' %>
12
+
13
+ <div class="row" id="contents">
14
+ <%= yield %>
15
+ </div>
16
+ </div>
17
+ </body>
18
+ </html>
@@ -0,0 +1,25 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3
3
+ #
4
+ # Ensure the SQLite 3 gem is defined in your Gemfile
5
+ # gem 'sqlite3'
6
+ #
7
+ default: &default
8
+ adapter: sqlite3
9
+ pool: 5
10
+ timeout: 5000
11
+
12
+ development:
13
+ <<: *default
14
+ database: db/development.sqlite3
15
+
16
+ # Warning: The database defined as "test" will be erased and
17
+ # re-generated from your development database when you run "rake".
18
+ # Do not set this db to the same as development or production.
19
+ test:
20
+ <<: *default
21
+ database: db/test.sqlite3
22
+
23
+ production:
24
+ <<: *default
25
+ database: db/production.sqlite3
@@ -18,6 +18,7 @@ module Adhoq
18
18
 
19
19
  config_accessor :database_connection
20
20
  config_accessor :hidden_model_names
21
+ config_accessor :hide_rows_count
21
22
 
22
23
  config_accessor :async_execution
23
24
  config_accessor :job_queue_name
@@ -1,8 +1,8 @@
1
1
  # TODO where to write?
2
2
  require 'font-awesome-sass'
3
3
  require 'jquery-rails'
4
- require 'slim-rails'
5
4
  require 'active_decorator'
5
+ require 'sassc-rails'
6
6
 
7
7
  module Adhoq
8
8
  class Engine < ::Rails::Engine
@@ -1,29 +1,33 @@
1
1
  module Adhoq
2
2
  class Executor
3
3
  class ConnectionWrapper
4
- attr_reader :connection
5
-
6
4
  def initialize
7
- @connection = Adhoq.config.callablize(:database_connection).call
8
5
  end
9
6
 
10
7
  def select(query)
11
- with_sandbox do
8
+ with_sandbox do |connection|
12
9
  connection.exec_query(query)
13
10
  end
14
11
  end
15
12
 
16
13
  def explain(query)
17
- with_sandbox do
14
+ with_sandbox do |connection|
18
15
  connection.explain(query)
19
16
  end
20
17
  end
21
18
 
19
+ def with_connection
20
+ connection = Adhoq.config.callablize(:database_connection).call
21
+ yield(connection)
22
+ end
23
+
22
24
  def with_sandbox
23
25
  result = nil
24
- connection.transaction do
25
- result = yield
26
- raise ActiveRecord::Rollback
26
+ with_connection do |connection|
27
+ connection.transaction do
28
+ result = yield(connection)
29
+ raise ActiveRecord::Rollback
30
+ end
27
31
  end
28
32
  result
29
33
  end
@@ -28,6 +28,7 @@ module Adhoq
28
28
  when :local_file then Adhoq::Storage::LocalFile
29
29
  when :s3 then Adhoq::Storage::S3
30
30
  when :on_the_fly then Adhoq::Storage::OnTheFly
31
+ when :cache then Adhoq::Storage::Cache
31
32
  else
32
33
  raise NotImplementedError
33
34
  end
@@ -4,6 +4,7 @@ module Adhoq
4
4
  autoload 'LocalFile', 'adhoq/storage/local_file'
5
5
  autoload 'S3', 'adhoq/storage/s3'
6
6
  autoload 'OnTheFly', 'adhoq/storage/on_the_fly'
7
+ autoload 'Cache', 'adhoq/storage/cache'
7
8
 
8
9
  def with_new_identifier(suffix = nil, seed = Time.now)
9
10
  dirname, fname_seed = ['%Y-%m-%d', '%H%M%S.%L'].map {|f| seed.strftime(f) }
@@ -0,0 +1,27 @@
1
+ module Adhoq
2
+ module Storage
3
+ class Cache
4
+ attr_reader :identifier
5
+
6
+ def initialize(cache, prefix = "", expire = 300)
7
+ @cache = cache
8
+ @identifier = @prefix = prefix
9
+ @expire = expire
10
+ end
11
+
12
+ def store(suffix = nil, seed = Time.now, &block)
13
+ Adhoq::Storage.with_new_identifier(suffix, seed) do |identifier|
14
+ @cache.write(@prefix + identifier, yield.read, expires_in: @expire)
15
+ end
16
+ end
17
+
18
+ def direct_download?
19
+ false
20
+ end
21
+
22
+ def get(identifier)
23
+ @cache.read(@prefix + identifier)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module Adhoq
2
- VERSION = "0.3.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -2,14 +2,14 @@
2
2
 
3
3
  FactoryBot.define do
4
4
  factory :adhoq_query, class: 'Adhoq::Query' do
5
- name 'A query'
6
- description 'Simple simple SELECT'
7
- query 'SELECT 1'
5
+ name { 'A query' }
6
+ description { 'Simple simple SELECT' }
7
+ query { 'SELECT 1' }
8
8
 
9
9
  trait :complex do
10
- name 'adhoq current use'
11
- description 'Simple analysys: count execution per query'
12
- query <<-SQL.strip_heredoc
10
+ name { 'adhoq current use' }
11
+ description { 'Simple analysys: count execution per query' }
12
+ query { <<-SQL.strip_heredoc }
13
13
  SELECT
14
14
  q.id
15
15
  ,q.name
@@ -27,9 +27,9 @@ FactoryBot.define do
27
27
  end
28
28
 
29
29
  trait :greeting do
30
- name 'greeting'
31
- description 'Static query for testing data'
32
- query 'SELECT "hello" AS name ,"English greeting message" AS description'
30
+ name { 'greeting' }
31
+ description { 'Static query for testing data' }
32
+ query { 'SELECT "hello" AS name ,"English greeting message" AS description' }
33
33
  end
34
34
  end
35
35
  end
@@ -21,5 +21,23 @@ module Adhoq
21
21
  # Accessable only once
22
22
  expect(execution.report.data).to be_nil
23
23
  end
24
+
25
+ describe '#generate_report!' do
26
+ subject { -> { execution.generate_report! } }
27
+
28
+ let(:execution) { Execution.new(query: query, raw_sql: query.query, report_format: 'csv') }
29
+
30
+ context 'when execute query successfully' do
31
+ let(:query) { create(:adhoq_query, query: 'SELECT name, description FROM adhoq_queries') }
32
+
33
+ it { is_expected.to change { execution.status.to_s }.to('success') }
34
+ end
35
+
36
+ context 'when execute query failed' do
37
+ let(:query) { create(:adhoq_query, query: 'INVALID SQL') }
38
+
39
+ it { is_expected.to change { execution.status.to_s }.to('failure') }
40
+ end
41
+ end
24
42
  end
25
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adhoq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyosuke MOROHASHI
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-08 00:00:00.000000000 Z
11
+ date: 2020-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,42 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
19
+ version: '5.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.0'
26
+ version: '5.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: axlsx
28
+ name: caxlsx
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: '3.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
41
- - !ruby/object:Gem::Dependency
42
- name: coffee-rails
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
40
+ version: '3.0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: fog-aws
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -82,34 +68,20 @@ dependencies:
82
68
  version: '0.3'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: font-awesome-sass
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: 4.2.0
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: 4.2.0
97
- - !ruby/object:Gem::Dependency
98
- name: jquery-rails
99
71
  requirement: !ruby/object:Gem::Requirement
100
72
  requirements:
101
73
  - - ">="
102
74
  - !ruby/object:Gem::Version
103
- version: '0'
75
+ version: '4.2'
104
76
  type: :runtime
105
77
  prerelease: false
106
78
  version_requirements: !ruby/object:Gem::Requirement
107
79
  requirements:
108
80
  - - ">="
109
81
  - !ruby/object:Gem::Version
110
- version: '0'
82
+ version: '4.2'
111
83
  - !ruby/object:Gem::Dependency
112
- name: sass-rails
84
+ name: jquery-rails
113
85
  requirement: !ruby/object:Gem::Requirement
114
86
  requirements:
115
87
  - - ">="
@@ -123,7 +95,7 @@ dependencies:
123
95
  - !ruby/object:Gem::Version
124
96
  version: '0'
125
97
  - !ruby/object:Gem::Dependency
126
- name: slim-rails
98
+ name: sassc-rails
127
99
  requirement: !ruby/object:Gem::Requirement
128
100
  requirements:
129
101
  - - ">="
@@ -196,16 +168,16 @@ dependencies:
196
168
  name: factory_bot_rails
197
169
  requirement: !ruby/object:Gem::Requirement
198
170
  requirements:
199
- - - ">="
171
+ - - "~>"
200
172
  - !ruby/object:Gem::Version
201
- version: '0'
173
+ version: 4.11.1
202
174
  type: :development
203
175
  prerelease: false
204
176
  version_requirements: !ruby/object:Gem::Requirement
205
177
  requirements:
206
- - - ">="
178
+ - - "~>"
207
179
  - !ruby/object:Gem::Version
208
- version: '0'
180
+ version: 4.11.1
209
181
  - !ruby/object:Gem::Dependency
210
182
  name: launchy
211
183
  requirement: !ruby/object:Gem::Requirement
@@ -282,14 +254,14 @@ dependencies:
282
254
  requirements:
283
255
  - - ">="
284
256
  - !ruby/object:Gem::Version
285
- version: '0'
257
+ version: '1.4'
286
258
  type: :development
287
259
  prerelease: false
288
260
  version_requirements: !ruby/object:Gem::Requirement
289
261
  requirements:
290
262
  - - ">="
291
263
  - !ruby/object:Gem::Version
292
- version: '0'
264
+ version: '1.4'
293
265
  - !ruby/object:Gem::Dependency
294
266
  name: tapp
295
267
  requirement: !ruby/object:Gem::Requirement
@@ -329,8 +301,8 @@ files:
329
301
  - app/assets/javascripts/adhoq/bootstrap/tab.js
330
302
  - app/assets/javascripts/adhoq/bootstrap/tooltip.js
331
303
  - app/assets/javascripts/adhoq/bootstrap/transition.js
332
- - app/assets/javascripts/adhoq/current_tables.js.coffee
333
- - app/assets/javascripts/adhoq/previewer.js.coffee
304
+ - app/assets/javascripts/adhoq/current_tables.js
305
+ - app/assets/javascripts/adhoq/previewer.js
334
306
  - app/assets/stylesheets/adhoq/_bootstrap-compass.scss
335
307
  - app/assets/stylesheets/adhoq/_bootstrap-mincer.scss
336
308
  - app/assets/stylesheets/adhoq/_bootstrap-sprockets.scss
@@ -422,22 +394,23 @@ files:
422
394
  - app/models/adhoq/query.rb
423
395
  - app/models/adhoq/report.rb
424
396
  - app/models/adhoq/time_based_orders.rb
425
- - app/views/adhoq/application/_global_nav.html.slim
426
- - app/views/adhoq/current_tables/index.html.slim
427
- - app/views/adhoq/explains/create.html.slim
428
- - app/views/adhoq/explains/statement_invalid.html.slim
429
- - app/views/adhoq/previews/create.html.slim
430
- - app/views/adhoq/previews/statement_invalid.html.slim
431
- - app/views/adhoq/queries/_current_tables_leftbar.html.slim
432
- - app/views/adhoq/queries/_execution.html.slim
433
- - app/views/adhoq/queries/_form.html.slim
434
- - app/views/adhoq/queries/_queries.html.slim
435
- - app/views/adhoq/queries/_query.html.slim
436
- - app/views/adhoq/queries/edit.html.slim
437
- - app/views/adhoq/queries/index.html.slim
438
- - app/views/adhoq/queries/new.html.slim
439
- - app/views/adhoq/queries/show.html.slim
440
- - app/views/layouts/adhoq/application.html.slim
397
+ - app/views/adhoq/application/_global_nav.html.erb
398
+ - app/views/adhoq/current_tables/index.html.erb
399
+ - app/views/adhoq/explains/create.html.erb
400
+ - app/views/adhoq/explains/statement_invalid.html.erb
401
+ - app/views/adhoq/previews/create.html.erb
402
+ - app/views/adhoq/previews/statement_invalid.html.erb
403
+ - app/views/adhoq/queries/_current_tables_leftbar.html.erb
404
+ - app/views/adhoq/queries/_execution.html.erb
405
+ - app/views/adhoq/queries/_form.html.erb
406
+ - app/views/adhoq/queries/_queries.html.erb
407
+ - app/views/adhoq/queries/_query.html.erb
408
+ - app/views/adhoq/queries/edit.html.erb
409
+ - app/views/adhoq/queries/index.html.erb
410
+ - app/views/adhoq/queries/new.html.erb
411
+ - app/views/adhoq/queries/show.html.erb
412
+ - app/views/layouts/adhoq/application.html.erb
413
+ - config/database.yml
441
414
  - config/routes.rb
442
415
  - db/migrate/20141003095645_create_adhoq_queries.rb
443
416
  - db/migrate/20141006014750_create_adhoq_executions.rb
@@ -456,6 +429,7 @@ files:
456
429
  - lib/adhoq/reporter/xlsx.rb
457
430
  - lib/adhoq/result.rb
458
431
  - lib/adhoq/storage.rb
432
+ - lib/adhoq/storage/cache.rb
459
433
  - lib/adhoq/storage/fog_storage.rb
460
434
  - lib/adhoq/storage/local_file.rb
461
435
  - lib/adhoq/storage/on_the_fly.rb
@@ -496,24 +470,23 @@ required_rubygems_version: !ruby/object:Gem::Requirement
496
470
  - !ruby/object:Gem::Version
497
471
  version: '0'
498
472
  requirements: []
499
- rubyforge_project:
500
- rubygems_version: 2.6.11
473
+ rubygems_version: 3.1.4
501
474
  signing_key:
502
475
  specification_version: 4
503
476
  summary: DB management console in the wild.
504
477
  test_files:
505
- - spec/adhoq/executor/connection_wrapper_spec.rb
506
- - spec/adhoq/executor_spec.rb
507
- - spec/adhoq/global_variable_spec.rb
508
- - spec/adhoq/reporter/csv_spec.rb
509
478
  - spec/adhoq/reporter/json_spec.rb
479
+ - spec/adhoq/reporter/csv_spec.rb
510
480
  - spec/adhoq/reporter/xlsx_spec.rb
511
481
  - spec/adhoq/storage_spec.rb
482
+ - spec/adhoq/executor_spec.rb
483
+ - spec/adhoq/executor/connection_wrapper_spec.rb
484
+ - spec/adhoq/global_variable_spec.rb
512
485
  - spec/factories/adhoq_queries.rb
486
+ - spec/models/adhoq/report_spec.rb
513
487
  - spec/models/adhoq/execution_spec.rb
514
488
  - spec/models/adhoq/query_spec.rb
515
- - spec/models/adhoq/report_spec.rb
516
- - spec/support/activejob_helper.rb
517
489
  - spec/support/feature_spec_helper.rb
490
+ - spec/support/activejob_helper.rb
518
491
  - spec/support/have_values_in_xlsx_sheet_matcher.rb
519
492
  - spec/spec_helper.rb