dicom 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +13 -5
  2. data/{CHANGELOG.rdoc → CHANGELOG.md} +50 -30
  3. data/{CONTRIBUTING.rdoc → CONTRIBUTING.md} +16 -16
  4. data/Gemfile.lock +47 -0
  5. data/README.md +152 -0
  6. data/dicom.gemspec +11 -10
  7. data/lib/dicom.rb +30 -11
  8. data/lib/dicom/anonymizer.rb +654 -649
  9. data/lib/dicom/audit_trail.rb +0 -2
  10. data/lib/dicom/d_client.rb +1 -1
  11. data/lib/dicom/d_library.rb +45 -15
  12. data/lib/dicom/d_object.rb +18 -18
  13. data/lib/dicom/d_read.rb +28 -4
  14. data/lib/dicom/d_write.rb +49 -26
  15. data/lib/dicom/dictionary/{elements.txt → elements.tsv} +0 -0
  16. data/lib/dicom/dictionary/{uids.txt → uids.tsv} +0 -0
  17. data/lib/dicom/element.rb +6 -7
  18. data/lib/dicom/elemental.rb +1 -0
  19. data/lib/dicom/elemental_parent.rb +64 -0
  20. data/lib/dicom/extensions/array.rb +57 -0
  21. data/lib/dicom/extensions/hash.rb +31 -0
  22. data/lib/dicom/extensions/string.rb +126 -0
  23. data/lib/dicom/{constants.rb → general/constants.rb} +29 -38
  24. data/lib/dicom/{deprecated.rb → general/deprecated.rb} +0 -0
  25. data/lib/dicom/{logging.rb → general/logging.rb} +0 -0
  26. data/lib/dicom/{variables.rb → general/methods.rb} +0 -22
  27. data/lib/dicom/general/variables.rb +29 -0
  28. data/lib/dicom/{version.rb → general/version.rb} +1 -1
  29. data/lib/dicom/image_item.rb +0 -2
  30. data/lib/dicom/image_processor.rb +2 -0
  31. data/lib/dicom/item.rb +1 -13
  32. data/lib/dicom/link.rb +2 -1
  33. data/lib/dicom/parent.rb +34 -86
  34. data/lib/dicom/sequence.rb +1 -13
  35. data/lib/dicom/stream.rb +94 -114
  36. data/rakefile.rb +1 -1
  37. metadata +73 -36
  38. data/README.rdoc +0 -149
  39. data/lib/dicom/ruby_extensions.rb +0 -249
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 39b5531cc2e35e76e34a22584cd3543462c371c6
4
- data.tar.gz: d4c4309d054a1c2495c746956c5aa5a67536edcb
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NDBiM2UzMTdiODE5YzU1MThmYzVmYjkwY2NkMWRlMDgyZDA4OTMyMA==
5
+ data.tar.gz: !binary |-
6
+ OThhOTYwZTA5NjY0MTQ0ZDczNDM2NGMyYTA4M2M4OGM1YjMzZTM0OA==
5
7
  SHA512:
6
- metadata.gz: 68a07acd231106b00284009a3799621f44fa050944ea0076367545f807b76e5b57c1771cca985879951c80f0004ada6615e9c2a7bd9170d07fffe6dae62a57d1
7
- data.tar.gz: 28f1655dea19ba8530a4f6aacaf307e7734ea153f0a546248289b43ccf949c8734179bb768db8bc57418ce25e1e112e918099bdfc03023d01b4110e0f36d0d2c
8
+ metadata.gz: !binary |-
9
+ MWY5ODI2NTgyOTQ3ZDgwODBiNjVjZTE1MThmYTIwYjU4YTYxODI0MmNmMjk3
10
+ NzIyYzQ5YmY1Y2M1NTk4ODE4OGU5ZDY1MzQyM2VjMjdhZjJmMGE3MjIwYTRk
11
+ YzdiYzg0Nzk4ZmI2ZWQ1OWJlNWY4MTU5ZTZmMDQ5MzAzNmRmMWE=
12
+ data.tar.gz: !binary |-
13
+ MGY0YjBlZTI3ZDk3YzNkYmE3NzI1ZjFhYmYwZDcyZmE2NDJhNjIzZDEzNjI5
14
+ NzQ3ZjY5N2FjZTVlODQyNGNiN2VhMmQ1NTQ2YjRmMmJjYzRkYjYzYjQ0ZWIw
15
+ ZmJlZjAwYWMyZWZhN2UwZjg2MjcwYWYxMjMwOTE3YzQ0NTExNTA=
@@ -1,6 +1,26 @@
1
- = 0.9.5
1
+ # 0.9.6
2
2
 
