wash_out_fork 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +36 -0
  5. data/Appraisals +25 -0
  6. data/CHANGELOG.md +102 -0
  7. data/Gemfile +17 -0
  8. data/Guardfile +12 -0
  9. data/LICENSE +22 -0
  10. data/README.md +242 -0
  11. data/Rakefile +25 -0
  12. data/app/helpers/wash_out_fork_helper.rb +110 -0
  13. data/app/views/wash_out_fork/document/error.builder +9 -0
  14. data/app/views/wash_out_fork/document/response.builder +8 -0
  15. data/app/views/wash_out_fork/document/wsdl.builder +68 -0
  16. data/app/views/wash_out_fork/rpc/error.builder +10 -0
  17. data/app/views/wash_out_fork/rpc/response.builder +9 -0
  18. data/app/views/wash_out_fork/rpc/wsdl.builder +68 -0
  19. data/gemfiles/rails_3.2.13.gemfile +21 -0
  20. data/gemfiles/rails_4.0.0.gemfile +20 -0
  21. data/gemfiles/rails_4.1.0.gemfile +20 -0
  22. data/gemfiles/rails_4.2.0.gemfile +20 -0
  23. data/gemfiles/rails_5.0.0.beta2.gemfile +19 -0
  24. data/gemfiles/rails_5.0.0.gemfile +19 -0
  25. data/init.rb +1 -0
  26. data/lib/wash_out_fork.rb +60 -0
  27. data/lib/wash_out_fork/configurable.rb +41 -0
  28. data/lib/wash_out_fork/dispatcher.rb +232 -0
  29. data/lib/wash_out_fork/engine.rb +12 -0
  30. data/lib/wash_out_fork/middleware.rb +41 -0
  31. data/lib/wash_out_fork/model.rb +29 -0
  32. data/lib/wash_out_fork/param.rb +200 -0
  33. data/lib/wash_out_fork/router.rb +131 -0
  34. data/lib/wash_out_fork/soap.rb +48 -0
  35. data/lib/wash_out_fork/soap_config.rb +93 -0
  36. data/lib/wash_out_fork/type.rb +29 -0
  37. data/lib/wash_out_fork/version.rb +3 -0
  38. data/lib/wash_out_fork/wsse.rb +101 -0
  39. data/spec/dummy/Rakefile +7 -0
  40. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  41. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  42. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  43. data/spec/dummy/config.ru +4 -0
  44. data/spec/dummy/config/application.rb +51 -0
  45. data/spec/dummy/config/boot.rb +10 -0
  46. data/spec/dummy/config/environment.rb +5 -0
  47. data/spec/dummy/config/environments/development.rb +23 -0
  48. data/spec/dummy/config/environments/test.rb +30 -0
  49. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  50. data/spec/dummy/config/initializers/inflections.rb +10 -0
  51. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  52. data/spec/dummy/config/initializers/secret_token.rb +8 -0
  53. data/spec/dummy/config/initializers/session_store.rb +8 -0
  54. data/spec/dummy/config/locales/en.yml +5 -0
  55. data/spec/dummy/config/routes.rb +58 -0
  56. data/spec/dummy/public/404.html +26 -0
  57. data/spec/dummy/public/422.html +26 -0
  58. data/spec/dummy/public/500.html +26 -0
  59. data/spec/dummy/public/favicon.ico +0 -0
  60. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  61. data/spec/dummy/script/rails +6 -0
  62. data/spec/fixtures/nested_refs_to_arrays.xml +19 -0
  63. data/spec/fixtures/ref_to_one_array.xml +11 -0
  64. data/spec/fixtures/refs_to_arrays.xml +16 -0
  65. data/spec/lib/wash_out/dispatcher_spec.rb +206 -0
  66. data/spec/lib/wash_out/middleware_spec.rb +33 -0
  67. data/spec/lib/wash_out/param_spec.rb +94 -0
  68. data/spec/lib/wash_out/router_spec.rb +50 -0
  69. data/spec/lib/wash_out/type_spec.rb +41 -0
  70. data/spec/lib/wash_out_spec.rb +797 -0
  71. data/spec/spec_helper.rb +88 -0
  72. data/wash_out_fork.gemspec +20 -0
  73. metadata +130 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 57311231b4c342b0cf80cefbb773339db5cf8d71
