ruby-grafana-reporter 0.1.7 → 0.2.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +166 -339
  3. data/bin/ruby-grafana-reporter +5 -4
  4. data/lib/VERSION.rb +5 -3
  5. data/lib/grafana/abstract_panel_query.rb +22 -20
  6. data/lib/grafana/abstract_query.rb +132 -127
  7. data/lib/grafana/abstract_sql_query.rb +51 -42
  8. data/lib/grafana/dashboard.rb +77 -66
  9. data/lib/grafana/errors.rb +66 -61
  10. data/lib/grafana/grafana.rb +130 -131
  11. data/lib/grafana/panel.rb +41 -39
  12. data/lib/grafana/panel_image_query.rb +52 -49
  13. data/lib/grafana/variable.rb +217 -259
  14. data/lib/grafana_reporter/abstract_report.rb +112 -109
  15. data/lib/grafana_reporter/application/application.rb +404 -229
  16. data/lib/grafana_reporter/application/errors.rb +33 -30
  17. data/lib/grafana_reporter/application/webservice.rb +231 -0
  18. data/lib/grafana_reporter/asciidoctor/alerts_table_query.rb +104 -99
  19. data/lib/grafana_reporter/asciidoctor/annotations_table_query.rb +99 -96
  20. data/lib/grafana_reporter/asciidoctor/errors.rb +40 -37
  21. data/lib/grafana_reporter/asciidoctor/extensions/alerts_table_include_processor.rb +92 -86
  22. data/lib/grafana_reporter/asciidoctor/extensions/annotations_table_include_processor.rb +91 -86
  23. data/lib/grafana_reporter/asciidoctor/extensions/panel_image_block_macro.rb +69 -67
  24. data/lib/grafana_reporter/asciidoctor/extensions/panel_image_inline_macro.rb +68 -65
  25. data/lib/grafana_reporter/asciidoctor/extensions/panel_property_inline_macro.rb +61 -58
  26. data/lib/grafana_reporter/asciidoctor/extensions/panel_query_table_include_processor.rb +78 -75
  27. data/lib/grafana_reporter/asciidoctor/extensions/panel_query_value_inline_macro.rb +73 -70
  28. data/lib/grafana_reporter/asciidoctor/extensions/processor_mixin.rb +20 -18
  29. data/lib/grafana_reporter/asciidoctor/extensions/show_environment_include_processor.rb +43 -41
  30. data/lib/grafana_reporter/asciidoctor/extensions/sql_table_include_processor.rb +70 -67
  31. data/lib/grafana_reporter/asciidoctor/extensions/sql_value_inline_macro.rb +66 -65
  32. data/lib/grafana_reporter/asciidoctor/extensions/value_as_variable_include_processor.rb +61 -57
  33. data/lib/grafana_reporter/asciidoctor/panel_first_value_query.rb +34 -32
  34. data/lib/grafana_reporter/asciidoctor/panel_image_query.rb +25 -23
  35. data/lib/grafana_reporter/asciidoctor/panel_property_query.rb +44 -43
  36. data/lib/grafana_reporter/asciidoctor/panel_table_query.rb +38 -36
  37. data/lib/grafana_reporter/asciidoctor/query_mixin.rb +310 -309
  38. data/lib/grafana_reporter/asciidoctor/report.rb +177 -159
  39. data/lib/grafana_reporter/asciidoctor/sql_first_value_query.rb +37 -34
  40. data/lib/grafana_reporter/asciidoctor/sql_table_query.rb +39 -32
  41. data/lib/grafana_reporter/configuration.rb +257 -326
  42. data/lib/grafana_reporter/errors.rb +48 -38
  43. data/lib/grafana_reporter/logger/two_way_logger.rb +58 -52
  44. data/lib/ruby-grafana-reporter.rb +29 -27
  45. metadata +10 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aaffc7971d9bbdc7b7333d0e9e2bb11bb9c0f4a0a2a564718739793e76ad2f81
4
- data.tar.gz: d14e3ef3e7892a15c960ba30e9f6a8c803668a071fe4d221d30d23c20ebbd6e0
3
+ metadata.gz: c3ffea90aebd213a65781274b5825d3f47d2a68e804821dd4a887ebdaebd67ae
4
+ data.tar.gz: 931c47a54cebe300a6f0b3e3dffb470ac6ce6f4faddc8558e90bd18d4273b1d5
5
5
  SHA512:
6
- metadata.gz: 2585ee385b52e447922274769637ec0465bf3a24daceb88afcdaae2fc64d29bcad3d6790bdc7a24d38b881afa6ceeaf9715aa183eaa12084b91c284c46b3b64f
7
- data.tar.gz: f608747c46af7c40f9eeb8a8a986a73d81bf85f35e68657046caf53182c8289c62e524eb49b4886117b9db5427de103e30f468403a52ae209a6c59fc9cc62489
6
+ metadata.gz: d0c187b97ec27c6ac374069d9253215d78c2b04d6e8ff10cc1bd660486d0f998c742cfd65a4d415cdb2b8045fed1c6800ccf2c64cbe21fc530b82527b4183f69
7
+ data.tar.gz: b7b22e087b05c9c1bb6c0c92526755c1883ac9a57ca53c64e809de18e213421a2c65329618a42a75aa80b2ebdc0a38f48b28ac15eb2b9dd02c7c2250c838953c
data/README.md CHANGED
@@ -1,339 +1,166 @@
1
- [![MIT License](https://img.shields.io/github/license/divinity666/ruby-grafana-reporter.svg?style=flat-square)](https://github.com/divinity666/ruby-grafana-reporter/blob/master/LICENSE)
2
- [![Build Status](https://travis-ci.org/divinity666/ruby-grafana-reporter.svg?branch=master)](https://travis-ci.org/github/divinity666/ruby-grafana-reporter?branch=master)
3
- [![Coverage Status](https://coveralls.io/repos/github/divinity666/ruby-grafana-reporter/badge.svg?branch=master)](https://coveralls.io/github/divinity666/ruby-grafana-reporter?branch=master)
4
-
5
- # Ruby Grafana Reporter
6
- Reporting Service for Grafana
7
-
8
- ## Table of Contents
9
-
10
- * [About the project](#about-the-project)
11
- * [Getting started](#getting-started)
12
- * [Initial Configuration](#initial-configuration)
13
- * [Option 1) "Baremetal" Ruby](#baremetal-ruby)
14
- * [Option 2) As a GEM](#as-a-gem)
15
- * [Option 3) Docker](#docker)
16
- * [Grafana integration](#grafana-integration)
17
- * [Webservice overview](#webservice-overview)
18
- * [Features](#features)
19
- * [Roadmap](#roadmap)
20
- * [Contributing](#contributing)
21
- * [Licensing](#licensing)
22
- * [Acknowledgements](#acknowledgements)
23
- * [Donations](#donations)
24
-
25
- ## About the project
26
-
27
- Did you ever want to create (professional) reports based on Grafana dashboards?
28
- I did so in order to being able to automatically get monthly reports of my
29
- home's energy usage. That's how it started.
30
-
31
- The reporter provides reporting capabilities for Grafana. It is based on
32
- (but not limited to) [asciidoctor](https://github.com/asciidoctor/asciidoctor)
33
- report templates, which can dynamically integrate Grafana panels, queries,
34
- images etc. to create dynamic PDF reports on the fly.
35
-
36
- The report may also be returned in any other format that asciidoctor supports.
37
-
38
- The reporter can run standalone or as a webservice. It is built to
39
- integrate without further dependencies with the asciidoctor docker image.
40
-
41
- The complete
42
- [API documentation](https://rubydoc.info/gems/ruby-grafana-reporter) can be
43
- found here.
44
-
45
- ## Getting started
46
-
47
- There exist several ways of installing the reporter. All of them have in
48
- common, that they require a working ruby environment. Check with the following
49
- commands, that the tools are setup and run properly:
50
-
51
- ruby -v
52
- gem -v
53
-
54
- ### Initial Configuration
55
-
56
- #### Configuration file
57
-
58
- Create a first configuration file, named e.g. `myconfig` with the following
59
- content:
60
-
61
- grafana-reporter:
62
- templates-folder: templates
63
- reports-folder: reports
64
-
65
- grafana:
66
- default:
67
- host: <<url to your grafana host, e.g. https://localhost:3000>>
68
- api_key: <<api key to be used by the reporter>>
69
- datasources: # mandatory, if the api_key has only viewer rights, optional otherwise
70
- "<<data source name in grafana>>": <<data source id in grafana>>
71
-
72
- default-document-attributes:
73
- imagesdir: .
74
-
75
- #### "Hello World" asciidoctor template
76
-
77
- Create a first asciidoctor template file in your `templates-folder`, e.g.
78
- `myfirsttemplate.adoc` with the following content:
79
-
80
- = First Ruby Grafana Reporter Example
81
-
82
- include::grafana_help[]
83
-
84
- include::grafana_environment[]
85
-
86
- Now you're ready to go! Let's check it out!
87
-
88
- ### "Baremetal" Ruby
89
-
90
- To install on a plain ruby installation, make sure that the `ruby` command is
91
- accessible from your command line and then follow these steps:
92
-
93
- Download the ruby grafana reporter to a folder of your choice.
94
-
95
- Install asciidoctor
96
-
97
- gem install asciidoctor asciidoctor-pdf zip
98
-
99
- or simply use
100
-
101
- bundle install
102
-
103
- To check if all dependencies are setup properly, run the following command
104
- in that folder:
105
-
106
- ruby bin/ruby-grafana-reporter -h
107
-
108
- Check that your configured grafana instance can be accessed properly:
109
-
110
- ruby bin/ruby-grafana-reporter myconfig --test default
111
-
112
- Now you may want to check the conversion of your Hello World example:
113
-
114
- ruby bin/ruby-grafana-reporter myconfig --template myfirsttemplate.adoc --output myfirstrender.pdf
115
-
116
- You should now find a PDF document named `myfirstrender.pdf` which includes a detailed
117
- help page on how to use the ruby grafana reporter functions in asciidoctor, as well
118
- as a list of all environment variables that can be accessed.
119
-
120
- If this has been working properly as well, you might want to run the reporter
121
- as a webservice. Nothing easier than that. Just call:
122
-
123
- ruby bin/ruby-grafana-reporter myconfig
124
-
125
- Test your configuration by requesting the following URL in a browser of your
126
- choice:
127
-
128
- http://<<your-server-url>>:8815/render?var-template=myfirsttemplate.adoc
129
-
130
- If this now also serves you the PDF document after a few seconds (remember to
131
- reload the page), you are done with the reporter service and might want to go
132
- to step into the integration with grafana.
133
-
134
- ### As a GEM
135
-
136
- Installation as a gem is a simple way, if you don't want to mess with the
137
- efforts of a barebone installation.
138
-
139
- To install as a gem, simply run:
140
-
141
- gem install ruby-grafana-reporter
142
-
143
- To see if it works properly, you may run the application:
144
-
145
- ruby-grafana-reporter
146
-
147
- To check if your configured grafana instance can be accessed properly:
148
-
149
- ruby-grafana-reporter myconfig --test default
150
-
151
- Now you may want to check the conversion of your Hello World example:
152
-
153
- ruby-grafana-reporter myconfig --template myfirsttemplate.adoc --output myfirstrender.pdf
154
-
155
- You should now find a PDF document named `myfirstrender.pdf` which includes a detailed
156
- help page on how to use the ruby grafana reporter functions in asciidoctor, as well
157
- as a list of all environment variables that can be accessed.
158
-
159
- If this has been working properly as well, you might want to run the reporter
160
- as a webservice. Nothing easier than that. Just call:
161
-
162
- ruby-grafana-reporter myconfig
163
-
164
- Test your configuration by requesting the following URL in a browser of your
165
- choice:
166
-
167
- http://<<your-server-url>>:8815/render?var-template=myfirsttemplate.adoc
168
-
169
- If this now also serves you the PDF document after a few seconds (remember to
170
- reload the page), you are done with the reporter service and might want to go
171
- to step into the integration with grafana.
172
-
173
- ### Docker
174
-
175
- One of the key features of the reporter is, that it can work seemlessly with
176
- the official `asciidoctor` docker container without further dependencies.
177
-
178
- Assuming you have a `docker-compose` setup running, you may want to add the
179
- following to your services secion in your `docker-compose.yml`:
180
-
181
- asciidoctor:
182
- image: asciidoctor/docker-asciidoctor
183
- container_name: asciidoctor
184
- hostname: asciidoctor
185
- volumes:
186
- - /<<an-empty-local-path>>:/documents
187
- restart: unless-stopped
188
-
189
- After running this container, you have to copy the reporter files. Download the
190
- ruby grafana reporter to the folder `<<an-empty-local-path>>`. I tend to use
191
- the single file application there.
192
-
193
- To test the setup, you'll have to first step inside the container, e.g. by
194
- calling `docker exec` with the appropriate parameters. Then you can simply
195
- run
196
-
197
- ruby bin/ruby-grafana-reporter -h
198
-
199
- Check that your configured grafana instance can be accessed properly:
200
-
201
- ruby bin/ruby-grafana-reporter myconfig --test default
202
-
203
- Now you may want to check the conversion of your Hello World example:
204
-
205
- ruby bin/ruby-grafana-reporter myconfig --template myfirsttemplate.adoc --output myfirstrender.pdf
206
-
207
- You should now find a PDF document named `myfirstrender.pdf` which includes a detailed
208
- help page on how to use the ruby grafana reporter functions in asciidoctor, as well
209
- as a list of all environment variables that can be accessed.
210
-
211
- If this has been working properly as well, you might want to run the reporter
212
- as a webservice always when starting the container. To do so, use the following
213
- `docker-compose` configuration. Watch out for the added lines!
214
-
215
- asciidoctor:
216
- image: asciidoctor/docker-asciidoctor
217
- container_name: asciidoctor
218
- hostname: asciidoctor
219
- volumes:
220
- - /<<an-empty-local-path>>:/documents
221
- command:
222
- sh /documents/startup.sh
223
- restart: unless-stopped
224
-
225
- Additionally you need to create a `startup.sh` file in the folder
226
- `<<an-empty-local-path>>` with the following content:
227
-
228
- cd /documents
229
- ruby bin/ruby-grafana-reporter myconfig
230
-
231
- After restarting the container, the service should be running.
232
-
233
- Test your configuration by requesting the following URL in a browser of your
234
- choice:
235
-
236
- http://<<your-server-url>>:8815/render?var-template=myfirsttemplate.adoc
237
-
238
- If this now also serves you the PDF document after a few seconds (remember to
239
- reload the page), you are done with the reporter service and might want to go
240
- to step into the integration with grafana.
241
-
242
- ### Grafana integration
243
-
244
- The key feature of the report is, that it can easily be integrated with grafana
245
- (I've not even been talking about the features it is providing for that, but
246
- you'll find them having a look in the example results above).
247
-
248
- For accessing the reporter from grafana, you need to simply add a link to your
249
- grafana dashboard:
250
-
251
- * Open the dashboard configuration
252
- * Select `Links`
253
- * Select `Add`
254
- * Fill out as following:
255
- * Type: `link`
256
- * Url: `http://<<your-server-url>>:8815/render?var-template=myfirsttemplate.adoc`
257
- * Title: `MyFirstReport`
258
- * Select `Time range`
259
- * Select `Variable values`
260
- * Select `Add`
261
-
262
- Now go back to your dashboard and click the newly generated 'MyFirstReport'
263
- link on it. Now the renderer should start it's task and show you the expected
264
- results.
265
-
266
- But now the fun just starts! Try out the functions stated in the
267
- 'MyFirstReport' PDF file, to include the dynamic content in your asciidoctor
268
- template.
269
-
270
- Additionally you might want to make the selection of the template variable.
271
- Piece of cake: Just add a dashboard variable to your grafana dashboard named
272
- `template` and let the user select or enter a template name. To make use of it,
273
- you should change the link of the 'MyFirstReport' link to
274
- `http://<<your-server-url>>:8815/render?`
275
-
276
- That's it. Let me know your feedback!
277
-
278
- ## Webservice overview
279
-
280
- Running the reporter as a webservice provides the following URLs
281
-
282
- /overview - for all running or retained renderings
283
- /render - for rendering a template, 'var-template' is the only mandatory GET parameter
284
- /view_report - for viewing the status or receving the result of a specific rendering, is automatically called after a successfull /render call
285
- /cancel_report - for cancelling the rendering of a specific report, normally not called manually, but on user interaction in the /view_report or /overview URL
286
-
287
- ## Features
288
-
289
- * Build report template including all imaginable grafana content:
290
- * panels as images
291
- * panel table query or custom query results as real document tables (not images!)
292
- * single panel value or custom query single value result integrated in texts
293
- * Solid as a rock, also in case of template errors (at least it aims to be)
294
- * Runs standalone or as a webservice
295
- * Seamlessly integrates with asciidoctor docker container
296
- * Developed for being able to support other tools than asciidoctor as well
297
-
298
- ## Roadmap
299
-
300
- This is just a collection of things, I am heading for in future, without a schedule.
301
-
302
- * Add documentation of possible asciidoctor calls to grafana
303
- * Add documentation for configuration file
304
- * Add a simple plugin system to support specific asciidoctor modifications
305
- * Solve code TODOs
306
- * Become [rubocop](https://rubocop.org/) ready
307
-
308
- ## Contributing
309
-
310
- If you'd like to contribute, please fork the repository and use a feature
311
- branch. Pull requests are warmly welcome.
312
-
313
- Though not yet valid for my code, I'd like to see the project become
314
- [rubocop](https://rubocop.org/) ready :-)
315
-
316
- Definitely open spots from my side are:
317
-
318
- * This README
319
- * Clean and properly setup test cases
320
- * An own webpage for this project
321
-
322
- ## Licensing
323
-
324
- The code in this project is licensed under MIT license.
325
-
326
- ## Acknowledgements
327
- * [asciidoctor](https://github.com/asciidoctor/asciidoctor)
328
- * [asciidoctor-pdf](https://github.com/asciidoctor/asciidoctor-pdf)
329
- * [grafana](https://github.com/grafana/grafana)
330
-
331
- Inspired by [Izak Marai's grafana reporter](https://github.com/IzakMarais/reporter)
332
-
333
- ## Donations
334
-
335
- If this project saves you as much time as I hope it does, and if you'd like to
336
- support my work, feel free donate, even a cup of coffee is appreciated :)
337
-
338
- [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/donate?hosted_button_id=35LH6JNLPHPHQ)
339
-
1
+ [![MIT License](https://img.shields.io/github/license/divinity666/ruby-grafana-reporter.svg?style=flat-square)](https://github.com/divinity666/ruby-grafana-reporter/blob/master/LICENSE)
2
+ [![Build Status](https://travis-ci.org/divinity666/ruby-grafana-reporter.svg?branch=master)](https://travis-ci.org/github/divinity666/ruby-grafana-reporter?branch=master)
3
+ [![Coverage Status](https://coveralls.io/repos/github/divinity666/ruby-grafana-reporter/badge.svg?branch=master)](https://coveralls.io/github/divinity666/ruby-grafana-reporter?branch=master)
4
+
5
+ # Ruby Grafana Reporter
6
+ Reporting Service for Grafana
7
+
8
+ ## Table of Contents
9
+
10
+ * [About the project](#about-the-project)
11
+ * [Getting started](#getting-started)
12
+ * [Grafana integration](#grafana-integration)
13
+ * [Webservice overview](#webservice-overview)
14
+ * [Features](#features)
15
+ * [Roadmap](#roadmap)
16
+ * [Contributing](#contributing)
17
+ * [Licensing](#licensing)
18
+ * [Acknowledgements](#acknowledgements)
19
+ * [Donations](#donations)
20
+
21
+ ## About the project
22
+
23
+ Did you ever want to create (professional) reports based on Grafana dashboards?
24
+ I did so in order to being able to automatically get monthly reports of my
25
+ home's energy usage. That's how it started.
26
+
27
+ The reporter provides reporting capabilities for Grafana. It is based on
28
+ (but not limited to) [asciidoctor](https://github.com/asciidoctor/asciidoctor)
29
+ report templates, which can dynamically integrate Grafana panels, queries,
30
+ images etc. to create dynamic PDF reports on the fly.
31
+
32
+ The report may also be returned in any other format that asciidoctor supports.
33
+
34
+ The reporter can run standalone or as a webservice. It is built to
35
+ integrate without further dependencies with the asciidoctor docker image.
36
+
37
+ The complete
38
+ [API documentation](https://rubydoc.info/gems/ruby-grafana-reporter) can be
39
+ found here.
40
+
41
+ ## Getting started
42
+
43
+ There exist several ways of installing the reporter. Here I cover the easiest
44
+ setup by using ruby gems. If you need further installation help, or want to use
45
+ a "baremetal" ruby setup or a docker integration, please have a look at the more
46
+ extended [installation documentation](INSTALL.md).
47
+
48
+ To install the reporter as a gem, simply run:
49
+
50
+ gem install ruby-grafana-reporter
51
+
52
+ If no configuration file is in place, you might want to use the configuration
53
+ wizard, which leads you through all necessary steps:
54
+
55
+ ruby-grafana-reporter -w
56
+
57
+ Now you're ready to go! Let's check it out!
58
+
59
+ ruby-grafana-reporter -t demo_report -o my_first_render.pdf
60
+
61
+ If everything works as expected, you should find a file named `my_first_render.pdf`
62
+ in the current folder, which contains a detailed explanation of all available
63
+ commands as well as your available configuration options.
64
+
65
+ To run the reporter as a service, you only need to call it like this:
66
+
67
+ ruby-grafana-reporter
68
+
69
+ Neat, isn't it?
70
+
71
+ ### Grafana integration
72
+
73
+ The key feature of the report is, that it can easily be integrated with grafana
74
+ (I've not even been talking about the features it is providing for that, but
75
+ you'll find them having a look in the example results above).
76
+
77
+ For accessing the reporter from grafana, you need to simply add a link to your
78
+ grafana dashboard:
79
+
80
+ * Open the dashboard configuration
81
+ * Select `Links`
82
+ * Select `Add`
83
+ * Fill out as following:
84
+ * Type: `link`
85
+ * Url: `http://<<your-server-url>>:<<your-webservice-port>>/render?var-template=myfirsttemplate`
86
+ * Title: `MyFirstReport`
87
+ * Select `Time range`
88
+ * Select `Variable values`
89
+ * Select `Add`
90
+
91
+ Now go back to your dashboard and click the newly generated 'MyFirstReport'
92
+ link on it. Now the renderer should start it's task and show you the expected
93
+ results.
94
+
95
+ But now the fun just starts! Try out the functions stated in the
96
+ 'MyFirstReport' PDF file, to include the dynamic content in your asciidoctor
97
+ template.
98
+
99
+ Additionally you might want to make the selection of the template variable.
100
+ Piece of cake: Just add a dashboard variable to your grafana dashboard named
101
+ `template` and let the user select or enter a template name. To make use of it,
102
+ you should change the link of the 'MyFirstReport' link to
103
+ `http://<<your-server-url>>:<<your-webservice-port>>/render?`
104
+
105
+ That's it. Let me know your feedback!
106
+
107
+ ## Webservice overview
108
+
109
+ Running the reporter as a webservice provides the following URLs
110
+
111
+ /overview - for all running or retained renderings
112
+ /render - for rendering a template, 'var-template' is the only mandatory GET parameter
113
+ /view_report - for viewing the status or receving the result of a specific rendering, is automatically called after a successfull /render call
114
+ /cancel_report - for cancelling the rendering of a specific report, normally not called manually, but on user interaction in the /view_report or /overview URL
115
+
116
+ ## Features
117
+
118
+ * Build report template including all imaginable grafana content:
119
+ * panels as images
120
+ * panel table query or custom query results as real document tables (not images!)
121
+ * single panel value or custom query single value result integrated in texts
122
+ * Solid as a rock, also in case of template errors (at least it aims to be)
123
+ * Runs standalone or as a webservice
124
+ * Seamlessly integrates with asciidoctor docker container
125
+ * Developed for being able to support other tools than asciidoctor as well
126
+
127
+ ## Roadmap
128
+
129
+ This is just a collection of things, I am heading for in future, without a schedule.
130
+
131
+ * Add documentation of possible asciidoctor calls to grafana
132
+ * Add a simple plugin system to support specific asciidoctor modifications
133
+ * Solve code TODOs
134
+ * Become [rubocop](https://rubocop.org/) ready
135
+
136
+ ## Contributing
137
+
138
+ If you'd like to contribute, please fork the repository and use a feature
139
+ branch. Pull requests are warmly welcome.
140
+
141
+ Though not yet valid for my code, I'd like to see the project become
142
+ [rubocop](https://rubocop.org/) ready :-)
143
+
144
+ Definitely open spots from my side are:
145
+
146
+ * This README
147
+ * Clean and properly setup test cases
148
+
149
+ ## Licensing
150
+
151
+ The code in this project is licensed under MIT license.
152
+
153
+ ## Acknowledgements
154
+ * [asciidoctor](https://github.com/asciidoctor/asciidoctor)
155
+ * [asciidoctor-pdf](https://github.com/asciidoctor/asciidoctor-pdf)
156
+ * [grafana](https://github.com/grafana/grafana)
157
+
158
+ Inspired by [Izak Marai's grafana reporter](https://github.com/IzakMarais/reporter)
159
+
160
+ ## Donations
161
+
162
+ If this project saves you as much time as I hope it does, and if you'd like to
163
+ support my work, feel free donate, even a cup of coffee is appreciated :)
164
+
165
+ [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/donate?hosted_button_id=35LH6JNLPHPHQ)
166
+