awesome_explain 0.3.0 → 1.0.0

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 (78) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/mongodb.yml +53 -0
  3. data/.github/workflows/postgres.yml +56 -0
  4. data/.gitignore +11 -0
  5. data/Appraisals +11 -0
  6. data/Gemfile.lock +209 -49
  7. data/LICENSE.txt +4 -20
  8. data/README.md +155 -7
  9. data/Rakefile +35 -1
  10. data/app/models/awesome_explain/application_record.rb +5 -0
  11. data/app/models/awesome_explain/controller.rb +20 -0
  12. data/app/models/awesome_explain/delayed_job.rb +7 -0
  13. data/app/models/awesome_explain/explain.rb +23 -0
  14. data/app/models/awesome_explain/log.rb +7 -0
  15. data/app/models/awesome_explain/pg_dml_stat.rb +4 -0
  16. data/app/models/awesome_explain/pg_seq_scan.rb +4 -0
  17. data/app/models/awesome_explain/plan_node.rb +52 -0
  18. data/app/models/awesome_explain/plan_tree.rb +66 -0
  19. data/app/models/awesome_explain/sidekiq_worker.rb +7 -0
  20. data/app/models/awesome_explain/sql_explain.rb +14 -0
  21. data/app/models/awesome_explain/sql_plan_node.rb +73 -0
  22. data/app/models/awesome_explain/sql_plan_stats.rb +34 -0
  23. data/app/models/awesome_explain/sql_plan_tree.rb +133 -0
  24. data/app/models/awesome_explain/sql_query.rb +7 -0
  25. data/app/models/awesome_explain/stacktrace.rb +11 -0
  26. data/awesome_explain.gemspec +16 -5
  27. data/bin/rails +14 -0
  28. data/data/mongodb/customers.bson +0 -0
  29. data/data/mongodb/customers.metadata.json +1 -0
  30. data/data/mongodb/line_items.bson +0 -0
  31. data/data/mongodb/line_items.metadata.json +1 -0
  32. data/data/mongodb/orders.bson +0 -0
  33. data/data/mongodb/orders.metadata.json +1 -0
  34. data/data/mongodb/products.bson +0 -0
  35. data/data/mongodb/products.metadata.json +1 -0
  36. data/data/postgresql/dvdrental.tar +0 -0
  37. data/db/migrate/20200507214801_stacktraces.rb +12 -0
  38. data/db/migrate/20200507214949_controllers.rb +16 -0
  39. data/db/migrate/20200507215205_logs.rb +22 -0
  40. data/db/migrate/20200507215243_explains.rb +27 -0
  41. data/gemfiles/rails_4.gemfile +7 -0
  42. data/gemfiles/rails_4.gemfile.lock +208 -0
  43. data/gemfiles/rails_5.gemfile +7 -0
  44. data/gemfiles/rails_5.gemfile.lock +209 -0
  45. data/gemfiles/rails_6.gemfile +7 -0
  46. data/gemfiles/rails_6.gemfile.lock +233 -0
  47. data/images/universe.png +0 -0
  48. data/lib/awesome_explain.rb +79 -2
  49. data/lib/awesome_explain/config.rb +196 -0
  50. data/lib/awesome_explain/engine.rb +5 -0
  51. data/lib/awesome_explain/insights/active_record_insights.rb +137 -0
  52. data/lib/awesome_explain/insights/base.rb +18 -0
  53. data/lib/awesome_explain/insights/mongoid_insights.rb +44 -0
  54. data/lib/awesome_explain/insights/sql_plans_insights.rb +64 -0
  55. data/lib/awesome_explain/kernel.rb +17 -0
  56. data/lib/awesome_explain/mongodb/base.rb +4 -0
  57. data/lib/awesome_explain/mongodb/command_start.rb +84 -0
  58. data/lib/awesome_explain/mongodb/command_success.rb +58 -0
  59. data/lib/awesome_explain/mongodb/formatter.rb +62 -0
  60. data/lib/awesome_explain/mongodb/helpers.rb +71 -0
  61. data/lib/awesome_explain/queue/command.rb +17 -0
  62. data/lib/awesome_explain/queue/simple_queue.rb +88 -0
  63. data/lib/awesome_explain/renderers/active_record.rb +114 -0
  64. data/lib/awesome_explain/renderers/base.rb +2 -0
  65. data/lib/awesome_explain/renderers/mongoid.rb +20 -33
  66. data/lib/awesome_explain/sidekiq_middleware.rb +17 -0
  67. data/lib/awesome_explain/stats/postgresql.rb +54 -0
  68. data/lib/awesome_explain/subscribers/active_record_passive_subscriber.rb +82 -0
  69. data/lib/awesome_explain/subscribers/active_record_subscriber.rb +187 -0
  70. data/lib/awesome_explain/subscribers/base.rb +3 -0
  71. data/lib/awesome_explain/subscribers/command_subscriber.rb +53 -0
  72. data/lib/awesome_explain/tasks/db.rb +325 -0
  73. data/lib/awesome_explain/utils/color.rb +16 -0
  74. data/lib/awesome_explain/version.rb +1 -1
  75. data/lib/tasks/ae.rake +28 -0
  76. data/lib/tasks/awesome_explain_tasks.rake +4 -0
  77. metadata +242 -25
  78. data/.travis.yml +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d14b9a43988b0efc8466fe97d9965a54a7282212