3
- === 26th March, 2013
3
+ ## 20th June, 2014
4
+
5
+ * Fixed an issue where role negotiation in the network code would cause an exception.
6
+ * Fixed an issue where a C-Move request could terminate instead of properly waiting for a receipt.
7
+ * Fixed an issue where network code would hang waiting for a response when it doesn't get any.
8
+ * Automatically load RMagick/mini_magick when using the image methods, to avoid confusing exceptions.
9
+ * Made json and yaml gem dependencies, to avoid unexpected exceptions when using the #to_json and #to_yaml methods.
10
+ * Give a warning instead of raising an error when Parent#delete and #value gets an obviously invalid argument.
11
+ * Introduced Parent#representation, giving a description of the parent objects Sequence, Item & DObject.
12
+ * Refactored various methods for improved code simplicity.
13
+ * Upgraded specification to use RSpec 3.
14
+ * Changed information files from RDoc to Markdown format.
15
+ * Performance improvement when writing DICOM string segments.
16
+ * Changed element and uid dictionaries from .txt to .tsv.
17
+ * Bumped required Ruby version to 1.9.3.
18
+ * Replaced the custom encoding/decoding of big endian numbers with the Ruby standard library implementation.
19
+
20
+
21
+ # 0.9.5
22
+
23
+ ## 26th March, 2013
4
24
 
5
25
  * DICOM module:
6
26
  * Use hyphen instead of underscore in ruby-dicom application title.
@@ -42,9 +62,9 @@
42
62
  * Added Anonymizer :encryption option, which allows the simulatenous preservation of privacy and key/value relations in the audit file.
43
63
 
44
64
 
45
- = 0.9.4
65
+ # 0.9.4
46
66
 
47
- === 10th September, 2012
67
+ ## 10th September, 2012
48
68
 
49
69
  * Converted the documentation format from RDOC to YARD.
50
70
  * Removed deprecated remove_* methods (use the delete_* versions instead).
@@ -64,9 +84,9 @@
64
84
  * Refactored read and write code to get rid of the 'private' DRead and DWrite classes.
65
85
 
66
86
 
67
- = 0.9.3
87
+ # 0.9.3
68
88
 
69
- === 6th May, 2012
89
+ ## 6th May, 2012
70
90
 
71
91
  * Deprecated all #remove* methods (replaced with #delete*) to increase consistency with Ruby.
72
92
  * Changed preferred DObject variable name from obj to dcm for all examples.
@@ -83,9 +103,9 @@
83
103
  * Optimizations and code cleanups allowed by the introduced Ruby 1.9 requirement.
84
104
 
85
105
 
86
- = 0.9.2
106
+ # 0.9.2
87
107
 
88
- === 10th Oct, 2011
108
+ ## 10th Oct, 2011
89
109
 
90
110
  * Enabled the use of lower case tag letters in methods which previously required the use of upper case letters.
91
111
  * Added new DObject class methods to offload DObject#new:
@@ -99,16 +119,16 @@
99
119
  * Supports information levels, logging to file, and more as available in the Ruby Logger.
100
120
 
101
121
 
102
- = 0.9.1
122
+ # 0.9.1
103
123
 
104
- === 27th May, 2011
124
+ ## 27th May, 2011
105
125
 
106
126
  * Fixed a regression in 0.9 where ruby-dicom would cause a Rails application to crash.
107
127
 
108
128
 
109
- = 0.9
129
+ # 0.9
110
130
 
111
- === 17th May, 2011
131
+ ## 17th May, 2011
112
132
 
113
133
  * Fixed an issue where data elements added to a DObject didn't get their endianness updated.
114
134
  * Added the ability to encode/decode 32 bit pixel data.
@@ -164,9 +184,9 @@
164
184
  * Various bug fixes.
165
185
 
166
186
 
167
- = 0.8
187
+ # 0.8
168
188
 
169
- === 1st August, 2010
189
+ ## 1st August, 2010
170
190
 
