rest-ftp-daemon 0.222.0 → 0.230.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CODE_OF_CONDUCT.md +13 -0
  4. data/Gemfile.lock +47 -20
  5. data/README.md +160 -94
  6. data/Rakefile +7 -1
  7. data/bin/rest-ftp-daemon +22 -3
  8. data/lib/rest-ftp-daemon.rb +25 -21
  9. data/lib/rest-ftp-daemon/constants.rb +19 -5
  10. data/lib/rest-ftp-daemon/exceptions.rb +2 -1
  11. data/lib/rest-ftp-daemon/helpers.rb +10 -5
  12. data/lib/rest-ftp-daemon/job.rb +181 -304
  13. data/lib/rest-ftp-daemon/job_queue.rb +5 -3
  14. data/lib/rest-ftp-daemon/logger.rb +4 -3
  15. data/lib/rest-ftp-daemon/logger_helper.rb +14 -10
  16. data/lib/rest-ftp-daemon/notification.rb +54 -43
  17. data/lib/rest-ftp-daemon/paginate.rb +2 -2
  18. data/lib/rest-ftp-daemon/path.rb +43 -0
  19. data/lib/rest-ftp-daemon/remote.rb +57 -0
  20. data/lib/rest-ftp-daemon/remote_ftp.rb +141 -0
  21. data/lib/rest-ftp-daemon/remote_sftp.rb +160 -0
  22. data/lib/rest-ftp-daemon/uri.rb +11 -4
  23. data/lib/rest-ftp-daemon/views/dashboard_table.haml +1 -1
  24. data/lib/rest-ftp-daemon/views/dashboard_workers.haml +1 -1
  25. data/lib/rest-ftp-daemon/worker.rb +10 -2
  26. data/lib/rest-ftp-daemon/worker_conchita.rb +12 -6
  27. data/lib/rest-ftp-daemon/worker_job.rb +8 -11
  28. data/rest-ftp-daemon.gemspec +6 -1
  29. data/rest-ftp-daemon.yml.sample +4 -2
  30. data/spec/rest-ftp-daemon/features/dashboard_spec.rb +8 -4
  31. data/spec/rest-ftp-daemon/features/jobs_spec.rb +68 -0
  32. data/spec/rest-ftp-daemon/features/routes_spec.rb +20 -0
  33. data/spec/rest-ftp-daemon/features/status_spec.rb +19 -0
  34. data/spec/spec_helper.rb +6 -2
  35. data/spec/support/config.yml +0 -1
  36. data/spec/support/request_helpers.rb +22 -0
  37. metadata +53 -3
  38. data/.ruby-version +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a37b551aba1fb9064471f18ffa0d783ac5b7aab5
4
- data.tar.gz: e89ea4d47e9fea2cf75bbabf241b25cb1f3a0c72
3
+ metadata.gz: 77ab7d0648a235291fd5cd1f3c0682dc5296d8f7
4
+ data.tar.gz: cfa1db6e26b429e8228b11e65a127774fa270957
5
5
  SHA512:
6
- metadata.gz: 1295e3ea0b82bad61532d4addca8b05b4f2a5372fa0373e03838b608dab74c26f5439bb09647eee73296746006501427acd4123ea110f13f4cd8c592a3f21c01
7
- data.tar.gz: e8a6d8a799496cbf1e51bf6cb77e3424df91f9fe423f5ce9743ceddb9648c9518d7215f3729e8c30c48e150a98da5d99c07415b212215b31ee483f10fe5da049
6
+ metadata.gz: 10059f2656187713a533efa90dbc3100f6092194d97d11d7e95e4ffa9b1dc0ab6a4147f666496d8cf4acdc190526e7d4c828fc90803b0f1488d931fd02110cbb
7
+ data.tar.gz: a0d91e6e6d468c1c693e69b4b8fdfc3de62e70e41646543da9d2a5f3cc63f36599a8d7e5cfce151c8efdfb48d8d18221bc70b271b8fdc9cce71c6c991cee76e6
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ tmp/
6
6
  log/
7
7
  DOC/
8
8
  rest-ftp-daemon.yml
9
+ .ruby-version
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rest-ftp-daemon (0.222.0)
4
+ rest-ftp-daemon (0.230.0)
5
5
  double-bag-ftps