4
- data.tar.gz: 9a7238a42460d51e72cf15fffdec97439de8adcd
2
+ SHA256:
3
+ metadata.gz: eba66f0deee790b7cc9b1b0ec35e4f4ca9bbb821943f5ae01a170343ed3889c3
4
+ data.tar.gz: 369c6b793ebc194e9b1ea8e81443b84f71780389529703d2a8e54d546a6aa37d
5
5
  SHA512:
6
- metadata.gz: 8a2204580bbf2207f3cec4b922b8cd91f066d847a64f018a83df469ac599dd7a3121048e2629a75f3fb9e6025b59742371d254d0a01154dc14a41bfa8ad944cc
7
- data.tar.gz: c3650a11afcb33eb926e77ccbf6e4be5e9776719235f3352e08ac2f9eb56da428043e7c9be875a8aeaf3db37d6d940b15bc05338d6077ecfd29c80a32ca9db14
6
+ metadata.gz: c5c7a9d53d6a2df1c848a2cbfe16f478814b624f54a5df9d07dd28a9aa061c6e25530cf8bc4b320d16fae28c4443db15f1f00c81bbfaf308907927265407da4d
7
+ data.tar.gz: cd0b86ad05fc9f787b63f398a7a499fc217a81ad029cee56177ae1f0a635356ebdf4f73491f8030ab9354d69e004c92667096ca181f083550490f78f16f3b310
@@ -0,0 +1,53 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: AwesomeExplain - MongoDB
9
+
10
+ on:
11
+ push:
12
+ branches: [main]
13
+ pull_request:
14
+ branches: "*"
15
+
16
+ jobs:
17
+ test-mongodb:
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ ruby-version: ['2.5']
23
+ mongodb-version: ['3.4', '3.6', '4.0', '4.2', '4.4']
24
+ steps:
25
+ - name: Git checkout
26
+ uses: actions/checkout@v2
27
+
28
+ - name: Install dependent libraries
29
+ run: sudo apt-get install libpq-dev
30
+
31
+ - name: Start MongoDB v${{ matrix.mongodb-version }}
32
+ uses: supercharge/mongodb-github-action@1.3.0
33
+ with:
34
+ mongodb-version: ${{ matrix.mongodb-version }}
35
+
36
+ - name: Set up Ruby
37
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
38
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
39
+ # uses: ruby/setup-ruby@v1
40
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
41
+ with:
42
+ ruby-version: ${{ matrix.ruby-version }}
43
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
44
+
45
+ - name: Restore MongoDB Data
46
+ run: |
47
+ mongorestore -d awesome_explain_test ./data/mongodb/customers.bson
48
+ mongorestore -d awesome_explain_test ./data/mongodb/line_items.bson
49
+ mongorestore -d awesome_explain_test ./data/mongodb/orders.bson
50
+ mongorestore -d awesome_explain_test ./data/mongodb/products.bson
51
+
52
+ - name: Run tests
53
+ run: bundle exec rspec spec/mongodb
@@ -0,0 +1,56 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: AwesomeExplain - PostgreSQL
9
+
10
+ on:
11
+ push:
12
+ branches: [master]
13
+ pull_request:
14
+ branches: "*"
15
+
16
+ jobs:
17
+ test-postgres:
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ ruby-version: ['2.5']
23
+ postgres-version: ['10', '11', '12', '13']
24
+ steps:
25
+ - name: Git checkout
26
+ uses: actions/checkout@v2
27
+
28
+ - name: Install dependent libraries
29
+ run: sudo apt-get install libpq-dev
30
+
31
+ - name: Start PostgreSQL v${{ matrix.postgres-version }}
32
+ uses: harmon758/postgresql-action@v1
33
+ with:
34
+ postgresql version: ${{ matrix.postgres-version }} # See https://hub.docker.com/_/postgres for available versions
35
+ postgresql db: dvdrental
36
+ postgresql user: postgres
37
+ postgresql password: postgres
38
+
39
+ - name: Set up Ruby
40
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
41
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
42
+ # uses: ruby/setup-ruby@v1
43
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
44
+ with:
45
+ ruby-version: ${{ matrix.ruby-version }}
46
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
47
+
48
+ - name: Restore PostgrsSQL Data
49
+ run: |
50
+ touch ~/.pgpass
51
+ echo localhost:5432:dvdrental:postgres:postgres > ~/.pgpass
52
+ chmod 600 ~/.pgpass
53
+ pg_restore -U postgres -w -h localhost -p 5432 -d dvdrental data/postgresql/dvdrental.tar
54
+
55
+ - name: Run tests
56
+ run: bundle exec rspec spec/sql
data/.gitignore CHANGED
@@ -6,6 +6,8 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /log/
10
+ *.gem
9
11
 