171
191
  * Overall changes:
172
192
  * A complete rewrite of data element handling has resulted in a substantially different syntax and significantly cleaner and simpler code.
@@ -219,9 +239,9 @@
219
239
  * Properly receives and responds to a C-ECHO-RQ.
220
240
 
221
241
 
222
- = 0.7
242
+ # 0.7
223
243
 
224
- === 28th February, 2010
244
+ ## 28th February, 2010
225
245
 
226
246
  * Added set_image() and set_image_narray() methods to write pixel data to the DICOM object, complementing set_image_magick().
227
247
  * Added method get_image() which retrieves pixel data to a standard Ruby Array.
@@ -251,9 +271,9 @@
251
271
  * Various "under the hood" improvements and code cleanups.
252
272
 
253
273
 
254
- = 0.6.1
274
+ # 0.6.1
255
275
 
256
- === 23rd August, 2009
276
+ ## 23rd August, 2009
257
277
 
258
278
  * Fixed a bug (introduced in version 0.6) where the creation of new data elements caused an error.
259
279
  * Fixed a bug (introduced in version 0.6) where compressed pixel data were no longer detected correctly.
@@ -262,9 +282,9 @@
262
282
  * Fixed a bug where retrieving a RMagick image from DICOM files containing two sets of image data failed.
263
283
 
264
284
 
265
- = 0.6
285
+ # 0.6
266
286
 
267
- === 13th August, 2009
287
+ ## 13th August, 2009
268
288
 
269
289
  * Complete rewrite of encoding/decoding to reduce code duplication and simplify the code.
270
290
  * General optimizations to improve speed and reduce code complexity.
@@ -275,9 +295,9 @@
275
295
  * The new DServer class presents the ability to set up a simple storage server (Service Class Provider).
276
296
 
277
297
 
278
- = 0.5
298
+ # 0.5
279
299
 
280
- === 4th May, 2009
300
+ ## 4th May, 2009
281
301
 
282
302
  * Several small changes have been made to achieve compatibility with both Ruby versions 1.8 and 1.9.
283
303
  * Implemented a change in syntax for several methods with a goal of simplification.
@@ -295,9 +315,9 @@
295
315
  * Fixed a bug where exception folders where ignored in the Anonymizer class.
296
316
 
297
317
 
298
- = 0.4
318
+ # 0.4
299
319
 
300
- === 3rd February, 2009
320
+ ## 3rd February, 2009
301
321
 
302
322
  * Change of syntax: Options are now supplied as hash.
303
323
  * Method below() renamed to children().
@@ -320,9 +340,9 @@
320
340
  to offer a fairly powerful and customizable tool for anonymizing your DICOM files.
321
341
 
322
342
 
323
- = 0.3
343
+ # 0.3
324
344
 
325
- === 12th October, 2008
345
+ ## 12th October, 2008
326
346
 
327
347
  * The DRead class is now able to keep track of the position of the tags inside the hierarchy of sequences and items.
328
348
  * DObject class has seen a number of improvements to allow taking advantage of this hierarchy awareness:
@@ -335,9 +355,9 @@
335
355
  * Method print_properties() have been updated to display more information about the DICOM object.
336
356
 
337
357
 
338
- = 0.2
358
+ # 0.2
339
359
 
340
- === 10th August, 2008
360
+ ## 10th August, 2008
341
361
 
342
362
  * Data dictionary has been upgraded and is now compliant to the official standard.
343
363
  * New DLibrary class which handles all interaction with the dictionary.
@@ -347,9 +367,9 @@
347
367
  * Added option to load DICOM object in verbose or silent mode.
348
368
 
349
369
 
350
- = 0.1
370
+ # 0.1
351
371
 
352
- === 20th July, 2008
372
+ ## 20th July, 2008
353
373
 
354
374
  First public release.
355
375
  The library does have several known issues and lacks some features I would like it to have, but it does
@@ -1,12 +1,12 @@
1
- = Contributing Code
1
+ # Contributing Code
2
2
 
3
- So you want to contribute to ruby-dicom? That's great! Thank you! If you are a
3
+ So you want to contribute to ruby-dicom? That's great, thank you! If you are a
4
4
  first time committer however, you must to take a moment to read these instructions.
5
5
 