6
6
  facter
7
7
  get_process_mem
@@ -9,6 +9,7 @@ PATH
9
9
  grape-entity
10
10
  haml
11
11
  json
12
+ net-sftp
12
13
  newrelic_rpm
13
14
  settingslogic
14
15
  sys-cpu
@@ -19,21 +20,25 @@ GEM
19
20
  remote: http://rubygems.org/
20
21
  specs:
21
22
  CFPropertyList (2.2.8)
22
- activesupport (4.2.1)
23
+ activesupport (4.2.3)
23
24
  i18n (~> 0.7)
24
25
  json (~> 1.7, >= 1.7.7)
25
26
  minitest (~> 5.1)
26
27
  thread_safe (~> 0.3, >= 0.3.4)
27
28
  tzinfo (~> 1.1)
28
29
  addressable (2.3.8)
30
+ ast (2.0.0)
31
+ astrolabe (1.3.0)
32
+ parser (>= 2.2.0.pre.3, < 3.0)
29
33
  axiom-types (0.1.1)
30
34
  descendants_tracker (~> 0.0.4)
31
35
  ice_nine (~> 0.11.0)
32
36
  thread_safe (~> 0.3, >= 0.3.1)
33
37
  builder (3.2.2)
38
+ coderay (1.1.0)
34
39
  coercible (1.0.0)
35
40
  descendants_tracker (~> 0.0.1)
36
- daemons (1.2.2)
41
+ daemons (1.2.3)
37
42
  descendants_tracker (0.0.4)
38
43
  thread_safe (~> 0.3, >= 0.3.1)
39
44
  diff-lcs (1.2.5)
@@ -44,9 +49,9 @@ GEM
44
49
  eventmachine (1.0.7)
45
50
  facter (2.4.4)
46
51
  CFPropertyList (~> 2.2.6)
47
- ffi (1.9.8)
52
+ ffi (1.9.10)
48
53
  get_process_mem (0.2.0)
49
- grape (0.11.0)
54
+ grape (0.12.0)
50
55
  activesupport
51
56
  builder
52
57
  hashie (>= 2.1.0)
@@ -61,7 +66,7 @@ GEM
61
66
  multi_json (>= 1.3.2)
62
67
  haml (4.0.6)
63
68
  tilt
64
- hashie (3.4.1)
69
+ hashie (3.4.2)
65
70
  http (0.8.12)
66
71
  addressable (~> 2.3)
67
72
  http-cookie (~> 1.0)
@@ -74,30 +79,50 @@ GEM
74
79
  i18n (0.7.0)
75
80
  ice_nine (0.11.1)
76
81
  json (1.8.3)
82
+ method_source (0.8.2)
77
83
  minitest (5.7.0)
78
- multi_json (1.11.0)
84
+ multi_json (1.11.2)
79
85
  multi_xml (0.5.5)
80
- newrelic_rpm (3.12.0.288)
81
- rack (1.6.1)
86
+ net-sftp (2.1.2)
87
+ net-ssh (>= 2.6.5)
88
+ net-ssh (2.9.2)
89
+ newrelic_rpm (3.12.1.298)
90
+ parser (2.3.0.pre.2)
91
+ ast (>= 1.1, < 3.0)
92
+ powerpack (0.1.1)
93
+ pry (0.10.1)
94
+ coderay (~> 1.1.0)
95
+ method_source (~> 0.8.1)
96
+ slop (~> 3.4)
97
+ rack (1.6.4)
82
98
  rack-accept (0.4.5)
83
99
  rack (>= 0.4)
84
100
  rack-mount (0.8.3)
85
101
  rack (>= 1.0.0)
102
+ rainbow (2.0.0)
86
103
  rake (10.4.2)
87
- rspec (3.2.0)
88
- rspec-core (~> 3.2.0)
89
- rspec-expectations (~> 3.2.0)
90
- rspec-mocks (~> 3.2.0)
91
- rspec-core (3.2.3)
92
- rspec-support (~> 3.2.0)
93
- rspec-expectations (3.2.1)
104
+ rspec (3.3.0)
105
+ rspec-core (~> 3.3.0)
106
+ rspec-expectations (~> 3.3.0)
107
+ rspec-mocks (~> 3.3.0)
108
+ rspec-core (3.3.1)
109
+ rspec-support (~> 3.3.0)
110
+ rspec-expectations (3.3.0)
94
111
  diff-lcs (>= 1.2.0, < 2.0)