10
12
  # rspec failure tracking
11
13
  .rspec_status
@@ -201,4 +203,13 @@ $RECYCLE.BIN/
201
203
  *.lnk
202
204
 
203
205
 
206
+ ### VisualStudioCode ###
207
+ .vscode
208
+
209
+ ### VisualStudioCode Patch ###
210
+ # Ignore all local history of files
211
+ .history
212
+
204
213
  # End of https://www.gitignore.io/api/vim,osx,windows,rubymine,sublimetext,visualstudiocode
214
+
215
+ test/dummy/log
data/Appraisals ADDED
@@ -0,0 +1,11 @@
1
+ appraise "rails-4" do
2
+ gem "rails", "4.2"
3
+ end
4
+
5
+ appraise "rails-5" do
6
+ gem "rails", "5.0"
7
+ end
8
+
9
+ appraise "rails-6" do
10
+ gem "rails", "6.0"
11
+ end
data/Gemfile.lock CHANGED
@@ -1,77 +1,237 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- awesome_explain (0.3.0)
4
+ awesome_explain (1.0.0)
5
+ activerecord-import (>= 0.25)
5
6
  awesome_print (~> 1.0)
7
+ kaminari (>= 1.0)
8
+ niceql
9
+ pg
10
+ rails (>= 4.2)
11
+ sqlite3
6
12
  terminal-table (~> 1.0)
7
13
 
8
14
  GEM
9
15
  remote: https://rubygems.org/
10
16
  specs:
11
- activemodel (5.2.1)
12
- activesupport (= 5.2.1)
13
- activesupport (5.2.1)
17
+ actioncable (6.1.0)
18
+ actionpack (= 6.1.0)
19
+ activesupport (= 6.1.0)
20
+ nio4r (~> 2.0)
21
+ websocket-driver (>= 0.6.1)
22
+ actionmailbox (6.1.0)
23
+ actionpack (= 6.1.0)
24
+ activejob (= 6.1.0)
25
+ activerecord (= 6.1.0)
26
+ activestorage (= 6.1.0)
27
+ activesupport (= 6.1.0)
28
+ mail (>= 2.7.1)
29
+ actionmailer (6.1.0)
30
+ actionpack (= 6.1.0)
31
+ actionview (= 6.1.0)
32
+ activejob (= 6.1.0)
33
+ activesupport (= 6.1.0)
34
+ mail (~> 2.5, >= 2.5.4)
35
+ rails-dom-testing (~> 2.0)
36
+ actionpack (6.1.0)
37
+ actionview (= 6.1.0)
38
+ activesupport (= 6.1.0)
39
+ rack (~> 2.0, >= 2.0.9)
40
+ rack-test (>= 0.6.3)
41
+ rails-dom-testing (~> 2.0)
42
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
43
+ actiontext (6.1.0)
44
+ actionpack (= 6.1.0)
45
+ activerecord (= 6.1.0)
46
+ activestorage (= 6.1.0)
47
+ activesupport (= 6.1.0)
48
+ nokogiri (>= 1.8.5)
49
+ actionview (6.1.0)
50
+ activesupport (= 6.1.0)
51
+ builder (~> 3.1)
52
+ erubi (~> 1.4)
53
+ rails-dom-testing (~> 2.0)
54
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
55
+ activejob (6.1.0)
56
+ activesupport (= 6.1.0)
57
+ globalid (>= 0.3.6)
58
+ activemodel (6.1.0)
59
+ activesupport (= 6.1.0)
60
+ activerecord (6.1.0)
61
+ activemodel (= 6.1.0)
62
+ activesupport (= 6.1.0)
63
+ activerecord-import (1.1.0)
64
+ activerecord (>= 3.2)
65
+ activestorage (6.1.0)
66
+ actionpack (= 6.1.0)
67
+ activejob (= 6.1.0)
68
+ activerecord (= 6.1.0)
69
+ activesupport (= 6.1.0)
70
+ marcel (~> 0.3.1)
71
+ mimemagic (~> 0.3.2)
72
+ activesupport (6.1.0)
14
73
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
- i18n (>= 0.7, < 2)
16
- minitest (~> 5.1)
17
- tzinfo (~> 1.1)
74
+ i18n (>= 1.6, < 2)
75
+ minitest (>= 5.1)
76
+ tzinfo (~> 2.0)
77
+ zeitwerk (~> 2.3)
18
78
  ansi (1.5.0)
19
- awesome_print (1.8.0)
20
- bson (4.3.0)
21
- concurrent-ruby (1.0.5)
22
- diff-lcs (1.3)
23
- docile (1.3.1)
24
- hirb (0.7.3)
25
- i18n (1.1.0)
79
+ appraisal (2.4.0)
80
+ bundler
81
+ rake
82
+ thor (>= 0.14.0)
83
+ awesome_print (1.9.2)
84
+ binding_of_caller (1.0.0)
85
+ debug_inspector (>= 0.0.1)
86
+ bson (4.12.0)
87
+ builder (3.2.4)
88
+ byebug (11.1.3)
89
+ coderay (1.1.3)
90
+ concurrent-ruby (1.1.8)
91
+ crass (1.0.6)
92
+ debug_inspector (1.1.0)
93
+ diff-lcs (1.4.4)
94
+ docile (1.3.5)
95
+ erubi (1.10.0)
96
+ globalid (0.4.2)
97
+ activesupport (>= 4.2.0)
98
+ i18n (1.8.10)
26
99
  concurrent-ruby (~> 1.0)