6
6
  The preferred method, by far, is to convey your code contribution in the form
7
- of a pull request on {github}[https://github.com/dicom/ruby-dicom].
7
+ of a [github](https://github.com/dicom/ruby-dicom) pull request.
8
8
 
9
- == Committer's Recipe
9
+ ## Committer's Recipe
10
10
 
11
11
  * Fork the repository (for bonus points, use a topical branch name).
12
12
  * Execute the specification (rspec tests) to verify that all spec examples pass
@@ -16,23 +16,23 @@ of a pull request on {github}[https://github.com/dicom/ruby-dicom].
16
16
  * Alter the code to make the new spec example(s) pass.
17
17
  * Keep it simple! One issue per pull request. Mixing two or more independent
18
18
  issues in the same pull request will complicate the review of your request and
19
- may result in a rejection (even if independent parts of the commit are sound).
20
- * Don't modify the version or changelog.
19
+ may result in a rejection (even if individual components of the commit are sound).
20
+ * Don't modify the version string or the Changelog.
21
21
  * Push to your fork and submit a pull request.
22
22
  * Wait for feedback (this shouldn't take too long). The pull request may be accepted right
23
23
  away, it may be rejected (with a reason specified), or it may spark a discussion where
24
24
  changes/improvements are suggested in order for the pull request to be accepted.
25
25
 
26
- == Guidelines
26
+ ## Guidelines
27
27
 
28
28
  In order to increase the chances of your pull request being accepted,
29
29
  please follow the project's coding guidelines. Ideally, your contribution must not
30
- add {technical debt}[http://en.wikipedia.org/wiki/Technical_debt] to the project.
30
+ add [technical debt](http://en.wikipedia.org/wiki/Technical_debt) to the project.
31
31
 
32
32
  * Provide thorough documentation. It should follow the format used by this project
33
33
  and give information on parameters, exceptions and return values where relevant.
34
34
  Provide examples for non-trivial use cases.
35
- * Read the excellent {Github Ruby Styleguide}[https://github.com/styleguide/ruby]
35
+ * Read the excellent [Github Ruby Styleguide](https://github.com/styleguide/ruby)
36
36
  if you are new to collaborative Ruby development. Do note though, that we actually
37
37
  don't follow all styles listed yet (perhaps we should?!).
38
38
  * Some sample patterns of ours:
@@ -42,9 +42,9 @@ add {technical debt}[http://en.wikipedia.org/wiki/Technical_debt] to the project
42
42
  * Assignment: a = b and not a=b
43
43
  * In general: Follow the conventions you see used in the source code already.
44
44
 
45
- == Contribution Agreement
45
+ ## Contribution Agreement
46
46
 
47
- ruby-dicom is licensed under the {GPL v3}[http://www.gnu.org/licenses/gpl.html],
47
+ ruby-dicom is licensed under the [GPL v3](http://www.gnu.org/licenses/gpl.html),
48
48
  and to be in the best position to enforce the GPL, the copyright status of ruby-dicom
49
49
  needs to be as simple as possible. To achieve this, contributors should only provide
50
50
  contributions which are their own work, and either:
@@ -58,26 +58,26 @@ b) Disclaim copyright on it and thus put it in the public domain
58
58
  Copyright assignment (a) is the preferred and encouraged option for larger
59
59
  code contributions, and is assumed unless otherwise is specified.
60
60
 
61
- Please see the {GNU FAQ}[http://www.gnu.org/licenses/gpl-faq.html#AssignCopyright]
61
+ Please see the [GNU FAQ](http://www.gnu.org/licenses/gpl-faq.html#AssignCopyright)
62
62
  for a fuller explanation of the need for this.
63
63
 
64
- == Credits
64
+ ## Credits
65
65
 
66
66
  All contributors are credited, with full name and link to their github account,
67
67
  in the README file. If such an accreditation is not wanted (for whatever reason),
68
68
  please let me know so, either in the pull request or in private.
69
69
 
70
70
 
71
- = Other ways to contribute
71
+ # Other ways to contribute
72
72
 
73
- Don't want to get your hands dirty with source code and git? Don't worry,
73
+ Not ready to get your hands dirty with source code and git? Don't worry,
74
74
  there are other ways in which you can contribute to the project as well!
75
75
 
76
76
  * Create an issue on github for feature requests or bug reports.
77
77
  * Weigh in with your opinion on existing issues.
78
78
  * Write a tutorial.
79
79
  * Answer questions, or tell the community about your exciting ruby-dicom projects in the
80
- {mailing list}[http://groups.google.com/group/ruby-dicom].
80
+ [mailing list](http://groups.google.com/group/ruby-dicom).
81
81
  * Academic works: Properly reference ruby-dicom in your work and tell us about it.
82
82
  * Spread the word: Tell your colleagues about ruby-dicom.
83
83
  * Make a donation.
@@ -0,0 +1,47 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ dicom (0.9.6)
5
+
6
+ GEM
7
+ remote: http://www.rubygems.org/
8
+ specs:
9
+ diff-lcs (1.2.5)
10
+ metaclass (0.0.4)
11
+ mini_magick (3.7.0)
12
+ subexec (~> 0.2.1)
13
+ mocha (1.1.0)
14
+ metaclass (~> 0.0.1)
15
+ narray (0.6.0.8)
16
+ rake (10.3.2)
17
+ redcarpet (3.1.2)
18
+ rmagick (2.13.2)
19
+ rspec (3.0.0)
20
+ rspec-core (~> 3.0.0)
21
+ rspec-expectations (~> 3.0.0)
22
+ rspec-mocks (~> 3.0.0)
23
+ rspec-core (3.0.1)
24
+ rspec-support (~> 3.0.0)
25
+ rspec-expectations (3.0.1)
26
+ diff-lcs (>= 1.2.0, < 2.0)
27
+ rspec-support (~> 3.0.0)
28
+ rspec-mocks (3.0.1)
29
+ rspec-support (~> 3.0.0)
30
+ rspec-support (3.0.0)
31
+ subexec (0.2.3)
32
+ yard (0.8.7.3)
33
+
34
+ PLATFORMS
35
+ x86-mingw32
36
+
37
+ DEPENDENCIES
38
+ bundler (~> 1.6)
39
+ dicom!
40
+ mini_magick (~> 3.7)
41
+ mocha (~> 1.1)
42
+ narray (~> 0.6.0.8)
43
+ rake (~> 10.3)
44
+ redcarpet (~> 3.1)
45
+ rmagick (~> 2.13.2)
46
+ rspec (~> 3.0)
47
+ yard (~> 0.8.7)
@@ -0,0 +1,152 @@
1
+ # RUBY DICOM
2
+
3
+ Ruby DICOM is a small and simple library for handling DICOM in Ruby. DICOM (Digital Imaging
4
+ and Communications in Medicine) is a standard for handling, storing, printing,
5
+ and transmitting information in medical imaging. It includes a file format definition
6
+ and a network communications protocol. Ruby DICOM supports reading from, editing
7
+ and writing to this file format. It also features basic support for select network
8
+ communication modalities like querying, moving, sending and receiving files.
9
+
10
+
11
+ ## INSTALLATION
12
+
13
+ gem install dicom
14
+
15
+
16
+ ## REQUIREMENTS
17
+
18
+ * Ruby 1.9.3 (if you are still on Ruby 1.8, gems up to version 0.9.1 can be used)
19
+
20
+
21
+ ## BASIC USAGE
22
+
23
+ ### Load & Include
24
+
25
+ require 'dicom'
26
+ include DICOM
27
+
28
+ ### Read, modify and write
29
+
30
+ # Read file:
31
+ dcm = DObject.read("some_file.dcm")
32
+ # Extract the Patient's Name value:
33
+ dcm.patients_name.value
34
+ # Add or modify the Patient's Name element:
35
+ dcm.patients_name = "Anonymous"
36
+ # Remove a data element from the DICOM object:
37
+ dcm.pixel_data = nil
38
+ # Write to file:
39
+ dcm.write("new_file.dcm")
40
+
41
+ ### Modify using tag strings instead of dictionary method names
42
+
43
+ # Extract the Patient's Name value:
44
+ dcm.value("0010,0010")
45
+ # Modify the Patient's Name element:
46
+ dcm["0010,0010"].value = "Anonymous"
47
+ # Delete a data element from the DICOM object:
48
+ dcm.delete("7FE0,0010")
49
+
50
+ ### Extracting information about the DICOM object
51
+
52
+ # Display a short summary of the file's properties:
53
+ dcm.summary
54
+ # Print all data elements to screen:
55
+ dcm.print
56
+ # Convert the data element hierarchy to a nested hash:
57
+ dcm.to_hash
58
+
59
+ ### Handle pixel data
60
+
61
+ # Retrieve the pixel data in a Ruby Array:
62
+ dcm.pixels
63
+ # Load the pixel data to an numerical array (NArray):
64
+ dcm.narray
65
+ # Load the pixel data to an RMagick image object and display it on screen (X):
66
+ dcm.image.normalize.display
67
+
68
+ ### Transmit a DICOM file
69
+
70
+ # Send a local file to a server (PACS) over the network:
71
+ node = DClient.new("10.1.25.200", 104)
72
+ node.send("some_file.dcm")
73
+
74
+ ### Start a DICOM server
75
+
76
+ # Initiate a simple storage provider which can receive DICOM files of all modalities:
77
+ s = DServer.new(104, :host_ae => "MY_DICOM_SERVER")
78
+ s.start_scp("C:/temp/")
79
+
80
+ ### Log settings
81
+
82
+ # Change the log level so that only error messages are displayed:
83
+ DICOM.logger.level = Logger::ERROR
84
+ # Setting up a simple file log:
85
+ l = Logger.new('my_logfile.log')
86
+ DICOM.logger = l
87
+ # Create a logger which ages logfile daily/monthly:
88
+ DICOM.logger = Logger.new('foo.log', 'daily')
89
+ DICOM.logger = Logger.new('foo.log', 'monthly')
90
+
91
+
92
+ ### IRB Tip
93
+
94
+ When working with Ruby DICOM in irb, you may be annoyed with all the information
95
+ that is printed to screen, regardless if you have set verbose as false. This is because
96
+ in irb every variable loaded in the program is automatically printed to the screen.
97
+ A useful hack to avoid this effect is to append ";0" after a command.
98
+ Example:
99
+
100
+ dcm = DObject.read("some_file.dcm") ;0
101
+
102
+
103
+ ## RESOURCES
104
+
105
+ * [Official home page](http://dicom.rubyforge.org/)
106
+ * [Discussion forum](http://groups.google.com/group/ruby-dicom)
107
+ * [Documentation](http://rubydoc.info/gems/dicom/frames)
108
+ * [Tutorials](http://dicom.rubyforge.org/tutorials.html)
109
+ * [Source code repository](https://github.com/dicom/ruby-dicom)
110
+
111
+
112
+ ## COPYRIGHT
113
+
114
+ Copyright 2008-2014 Christoffer Lervåg
115
+
116
+ This program is free software: you can redistribute it and/or modify
117
+ it under the terms of the GNU General Public License as published by
118
+ the Free Software Foundation, either version 3 of the License, or
119
+ (at your option) any later version.
120
+
121
+ This program is distributed in the hope that it will be useful,
122
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
123
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
124
+ GNU General Public License for more details.
125
+
126
+ You should have received a copy of the GNU General Public License
127
+ along with this program. If not, see http://www.gnu.org/licenses/ .
128
+
129
+
130
+ ## ABOUT THE AUTHOR
131
+
132
+ * Name: Christoffer Lervåg
133
+ * Location: Norway
134
+ * Email: chris.lervag [@nospam.com] @gmail.com
135
+
136
+ Please don't hesitate to email me if you have any feedback related to this project!
137
+
138
+
139
+ ## CONTRIBUTORS
140
+
141
+ * [Christoffer Lervåg](https://github.com/dicom)
142
+ * [John Axel Eriksson](https://github.com/johnae)
143
+ * [Kamil Bujniewicz](https://github.com/icdark)
144
+ * [Jeff Miller](https://github.com/jeffmax)
145
+ * [Donnie Millar](https://github.com/dmillar)
146
+ * [Björn Albers](https://github.com/bjoernalbers)
147
+ * [Felix Petriconi](https://github.com/FelixPetriconi)
148
+ * [Greg Tangey](https://github.com/Ruxton)
149
+ * [Cian Hughes](https://github.com/cian)
150
+ * [Steven Bedrick](https://github.com/stevenbedrick)
151
+ * [Lars Benner](https://github.com/Maturin)
152
+ * [Brett Goulder](https://github.com/brettgoulder)