95
- rspec-support (~> 3.2.0)
96
- rspec-mocks (3.2.1)
112
+ rspec-support (~> 3.3.0)
113
+ rspec-mocks (3.3.1)
97
114
  diff-lcs (>= 1.2.0, < 2.0)
98
- rspec-support (~> 3.2.0)
99
- rspec-support (3.2.2)
115
+ rspec-support (~> 3.3.0)
116
+ rspec-support (3.3.0)
117
+ rubocop (0.32.1)
118
+ astrolabe (~> 1.3)
119
+ parser (>= 2.2.2.5, < 3.0)
120
+ powerpack (~> 0.1)
121
+ rainbow (>= 1.99.1, < 3.0)
122
+ ruby-progressbar (~> 1.4)
123
+ ruby-progressbar (1.7.5)
100
124
  settingslogic (2.0.9)
125
+ slop (3.6.0)
101
126
  sys-cpu (0.7.1)
102
127
  ffi (>= 1.0.0)
103
128
  thin (1.6.3)
@@ -126,6 +151,8 @@ PLATFORMS
126
151
  DEPENDENCIES
127
152
  bundler (~> 1.6)
128
153
  http (~> 0.8)
154
+ pry
129
155
  rake
130
156
  rest-ftp-daemon!
131
157
  rspec (~> 3.1)