27
- json (2.1.0)
28
- minitest (5.11.3)
29
- mongo (2.6.2)
30
- bson (>= 4.3.0, < 5.0.0)
31
- mongoid (7.0.1)
32
- activemodel (>= 5.1, < 6.0.0)
33
- mongo (>= 2.5.1, < 3.0.0)
34
- rake (10.5.0)
35
- rspec (3.7.0)
36
- rspec-core (~> 3.7.0)
37
- rspec-expectations (~> 3.7.0)
38
- rspec-mocks (~> 3.7.0)
39
- rspec-core (3.7.1)
40
- rspec-support (~> 3.7.0)
41
- rspec-expectations (3.7.0)
100
+ kaminari (1.2.1)
101
+ activesupport (>= 4.1.0)
102
+ kaminari-actionview (= 1.2.1)
103
+ kaminari-activerecord (= 1.2.1)
104
+ kaminari-core (= 1.2.1)
105
+ kaminari-actionview (1.2.1)
106
+ actionview
107
+ kaminari-core (= 1.2.1)
108
+ kaminari-activerecord (1.2.1)
109
+ activerecord
110
+ kaminari-core (= 1.2.1)
111
+ kaminari-core (1.2.1)
112
+ loofah (2.10.0)
113
+ crass (~> 1.0.2)
114
+ nokogiri (>= 1.5.9)
115
+ mail (2.7.1)
116
+ mini_mime (>= 0.1.1)
117
+ marcel (0.3.3)
118
+ mimemagic (~> 0.3.2)
119
+ method_source (1.0.0)
120
+ mimemagic (0.3.10)
121
+ nokogiri (~> 1)
122
+ rake
123
+ mini_mime (1.1.0)
124
+ mini_portile2 (2.5.3)
125
+ minitest (5.14.4)
126
+ mongo (2.14.0)
127
+ bson (>= 4.8.2, < 5.0.0)
128
+ mongoid (7.2.2)
129
+ activemodel (>= 5.1, < 6.2)
130
+ mongo (>= 2.10.5, < 3.0.0)
131
+ niceql (0.1.25)
132
+ nio4r (2.5.7)
133
+ nokogiri (1.11.7)
134
+ mini_portile2 (~> 2.5.0)
135
+ racc (~> 1.4)
136
+ pg (1.2.3)
137
+ pry (0.13.1)
138
+ coderay (~> 1.1)
139
+ method_source (~> 1.0)
140
+ pry-byebug (3.9.0)
141
+ byebug (~> 11.0)
142
+ pry (~> 0.13.0)
143
+ pry-rails (0.3.9)
144
+ pry (>= 0.10.4)
145
+ racc (1.5.2)
146
+ rack (2.2.3)
147
+ rack-test (1.1.0)
148
+ rack (>= 1.0, < 3)
149
+ rails (6.1.0)
150
+ actioncable (= 6.1.0)
151
+ actionmailbox (= 6.1.0)
152
+ actionmailer (= 6.1.0)
153
+ actionpack (= 6.1.0)
154
+ actiontext (= 6.1.0)
155
+ actionview (= 6.1.0)
156
+ activejob (= 6.1.0)
157
+ activemodel (= 6.1.0)
158
+ activerecord (= 6.1.0)
159
+ activestorage (= 6.1.0)
160
+ activesupport (= 6.1.0)
161
+ bundler (>= 1.15.0)
162
+ railties (= 6.1.0)
163
+ sprockets-rails (>= 2.0.0)
164
+ rails-dom-testing (2.0.3)
165
+ activesupport (>= 4.2.0)
166
+ nokogiri (>= 1.6)
167
+ rails-html-sanitizer (1.3.0)
168
+ loofah (~> 2.3)
169
+ railties (6.1.0)
170
+ actionpack (= 6.1.0)
171
+ activesupport (= 6.1.0)
172
+ method_source
173
+ rake (>= 0.8.7)
174
+ thor (~> 1.0)
175
+ rake (13.0.3)
176
+ rspec (3.10.0)
177
+ rspec-core (~> 3.10.0)
178
+ rspec-expectations (~> 3.10.0)
179
+ rspec-mocks (~> 3.10.0)
180
+ rspec-core (3.10.1)
181
+ rspec-support (~> 3.10.0)
182
+ rspec-expectations (3.10.1)
42
183
  diff-lcs (>= 1.2.0, < 2.0)