4
+ data.tar.gz: 238153122d4eb5e62930edfbf2dc336deb1122bf
5
+ SHA512:
6
+ metadata.gz: 149f48d42bb3ff3d154a9de61d6967534bd5b6e743d4df4c67de553e37dc37070e8c2f5486c950e46105313550bdfc11bde2573276230ee06b5ecfa49a3c29eb
7
+ data.tar.gz: f8ec078af49a4896f780e84a08da65b2ffc335c9e07603b1c8410d77ed718ed2a146acb48004d216615e70306f73022a8b384444f92d739a92d70432356e0012
@@ -0,0 +1,17 @@
1
+ .rbx/
2
+ .bundle/
3
+ *.gem
4
+ .idea/
5
+ .ruby-gemset
6
+ .ruby-version
7
+ .rvmrc
8
+ *.swp
9
+ log/*.log
10
+ pkg/
11
+ spec/dummy/db/*.sqlite3
12
+ spec/dummy/log/*.log
13
+ spec/dummy/tmp/
14
+ gemfiles/*.lock
15
+ coverage
16
+ tags
17
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,36 @@
1
+ script: bundle exec rspec
2
+ gemfile:
3
+ - gemfiles/rails_3.2.13.gemfile
4
+ - gemfiles/rails_4.0.0.gemfile
5
+ - gemfiles/rails_4.1.0.gemfile
6
+ - gemfiles/rails_4.2.0.gemfile
7
+ - gemfiles/rails_5.0.0.gemfile
8
+ rvm:
9
+ - 1.9.3
10
+ - 2.0.0
11
+ - 2.1.8
12
+ - 2.2.4
13
+ - 2.3.0
14
+ - jruby
15
+ matrix:
16
+ exclude:
17
+ - rvm: 2.2.4
18
+ gemfile: gemfiles/rails_3.2.13.gemfile
19
+ - rvm: 2.3.0
20
+ gemfile: gemfiles/rails_3.2.13.gemfile
21
+ - rvm: 1.9.3
22
+ gemfile: gemfiles/rails_4.0.0.gemfile
23
+ - rvm: 1.9.3
24
+ gemfile: gemfiles/rails_4.2.0.gemfile
25
+ - rvm: jruby
26
+ gemfile: gemfiles/rails_4.2.0.gemfile
27
+ - rvm: 1.9.3
28
+ gemfile: gemfiles/rails_5.0.0.gemfile
29
+ - rvm: 2.0.0
30
+ gemfile: gemfiles/rails_5.0.0.gemfile
31
+ - rvm: 2.1.8
32
+ gemfile: gemfiles/rails_5.0.0.gemfile
33
+ - rvm: jruby
34
+ gemfile: gemfiles/rails_5.0.0.gemfile
35
+ before_install:
36
+ - gem update bundler
@@ -0,0 +1,25 @@
1
+ appraise "rails-3.2.13" do
2
+ gem "rails", "3.2.13"
3
+ gem "test-unit"
4
+ gem "listen", "< 3.1.0"
5
+ end
6
+
7
+ appraise "rails-4.0.0" do
8
+ gem "rails", "4.0.0"
9
+ gem "listen", "< 3.1.0"
10
+ end
11
+
12
+ appraise "rails-4.1.0" do
13
+ gem "rails", "4.1.0"
14
+ gem "listen", "< 3.1.0"
15
+ end
16
+
17
+ appraise "rails-4.2.0" do
18
+ gem "rails", "4.2.0"
19
+ gem "listen", "< 3.1.0"
20
+ end
21
+
22
+
23
+ appraise "rails-5.0.0" do
24
+ gem "rails", "5.0.0"
25
+ end
@@ -0,0 +1,102 @@
1
+ # Changelog
2
+
3
+ ## Not Supported!
4
+
5
+ This is here for historical reasons. Please refer to [Releases](https://github.com/inossidabile/wash_out_fork/releases) page to get actual information.
6
+
7
+ ## 0.7.1
8
+
9
+ * Parser switcher [@inossidabile][]
10
+ * Namespaces support patched [@inossidabile][]
11
+
12
+ ## 0.7.0
13
+
14
+ * WSDL Document mode support [@gorism][]
15
+
16
+ ## 0.6.0
17
+
18
+ * Switched to Savon2 family [@inossidabile][]
19
+ * Main spec refactored greatly [@inossidabile][]
20
+
21
+ ## 0.5.4
22
+
23
+ * Ability to manually specify `response_tag` for `soap_action` [@inossidabile][]
24
+
25
+ ## 0.5.2
26
+
27
+ * .NET-compliant response tags [@ebeigarts][]
28
+ * Tiny fixes [@ebeigarts][]
29
+
30
+ ## 0.5.1
31
+
32
+ * Better routing points [@inossidabile][]
33
+
34
+ ## 0.5.0
35
+
36
+ * WSSE password authentication [@dhinus][]
37
+ * Ruby 1.8 compatibility restores [@dhinus][]
38
+
39
+ ## 0.4.2
40
+
41
+ * SOAP hrefs are now supported [@inossidabile][]
42
+ * Better camelization: reusable types and methods are now supported [@inossidabile][]
43
+
44
+ ## 0.4.1
45
+
46
+ * .NET-compliant :integer type WSDL [@inossidabile][]
47
+
48
+ ## 0.4.0
49
+
50
+ * Better content-type for the response (#33) [@inossidabile][]
51
+ * Date type support (#18) [@inossidabile][]
52
+ * Avoid duplication of inner types [@inossidabile][]
53
+ * Output camelization support [@inossidabile][]
54
+ * External types declaration support (#21, #41) [@inossidabile][]
55
+
56
+ ## 0.3.7
57
+
58
+ * Better empty parameters handling (#26, #30) [@rngtng][]
59
+
60
+ ## 0.3.6
61
+
62
+ * Unicorn stream reading bug (#20)
63
+ * .NET minOccurs/maxOccurs basic WSDL compatibility (#22, #23)
64
+
65
+ ## 0.3.5
66
+
67
+ * Very evil thread-safety bug fixed. You are encouraged to never use anything below this version.
68
+
69
+ ## 0.3.4
70
+
71
+ * WSDL generation fixed to support complex structures for return values
72
+ * Configuration moved to OrderedOptions with proper Engine binding
73
+ * `snakecase` configuration directive added: if set to false, wash_out_fork won't modify params keys
74
+
75
+ ## 0.3.3
76
+
77
+ * Tiny fixes in wash_out_fork behavior with inline arrays (#11, #12)
78
+ * Ability to change namespace
79
+
80
+ ## 0.3.2
81
+
82
+ * WashOutFork doesn't check existance of parameters anymore you should do it yourself from now
83
+ * Proper handling of blank parameters (#10)
84
+ * Proper handling of complex structures inside arrays (#9)
85
+ * Response performance improved
86
+
87
+ ## 0.3.1
88
+
89
+ * Support of complex structures inside array
90
+ * Better Nori handling (no more dependency on Savon hijacking)
91
+
92
+ ## 0.3.0
93
+
94
+ * The syntax for empty set (no input params or output params) changed from [] to nil.
95
+ * SOAP response format improved. All results are now wrapped into tns:messages instead of soap:Body.
96
+ * Arrays (minOccurs/maxOccurs) are now supported with `:foo => [:integer]` syntax.
97
+
98
+ [@inossidabile]: http://staal.io
99
+ [@rngtng]: https://github.com/rngtng
100
+ [@dhinus]: https://github.com/dhinus
101
+ [@ebeigarts]: https://github.com/ebeigarts
102
+ [@gorism]: https://github.com/gorism
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ gem 'wasabi'
6
+ gem 'savon', '>= 2.0.0'
7
+ gem 'httpi'
8
+
9
+ gem 'rspec-rails'
10
+ gem 'guard'
11
+ gem 'guard-rspec'
12
+ gem 'rb-fsevent'
13
+ gem 'appraisal'
14
+ gem 'tzinfo'
15
+ gem 'pry'
16
+ gem 'simplecov'
17
+ gem 'simplecov-summary'
@@ -0,0 +1,12 @@
1
+ # More info at https://github.com/guard/guard#readme
2
+
3
+ # Could be changed to whatever you want.
4
+ # See: https://github.com/guard/guard#notification
5
+ notification :off
6
+
7
+ guard 'rspec' do
8
+ watch %r{^spec/.+_spec\.rb$}
9
+ watch %r{lib/} do 'spec' end
10
+ end
11
+
12
+ # vim:ft=ruby
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2012 Round Lake, inc.,
4
+ Peter Zotov <whitequark@whitequark.org>.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
@@ -0,0 +1,242 @@
1
+ # WashOutFork
2
+
3
+ WashOutFork is a gem that greatly simplifies creation of SOAP service providers.
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/wash_out_fork.png)](http://badge.fury.io/rb/wash_out_fork)
6
+ [![Travis CI](https://secure.travis-ci.org/inossidabile/wash_out_fork.png)](https://travis-ci.org/inossidabile/wash_out_fork)
7
+ [![Code Climate](https://codeclimate.com/github/inossidabile/wash_out_fork.png)](https://codeclimate.com/github/inossidabile/wash_out_fork)
8
+
9
+ But if you have a chance, please [http://stopsoap.com/](http://stopsoap.com/).
10
+
11
+ ## Compatibility
12
+
13
+ Rails 3.2.13 and higher (if you are using SOAP and still on Ruby 1.9 - that's just too much evil, sorry)
14
+
15
+ ## Installation
16
+
17
+ In your Gemfile, add this line:
18
+
19
+ gem 'wash_out_fork'
20
+
21
+ Please read [release details](https://github.com/inossidabile/wash_out_fork/releases) if you are upgrading. We break backward compatibility between large ticks but you can expect it to be specified at release notes.
22
+
23
+ ## Usage
24
+
25
+ A SOAP endpoint in WashOutFork is simply a Rails controller which includes the module WashOutFork::SOAP. Each SOAP
26
+ action corresponds to a certain controller method; this mapping, as well as the argument definition, is defined
27
+ by [soap_action][] method. Check the method documentation for complete info; here, only a few examples will be
28
+ demonstrated.
29
+
30
+ [soap_action]: http://rubydoc.info/gems/wash_out_fork/WashOutFork/SOAP/ClassMethods#soap_action-instance_method
31
+
32
+ ```ruby
33
+ # app/controllers/rumbas_controller.rb
34
+ class RumbasController < ApplicationController
35
+ soap_service namespace: 'urn:WashOutFork'
36
+
37
+ # Simple case
38
+ soap_action "integer_to_string",
39
+ :args => :integer,
40
+ :return => :string
41
+ def integer_to_string
42
+ render :soap => params[:value].to_s
43
+ end
44
+
45
+ soap_action "concat",
46
+ :args => { :a => :string, :b => :string },
47
+ :return => :string
48
+ def concat
49
+ render :soap => (params[:a] + params[:b])
50
+ end
51
+
52
+ # Complex structures
53
+ soap_action "AddCircle",
54
+ :args => { :circle => { :center => { :x => :integer,
55
+ :y => :integer },
56
+ :radius => :double } },
57
+ :return => nil, # [] for wash_out_fork below 0.3.0
58
+ :to => :add_circle
59
+ def add_circle
60
+ circle = params[:circle]
61
+
62
+ raise SOAPError, "radius is too small" if circle[:radius] < 3.0
63
+
64
+ Circle.new(circle[:center][:x], circle[:center][:y], circle[:radius])
65
+
66
+ render :soap => nil
67
+ end
68
+
69
+ # Arrays
70
+ soap_action "integers_to_boolean",
71
+ :args => { :data => [:integer] },
72
+ :return => [:boolean]
73
+ def integers_to_boolean
74
+ render :soap => params[:data].map{|i| i > 0}
75
+ end
76
+
77
+ # Params from XML attributes;
78
+ # e.g. for a request to the 'AddCircle' action:
79
+ # <soapenv:Envelope>
80
+ # <soapenv:Body>
81
+ # <AddCircle>
82
+ # <Circle radius="5.0">
83
+ # <Center x="10" y="12" />
84
+ # </Circle>
85
+ # </AddCircle>
86
+ # </soapenv:Body>
87
+ # </soapenv:Envelope>
88
+ soap_action "AddCircle",
89
+ :args => { :circle => { :center => { :@x => :integer,
90
+ :@y => :integer },
91
+ :@radius => :double } },
92
+ :return => nil, # [] for wash_out_fork below 0.3.0
93
+ :to => :add_circle
94
+ def add_circle
95
+ circle = params[:circle]
96
+ Circle.new(circle[:center][:x], circle[:center][:y], circle[:radius])
97
+
98
+ render :soap => nil
99
+ end
100
+
101
+ # With a customised input tag name, in case params are wrapped;
102
+ # e.g. for a request to the 'IntegersToBoolean' action:
103
+ # <soapenv:Envelope>
104
+ # <soapenv:Body>
105
+ # <MyRequest> <!-- not <IntegersToBoolean> -->
106
+ # <Data>...</Data>
107
+ # </MyRequest>
108
+ # </soapenv:Body>
109
+ # </soapenv:Envelope>
110
+ soap_action "integers_to_boolean",
111
+ :args => { :my_request => { :data => [:integer] } },
112
+ :as => 'MyRequest',
113
+ :return => [:boolean]
114
+
115
+ # You can use all Rails features like filtering, too. A SOAP controller
116
+ # is just like a normal controller with a special routing.
117
+ before_filter :dump_parameters
118
+ def dump_parameters
119
+ Rails.logger.debug params.inspect
120
+ end
121
+ end
122
+ ```
123
+
124
+ ```ruby
125
+ # config/routes.rb
126
+ WashOutForkSample::Application.routes.draw do
127
+ wash_out_fork :rumbas
128
+ end
129
+ ```
130
+
131
+ In such a setup, the generated WSDL may be queried at path `/rumbas/wsdl`. So, with a
132
+ gem like Savon, a request can be done using this path:
133
+
134
+ ```ruby
135
+ require 'savon'
136
+
137
+ client = Savon::Client.new(wsdl: "http://localhost:3000/rumbas/wsdl")
138
+
139
+ client.operations # => [:integer_to_string, :concat, :add_circle]
140
+
141
+ result = client.call(:concat, message: { :a => "123", :b => "abc" })
142
+
143
+ # actual wash_out_fork
144
+ result.to_hash # => {:concat_reponse => {:value=>"123abc"}}
145
+
146
+ # wash_out_fork below 0.3.0 (and this is malformed response so please update)
147
+ result.to_hash # => {:value=>"123abc"}
148
+ ```
149
+
150
+ ## Reusable types
151
+
152
+ Basic inline types definition is fast and furious for the simple cases. You have an option to describe SOAP types
153
+ inside separate classes for the complex ones. Here's the way to do that:
154
+
155
+ ```ruby
156
+ class Fluffy < WashOutFork::Type
157
+ map :universe => {
158
+ :name => :string,
159
+ :age => :integer
160
+ }
161
+ end
162
+
163
+ class FluffyContainer < WashOutFork::Type
164
+ type_name 'fluffy_con'
165
+ map :fluffy => Fluffy
166
+ end
167
+ ```
168
+
169
+ To use defined type inside your inline declaration, pass the class instead of type symbol (`:fluffy => Fluffy`).
170
+
171
+ Note that WashOutFork extends the `ActiveRecord` so every model you use is already a WashOutFork::Type and can be used
172
+ inside your interface declarations.
173
+
174
+ ## WSSE Authentication
175
+
176
+ WashOutFork provides two mechanism for WSSE Authentication.
177
+
178
+ ### Static Authentication
179
+
180
+ You can configure the service to validate against a username and password with the following configuration:
181
+
182
+ ```ruby
183
+ soap_service namespace: "wash_out_fork", wsse_username: "username", wsse_password: "password"
184
+ ```
185
+
186
+ With this mechanism, all the actions in the controller will be authenticated against the specified username and password. If you need to authenticate different users, you can use the dynamic mechanism described below.
187
+
188
+ ### Dynamic Authentication
189
+
190
+ Dynamic authentication allows you to process the username and password any way you want, with the most common case being authenticating against a database. The configuration option for this mechanism is called `wsse_auth_callback`:
191
+
192
+ ```ruby
193
+ soap_service namespace: "wash_out_fork", wsse_auth_callback: ->(username, password) {
194
+ return !User.find_by(username: username).authenticate(password).blank?
195
+ }
196
+ ```
197
+
198
+ Keep in mind that the password may already be hashed by the SOAP client, so you would have to check against that condition too as per [spec](http://www.oasis-open.org/committees/download.php/16782/wss-v1.1-spec-os-UsernameTokenProfile.pdf)
199
+
200
+ ## Configuration
201
+
202
+ Use `config.wash_out_fork...` inside your environment configuration to setup WashOutFork globally.
203
+ To override the values on a specific controller just add an override as part of the arguments to the `soap_service` method.
204
+
205
+ Available properties are:
206
+
207
+ * **parser**: XML parser to use – `:rexml` or `:nokogiri`. The first one is default but the latter is much faster. Be sure to add `gem nokogiri` if you want to use it.
208
+ * **wsdl_style**: sets WSDL style. Supported values are: 'document' and 'rpc'.
209
+ * **catch_xml_errors**: intercept Rails parsing exceptions to return correct XML response for corrupt XML input. Default is `false`.
210
+ * **namespace**: SOAP namespace to use. Default is `urn:WashOutFork`.
211
+ * **snakecase_input**: Determines if WashOutFork should modify parameters keys to snakecase. Default is `false`.
212
+ * **camelize_wsdl**: Determines if WashOutFork should camelize types within WSDL and responses. Supports `true` for CamelCase and `:lower` for camelCase. Default is `false`.
213
+
214
+ ### Camelization
215
+
216
+ Note that WSDL camelization will affect method names but only if they were given as a symbol:
217
+
218
+ ```ruby
219
+ soap_action :foo # this will be affected
220
+ soap_action "foo" # this will be passed as is
221
+ ```
222
+
223
+ ## Maintainers
224
+
225
+ * Boris Staal, [@inossidabile](http://staal.io)
226
+
227
+ ## Contributors (in random order)
228
+
229
+ * Mikael Henriksson, [@mhenrixon](http://twitter.com/mhenrixon)
230
+ * Björn Nilsson [@Bjorn-Nilsson](https://github.com/Bjorn-Nilsson)
231
+ * Tobias Bielohlawek [@rngtng](https://github.com/rngtng)
232
+ * Francesco Negri [@dhinus](https://github.com/dhinus)
233
+ * Edgars Beigarts [@ebeigarts](https://github.com/ebeigarts)
234
+ * [Exad](https://github.com/exad) [@wknechtel](https://github.com/wknechtel) and [@☈king](https://github.com/rking)
235
+ * Mark Goris [@gorism](https://github.com/gorism)
236
+ * ... and [others](https://github.com/inossidabile/wash_out_fork/graphs/contributors)
237
+
238
+ ## License
239
+
240
+ It is free software, and may be redistributed under the terms of MIT license.
241
+
242
+ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/inossidabile/wash_out_fork/trend.png)](https://bitdeli.com/free "Bitdeli Badge")