158
+ rubocop (~> 0.32.0)
data/README.md CHANGED
@@ -6,11 +6,12 @@ rest-ftp-daemon
6
6
  [![Test Coverage](https://codeclimate.com/github/bmedici/rest-ftp-daemon/badges/coverage.svg)](https://codeclimate.com/github/bmedici/rest-ftp-daemon/coverage)
7
7
 
8
8
 
9
- A pretty simple FTP-client daemon, driven through a RESTful API.
10
-
11
- API documentation is [maintained on Apiary](http://docs.restftpdaemon.apiary.io/)
9
+ A pretty simple but configurable and efficient FTP-client daemon, driven
10
+ through a RESTful API. Create transfer jobs by POSTing a simple JSON structure,
11
+ be notified of their completion, watch their status on a dedicated dashboard.
12
12
 
13
13
 
14
+ ![Dashboard](dashboard.png)
14
15
 
15
16
 
16
17
  Features
@@ -21,11 +22,11 @@ As of today, its main features are :
21
22
  * Offer a basic dashboard directly within the daemon HTTP interface
22
23
  * Periodically send an update-notification with transfer status and progress
23
24
  * Allow environment-specific configuration in a YAML file
24
- * Delegate a transfer job by ``POST```'ing a simple JSON structure
25
+ * Delegate a transfer job by `POST`'ing a simple JSON structure
25
26
  * Spawn a dedicated thread to handle this job in its own context
26
27
  * Report transfer status, progress and errors for each job in realtime
27
- * Expose JSON status of workers on ```GET /jobs/``` for automated monitoring
28
- * Parralelize jobs as soon as they arrive
28
+ * Expose JSON status of workers on `GET /jobs/` for automated monitoring
29
+ * Parallelize jobs as soon as they arrive
29
30
  * Handle job queues and priority as an attribute of the job
30
31
  * Allow dynamic evaluation of priorities, and change of any attribute until the job is picked
31
32
  * Provide RESTful notifications to the requesting client
@@ -37,8 +38,8 @@ As of today, its main features are :
37
38
  * Automatically clean-up jobs after a configurable amount of time (failed, finished)
38
39
  * Current bitrate on the last blocks chunk updated in the job attributes
39
40
  * Global bitrate on the whole file transfer is re-computed after the transfer finishes
40
- * Daemon process is tagged with its name and environement in process lists
41
- * Allow basic patterns in source filename to match multiple files (/dir/file*.jpg)
41
+ * Daemon process is tagged with its name and environment in process lists
42
+ * Allow basic patterns in source filename to match multiple files (`/dir/file*.jpg`)
42
43
 
43
44
  Expected features in a short-time range :
44
45
 
@@ -47,86 +48,42 @@ Expected features in a short-time range :
47
48
  * Authenticate API clients
48
49
  * Allow more transfer protocols (sFTP, HTTP POST etc)
49
50
 
50
- Known bugs :
51
+ Status
52
+ ------------------------------------------------------------------------------------
51
53
 
52
- * As this project is based on SettingsLogic, which in turns uses Syck YAML parser, configuration merge from "defaults" section and environment-specific section is broken. A sub-tree defined for a specific environment, will overwrite the corresponding subtree from "defaults".
54
+ Though lacking testing, this gem has been used successfully in production for
55
+ a while without glitches.
53
56
 
54
57
 
55
58
  Installation
56
59
  ------------------------------------------------------------------------------------
57
60
 
58
- This project is available as a rubygem, requires Ruby 2.1 and rubygems installed.
59
-
60
- You may use ```rbenv``` and ```ruby-build``` to get the right Ruby version. If this is your case, ensure that ruby-build definitions are up-to-date and include ruby-2.1.0
61
+ With Ruby (version 2.1 or higher) and rubygems properly installed, you only
62
+ need to issue :
61
63
 
62
64
  ```
63
- # apt-get install ruby-build rbenv
64
- # ruby-build --definitions | grep '2.1'
65
+ gem install rest-ftp-daemon
65
66
  ```
66
67
 
67
- Otherwise, you way have to update ruby-build to include Ruby 2.1.0 definitions.
68
- On Debian, 2.1.0 is not included in Wheezy and appears in Jessie's version of the package.
68
+ If that is not the case yet, see section [Debian install preparation](#debian-install-preparation).
69
69
 
70
- Use a dedicated user for the daemon, switch to this user and enable rbenv
71
-
72
- ```
73
- # adduser --disabled-password --gecos "" rftpd
74
- # su rftpd -l
75
- # echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
76
- # echo 'eval "$(rbenv init -)"' >> ~/.bashrc
77
- ```
78
-
79
-
80
- Install the right ruby version and activate it
81
70
 
82
- ```
83
- # rbenv install 2.1.0
84
- # rbenv local 2.1.0
85
- # rbenv rehash
86
- ```
87
-
88
- Update RubyGems and install the gem from rubygems.org
89
-
90
- ```
91
- # gem update --system
92
- # gem install rest-ftp-daemon --no-ri --no-rdoc
93
- # rbenv rehash
94
- # rest-ftp-daemon start
95
- ```
96
-
97
-
98
- Configuration
71
+ Usage
99
72
  ------------------------------------------------------------------------------------
100
73
 
101
- Most of the configuration options live in a YAML configuration file, containing two main sections:
102
-
103
- * the ``defaults`` section should be left as-is and will be used is no other environment-specific value is provided.
104
- * the ``production`` section can receive personnalized settings according to your environment-specific setup and paths.
105
-
106
- Configuration priority is defined as follows (from most important to last resort):
107
-
108
- * command-line parameters
109
- * config file defaults section
110
- * config file environment section
111
- * application internal defaults
112
-
113
- As a starting point, ``rest-ftp-daemon.yml.sample`` is an exemple config file that can be copied into the expected location ``/etc/rest-ftp-daemon.yml``.
114
-
115
- Default administrator credentials are admin/admin. Please change the password in this configuration file before starting any kind of production.
116
-
117
-
118
- Execution
119
- ------------------------------------------------------------------------------------
74
+ You must provide a configuration file for the daemon to start, either
75
+ explicitly using option `--config` or implicitly at `/etc/rest-ftp-daemon.yml`.
76
+ (A sample file is provided see `--help` for more info about it.)
120
77
 
121
- You can simply start the daemon on the standart port, or on a specific port using ```-p```
78
+ You can then simply start the daemon on the standard port, or on a specific port using `-p`
122
79
 
123
80
  ```
124
- # rest-ftp-daemon -p 4000 start
81
+ $ rest-ftp-daemon -p 3000 start
125
82
  ```
126
83
 
127
- Check that the daemon is running and exposes a JSON status structure on ```http://localhost:3200/status```.
84
+ Check that the daemon is running and exposes a JSON status structure on `http://localhost:3000/status`.
128
85
 
129
- The dashbaord will provide a gobal view on ```http://localhost:3200/```
86
+ The dashboard will provide a global view on `http://localhost:3000/`
130
87
 
131
88
  If the daemon appears to exit quickly when launched, it may be caused by logfiles that can't be written (check files permissions or owner).
132
89
 
@@ -147,35 +104,17 @@ Launcher options :
147
104
  | -v | --version | | Show the current version |
148
105
 
149
106
 
150
- Logging
151
- ------------------------------------------------------------------------------------
152
-
153
- The application will not log to any file by default, if not specified in its configuration.
154
- Otherwise separate logging paths can be provided for the Thin webserver, API related messages, and workers related messages. Providing and empty value will simply activate logging to ``STDOUT``.
155
-
156
-
157
- Job cleanup
107
+ Examples
158
108
  ------------------------------------------------------------------------------------
159
109
 
160
- Job can be cleanup up after a certain delay, when they are on one of these status:
161
-
162
- - "failed", cleaned up after conchita.clean_failed seconds
163
- - "finished", cleaned up after conchita.clean_finished seconds
164
-
165
- Cleanup is done on a regular basis, every X seconds (X = conchita.timer)
166
-
167
-
168
- Usage examples
169
- ------------------------------------------------------------------------------------
170
-
171
- * Start a job to transfer a file named "file.iso" to a local FTP server
110
+ #### Start a job to transfer a file named "file.iso" to a local FTP server
172
111
 
173
112
  ```
174
113
  curl -H "Content-Type: application/json" -X POST -D /dev/stdout -d \
175
114
  '{"source":"~/file.iso","target":"ftp://anonymous@localhost/incoming/dest2.iso"}' "http://localhost:3000/jobs"
176
115
  ```
177
116
 
178
- * Start a job using endpoint tokens
117
+ #### Start a job using endpoint tokens
179
118
 
180
119
  First define ``nas`` ans ``ftp1`` in the configuration file :
181
120
 
@@ -190,7 +129,7 @@ development:
190
129
  ftp1: "ftp://anonymous@localhost/incoming/"
191
130
  ```
192
131
 
193
- Thos tokens will be expanded when the job is ran :
132
+ Those tokens will be expanded when the job is run:
194
133
 
195
134
  ```
196
135
  curl -H "Content-Type: application/json" -X POST -D /dev/stdout -d \
@@ -198,16 +137,60 @@ curl -H "Content-Type: application/json" -X POST -D /dev/stdout -d \
198
137
  ```
199
138
 
200
139
 
201
- * Get info about a job with ID="q89j.1"
140
+ #### Get info about a job with ID="q89j.1"
202
141
 
203
- Both parameters ```q89j.1``` and ```1``` will be accepted as ID in the API. Requests below are equivalent:
142
+ Both parameters `q89j.1` and `1` will be accepted as ID in the API. Requests below are equivalent:
204
143
 
205
144
  ```
206
- GET http://localhost:3100/jobs/q89j.1
207
- GET http://localhost:3100/jobs/1
145
+ GET http://localhost:3000/jobs/q89j.1
146
+ GET http://localhost:3000/jobs/1
208
147
  ```
209
148
 
210
149
 
150
+ API Documentation
151
+ ------------------------------------------------------------------------------------
152
+
153
+ API documentation is [maintained on Apiary](http://docs.restftpdaemon.apiary.io/)
154
+
155
+
156
+ Configuration
157
+ ------------------------------------------------------------------------------------
158
+
159
+ Most of the configuration options live in a YAML configuration file, containing two main sections:
160
+
161
+ * `defaults` section should be left as-is and will be used is no other environment-specific value is provided.
162
+ * `production` section can receive personalized settings according to your environment-specific setup and paths.
163
+
164
+ Configuration priority is defined as follows (from most important to last resort):
165
+
166
+ * command-line parameters
167
+ * config file defaults section
168
+ * config file environment section
169
+ * application internal defaults
170
+
171
+ As a starting point, `rest-ftp-daemon.yml.sample` is an example config file that can be copied into the expected location ``/etc/rest-ftp-daemon.yml``.
172
+
173
+ Default administrator credentials are `admin/admin`. Please change the password in this configuration file before starting any kind of production.
174
+
175
+
176
+ Logging
177
+ ------------------------------------------------------------------------------------
178
+
179
+ The application will not log to any file by default, if not specified in its configuration.
180
+ Otherwise separate logging paths can be provided for the Thin webserver, API related messages, and workers related messages. Providing and empty value will simply activate logging to `STDOUT`.
181
+
182
+
183
+ Job cleanup
184
+ ------------------------------------------------------------------------------------
185
+
186
+ Job can be cleanup up after a certain delay, when they are on one of these status:
187
+
188
+ - "failed", cleaned up after conchita.clean_failed seconds
189
+ - "finished", cleaned up after conchita.clean_finished seconds
190
+
191
+ Cleanup is done on a regular basis, every X seconds (X = conchita.timer)
192
+
193
+
211
194
  TODO for this document
212
195
  ------------------------------------------------------------------------------------
213
196
 
@@ -222,6 +205,89 @@ TODO for this document
222
205
  * Document counters
223
206
 
224
207
 
208
+
209
+ Debian install preparation
210
+ ------------------------------------------------------------------------------------
211
+
212
+ This project is available as a rubygem, requires Ruby 2.1 and rubygems installed.
213
+
214
+ You may use `rbenv` and `ruby-build` to get the right Ruby version. If this is your case, ensure that ruby-build definitions are up-to-date and include ruby-2.1.0
215
+
216
+ ```
217
+ # apt-get install ruby-build rbenv
218
+ # ruby-build --definitions | grep '2.1'
219
+ ```
220
+
221
+ Otherwise, you way have to update ruby-build to include Ruby 2.1.0 definitions.
222
+ On Debian, 2.1.0 is not included in Wheezy and appears in Jessie's version of the package.
223
+
224
+ Use a dedicated user for the daemon, switch to this user and enable rbenv
225
+
226
+ ```
227
+ # adduser --disabled-password --gecos "" rftpd
228
+ # su rftpd -l
229
+ # echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
230
+ # echo 'eval "$(rbenv init -)"' >> ~/.bashrc
231
+ ```
232
+
233
+
234
+ Install the right ruby version and activate it
235
+
236
+ ```
237
+ # rbenv install 2.1.0
238
+ # rbenv local 2.1.0
239
+ # rbenv rehash
240
+ ```
241
+
242
+ Update RubyGems and install the gem from rubygems.org
243
+
244
+ ```
245
+ # gem update --system
246
+ # gem install rest-ftp-daemon --no-ri --no-rdoc
247
+ # rbenv rehash
248
+ # rest-ftp-daemon start
249
+ ```
250
+
251
+ Known bugs
252
+ ------------------------------------------------------------------------------------
253
+
254
+ * As this project is based on SettingsLogic, which in turns uses Syck YAML parser, configuration merge from "defaults" section and environment-specific section is broken. A sub-tree defined for a specific environment, will overwrite the corresponding subtree from "defaults".
255
+
256
+
257
+ Contributing
258
+ ------------------------------------------------------------------------------------
259
+
260
+ Contributions are more than welcome, be it for documentation, features, tests,
261
+ refactoring, you name it. If you are unsure of where to start, the [Code
262
+ Climate](https://codeclimate.com/github/bmedici/rest-ftp-daemon) report will
263
+ provide you with improvement directions. And of course, if in doubt, do not
264
+ hesitate to open an issue. (Please note that this project has adopted a [code
265
+ of conduct](CODE_OF_CONDUCT.md).)
266
+
267
+ If you want your contribution to adopted in the smoothest and fastest way, don't
268
+ forget to:
269
+
270
+ * provide sufficient documentation in you commit and pull request
271
+ * add proper testing (we know full grown solid test coverage is still lacking and
272
+ need to up the game)
273
+ * use the [RuboCop](https://github.com/bbatsov/rubocop) guidelines provided
274
+ (there are all sorts of editor integration plugins available)
275
+
276
+ So,
277
+
278
+ 1. Fork the project
279
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
280
+ 3. Code
281
+ * add proper tests if adding a feature
282
+ * run the tests using `rake`
283
+ * check for RuboCop style guide violations
284
+
285
+ 4. Commit your changes
286
+ 5. Push to the branch (`git push origin my-new-feature`)
287
+
288
+ 6. Create new Pull Request
289
+
290
+
225
291
  About
226
292
  ------------------------------------------------------------------------------------
227
293