43
- rspec-support (~> 3.7.0)
44
- rspec-mocks (3.7.0)
184
+ rspec-support (~> 3.10.0)
185
+ rspec-mocks (3.10.2)
45
186
  diff-lcs (>= 1.2.0, < 2.0)
46
- rspec-support (~> 3.7.0)
47
- rspec-support (3.7.1)
48
- simplecov (0.16.1)
187
+ rspec-support (~> 3.10.0)
188
+ rspec-support (3.10.2)
189
+ simplecov (0.21.2)
49
190
  docile (~> 1.1)
50
- json (>= 1.8, < 3)
51
- simplecov-html (~> 0.10.0)
52
- simplecov-console (0.4.2)
191
+ simplecov-html (~> 0.11)
192
+ simplecov_json_formatter (~> 0.1)
193
+ simplecov-console (0.9.1)
53
194
  ansi
54
- hirb
55
195
  simplecov
56
- simplecov-html (0.10.2)
196
+ terminal-table
197
+ simplecov-html (0.12.3)
198
+ simplecov_json_formatter (0.1.2)
199
+ sprockets (4.0.2)
200
+ concurrent-ruby (~> 1.0)
201
+ rack (> 1, < 3)
202
+ sprockets-rails (3.2.2)
203
+ actionpack (>= 4.0)
204
+ activesupport (>= 4.0)
205
+ sprockets (>= 3.0.0)
206
+ sqlite3 (1.4.2)
57
207
  terminal-table (1.8.0)
58
208
  unicode-display_width (~> 1.1, >= 1.1.1)
59
- thread_safe (0.3.6)
60
- tzinfo (1.2.5)
61
- thread_safe (~> 0.1)
62
- unicode-display_width (1.4.0)
209
+ thor (1.1.0)
210
+ tzinfo (2.0.4)
211
+ concurrent-ruby (~> 1.0)
212
+ unicode-display_width (1.7.0)
213
+ websocket-driver (0.7.5)
214
+ websocket-extensions (>= 0.1.0)
215
+ websocket-extensions (0.1.5)
216
+ wwtd (1.4.1)
217
+ zeitwerk (2.4.2)
63
218
 
64
219
  PLATFORMS
65
220
  ruby
66
221
 
67
222
  DEPENDENCIES
223
+ appraisal
68
224
  awesome_explain!
69
- bundler (~> 1.16)
225
+ binding_of_caller
226
+ bundler
70
227
  mongoid (>= 5)
71
- rake (~> 10.0)
72
- rspec (~> 3.0)
73
- simplecov (~> 0.16.1)
74
- simplecov-console (~> 0.4.2)
228
+ pry-byebug
229
+ pry-rails
230
+ rake (>= 10.0)
231
+ rspec (>= 3.10)
232
+ simplecov (>= 0.21.2)
233
+ simplecov-console (>= 0.9.1)
234
+ wwtd
75
235
 
76
236
  BUNDLED WITH
77
- 1.16.3
237
+ 1.17.3
data/LICENSE.txt CHANGED
@@ -1,21 +1,5 @@
1
- The MIT License (MIT)
1
+ Copyright (c) Ahmed Elhossaini
2
2
 
3
- Copyright (c) 2018 Ahmed El.Hussaini
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
3
+ AwesomeExplain is an Open Source project licensed under the terms of
4
+ the LGPLv3 license. Please see <http://www.gnu.org/licenses/lgpl-3.0.html>
5
+ for license text.