nucleus 0.1.0 → 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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/CHANGELOG.md +18 -4
  4. data/README.md +28 -40
  5. data/Rakefile +137 -137
  6. data/config/nucleus_config.rb +0 -4
  7. data/lib/nucleus/adapter_resolver.rb +115 -115
  8. data/lib/nucleus/adapters/buildpack_translator.rb +79 -79
  9. data/lib/nucleus/adapters/v1/cloud_control/application.rb +108 -108
  10. data/lib/nucleus/adapters/v1/cloud_control/authentication.rb +27 -27
  11. data/lib/nucleus/adapters/v1/cloud_control/cloud_control.rb +153 -153
  12. data/lib/nucleus/adapters/v1/cloud_control/domains.rb +68 -68
  13. data/lib/nucleus/adapters/v1/cloud_control/logs.rb +103 -103
  14. data/lib/nucleus/adapters/v1/cloud_control/vars.rb +88 -88
  15. data/lib/nucleus/adapters/v1/cloud_foundry_v2/domains.rb +149 -149
  16. data/lib/nucleus/adapters/v1/cloud_foundry_v2/logs.rb +303 -303
  17. data/lib/nucleus/adapters/v1/cloud_foundry_v2/services.rb +286 -286
  18. data/lib/nucleus/adapters/v1/heroku/heroku.rb +2 -2
  19. data/lib/nucleus/adapters/v1/heroku/logs.rb +108 -108
  20. data/lib/nucleus/core/adapter_authentication_inductor.rb +0 -2
  21. data/lib/nucleus/core/adapter_extensions/auth/http_basic_auth_client.rb +37 -37
  22. data/lib/nucleus/core/adapter_extensions/http_client.rb +177 -177
  23. data/lib/nucleus/core/common/files/archive_extractor.rb +112 -112
  24. data/lib/nucleus/core/common/files/archiver.rb +91 -91
  25. data/lib/nucleus/core/common/logging/request_log_formatter.rb +48 -48
  26. data/lib/nucleus/core/error_messages.rb +127 -127
  27. data/lib/nucleus/core/models/abstract_model.rb +29 -29
  28. data/lib/nucleus/scripts/load_dependencies.rb +0 -1
  29. data/lib/nucleus/scripts/setup_config.rb +28 -28
  30. data/lib/nucleus/version.rb +3 -3
  31. data/nucleus.gemspec +10 -12
  32. data/spec/factories/models.rb +63 -61
  33. data/spec/integration/api/auth_spec.rb +58 -58
  34. data/spec/test_suites.rake +31 -31
  35. data/spec/unit/common/helpers/auth_helper_spec.rb +73 -73
  36. data/spec/unit/common/oauth2_auth_client_spec.rb +1 -1
  37. data/tasks/compatibility.rake +113 -113
  38. data/tasks/evaluation.rake +162 -162
  39. metadata +16 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b172d0919bd9a0948cfa81bb640a3bbae2c42d39
4
- data.tar.gz: 4ca095496dddee1c67aa285ea58dadda92b0648b
3
+ metadata.gz: 1a510c433f1548f80c42ce3d32804e73b7c71640
4
+ data.tar.gz: 46ff6af1d76e37cc945ea45a455968dded34533e
5
5
  SHA512:
6
- metadata.gz: 8e1a3ed688b3ece1bb464c0891802a5ad653d3e88094c8aa41845dc42951b149adf8bc2930273e05e9ed5d93d6a0bd3a02704d245efc716e50bc40235fc12dbc
7
- data.tar.gz: 18cb846d9e27ce9aa053351f809353df68133b7939b7f27d55f737f914c35a1a9431f80e280c039b4474b5535b337f44cc47240f08a77f868613469d23867599
6
+ metadata.gz: 44ffe6b03100aebabed7d6dbbc25cf714252b5985bbbc8708620688b84367082bdd2b39af34aa0c32094f0b155cf687a5e182385686dc505fbc6c1ab0f9a4bb4
7
+ data.tar.gz: 5668c6da41e685a1e6b65e0d7d6c0f84a93ac70d1f936e89227aa93558c76d949ffa2a8d7164ba18bb4ec68a7ce7692874279201dae9476ec7613f94e6ddb239
@@ -40,5 +40,8 @@ Style/ExtraSpacing:
40
40
  Exclude:
41
41
  - nucleus.gemspec
42
42
 
43
+ Style/MutableConstant:
44
+ Enabled: false
45
+
43
46
  Lint/UnusedMethodArgument:
44
47
  Enabled: false
@@ -4,15 +4,29 @@ This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
5
  ## Unreleased - Next
6
6
 
7
- ### Added / Features
7
+ ### Added
8
+
9
+ ### Fixed
10
+
11
+
12
+ ### Removed
13
+
14
+
15
+ ## [0.2.0] - 2016-01-22
16
+
17
+ ### Added
8
18
  * Add basic logging functionality for OpenShift v2
19
+ * Add more providers and endpoints to the default configuration
20
+
21
+ ### Fixed
22
+ * Correctly URL-encode credentials for Heroku authentication
9
23
 
10
- ### Changed / Fixes
11
- * Add your contribution here
24
+ ### Removed
25
+ * LMDB is the only packaged data store from now on
12
26
 
13
27
  ## [0.1.0] - 2015-08-04
14
28
 
15
- ### Added / Features
29
+ ### Added
16
30
  * Initial development release of the Platform as a Service abstraction layer - [@croeck](https://github.com/croeck)
17
31
 
18
32
 
data/README.md CHANGED
@@ -4,15 +4,13 @@
4
4
  [![Dependency Status](https://gemnasium.com/stefan-kolb/nucleus.svg)](https://gemnasium.com/stefan-kolb/nucleus)
5
5
  [![Code Climate](https://codeclimate.com/github/stefan-kolb/nucleus/badges/gpa.svg)](https://codeclimate.com/github/stefan-kolb/nucleus)
6
6
  [![Test Coverage](https://codeclimate.com/github/stefan-kolb/nucleus/badges/coverage.svg)](https://codeclimate.com/github/stefan-kolb/nucleus/coverage)
7
+ [![Gem Version](https://badge.fury.io/rb/nucleus.svg)](https://badge.fury.io/rb/nucleus)
8
+
9
+ _Nucleus_ is a RESTful abstraction layer and Ruby gem to unify core management functions of Platform as a Service (PaaS) systems.
7
10
 
8
- _Nucleus_ is a RESTful abstraction layer to unify core management functions of Platform-as-a-Service (PaaS) systems.
9
11
  The API is build using [Ruby](https://www.ruby-lang.org) and the [grape framework](https://github.com/intridea/grape).
10
12
  It provides fully compliant [swagger](http://swagger.io/) schemas that serve for documentation and client generation.
11
13
 
12
- Nucleus differentiates between Vendors, Providers and Endpoints.
13
- A *Vendor* is the organization that developed the platform software.
14
- A *Provider* runs the platform, which always has at least one *Endpoint*, but can also have multiple endpoints for different regions.
15
-
16
14
  ## Table of Contents
17
15
 
18
16
  * [Supported Vendors](#supported-vendors)
@@ -90,14 +88,13 @@ Please make sure to obey the following installation instructions before starting
90
88
  ### Ruby Interpreter Compatibility
91
89
 
92
90
  Nucleus is supposed to run on Ruby >= 2.0.
93
- **It currently won't work on JRuby.**
91
+ Due to native gem dependencies, it currently won't work on JRuby.
94
92
 
95
93
  ### Installation instructions
96
94
 
97
- 1) The following (executable) files must be available on the system's *PATH*:
95
+ 1) The following executables must be available on the system's *PATH*:
98
96
 
99
- - git
100
- - ssh
97
+ git, ssh
101
98
 
102
99
  #### Platform-specific notes
103
100
 
@@ -105,10 +102,10 @@ Unix systems should run fine out of the box, whereas Windows systems might need
105
102
 
106
103
  ##### Windows
107
104
 
108
- Both files should be located in the `Git/bin` installation directory of [msysGit](https://msysgit.github.io/).
105
+ Both required executables should be located in the `Git/bin` installation directory of [msysGit](https://msysgit.github.io/).
109
106
  Nucleus is verified to work with [msysGit](https://msysgit.github.io/) and the included version of `OpenSSH`.
110
107
  We did not verify other alternatives, e.g. PuTTY's `plink.exe`.
111
- PuTTY is supposed to (maybe anyone knows how to fix this?) not work due to the lack of the `-o UserKnownHostsFile=NUL -o StrictHostKeyChecking=no` options that allow to connect any git repository without confirmation of the host's identity.
108
+ PuTTY is supposed to not work due to the lack of the `-o UserKnownHostsFile=NUL -o StrictHostKeyChecking=no` options that allow to connect any git repository without confirmation of the host's identity.
112
109
 
113
110
  ###### Troubleshooting
114
111
 
@@ -149,13 +146,13 @@ upon which you would update your bundle.
149
146
  $ bundle install
150
147
  ```
151
148
 
152
- Of course you could also install the gem yourself as:
149
+ Or install the gem by yourself:
153
150
 
154
151
  ```shell
155
152
  $ gem install nucleus
156
153
  ```
157
154
 
158
- Finally require the gem in your application
155
+ Finally, require the gem inside your application
159
156
 
160
157
  ```ruby
161
158
  require 'nucleus'
@@ -165,7 +162,7 @@ require 'nucleus'
165
162
 
166
163
  1) Configuration [optional]
167
164
 
168
- Adapt the configuration to your needs and adjust the values via `nucleus_config`.
165
+ Adapt the configuration to your needs and adjust the values via the global `nucleus_config` variable.
169
166
  The configuration *must* be changed before initializing the `AdapterResolver`, otherwise the configuration is locked and can't be changed anymore.
170
167
 
171
168
  For more information have a look at the [configuration](#configuration) section.
@@ -176,7 +173,7 @@ For more information have a look at the [configuration](#configuration) section.
176
173
  Nucleus::VersionDetector.api_versions
177
174
  ```
178
175
 
179
- 3) Instantiate the AdapterResolver for the desired API version:
176
+ 3) Instantiate an `AdapterResolver` for the desired API version:
180
177
 
181
178
  ```ruby
182
179
  resolver = Nucleus::AdapterResolver.new('v1')
@@ -189,7 +186,7 @@ resolver.adapters
189
186
  ```
190
187
 
191
188
  ```ruby
192
- {"cloudcontrol"=>Nucleus::Adapters::V1::CloudControl, "cloud_foundry_v2"=>Nucleus::Adapters::V1::CloudFoundryV2, "heroku"=>Nucleus::Adapters::V1::Heroku, "openshift_v2"=>Nucleus::Adapters::V1::OpenshiftV2}
189
+ { "cloudcontrol"=>Nucleus::Adapters::V1::CloudControl, "cloud_foundry_v2"=>Nucleus::Adapters::V1::CloudFoundryV2, "heroku"=>Nucleus::Adapters::V1::Heroku, "openshift_v2"=>Nucleus::Adapters::V1::OpenshiftV2 }
193
190
  ```
194
191
 
195
192
  5) Load your desired adapter implementation:
@@ -199,10 +196,11 @@ adapter = resolver.load('cloudcontrol', 'api.cloudcontrol.com', 'your_username',
199
196
  ```
200
197
 
201
198
  By default, the adapter will be populated with the default configuration options that are defined in the vendor's configuration for the selected endpoint_url.
202
- If you are using a custom installation, e.g. of *Openshift* or *Cloud Foundry*, make sure to pass the option that describe the `app_domain` for deployed applications.
199
+ If you are using a custom installation, e.g. of *OpenShift* or *Cloud Foundry*, make sure to pass the option that describes the `app_domain` for deployed applications.
203
200
  Otherwise, the `web_url` links created by Nucleus will be malformed.
204
201
 
205
202
  ```ruby
203
+ minimal = resolver.load('heroku', 'your_username', 'your_password')
206
204
  adapter = resolver.load('cloud_foundry_v2', 'api.example.org', 'your_username', 'your_password', app_domain: 'apps.example.org', check_ssl: false)
207
205
  ```
208
206
 
@@ -217,7 +215,7 @@ app = adapter.create_application(region: 'default', name: 'myusersfirstapplicati
217
215
  adapter.delete_application(app[:id])
218
216
  ```
219
217
 
220
- Check the **documentation** of the `Nucleus::Adapters::V1::Stub` adapter (or any other API version) for a complete list of the supported actions.
218
+ Check the **documentation** of the `Nucleus::Adapters::V1::Stub` adapter (or any other API version) for a complete list of supported actions.
221
219
  You can also refer to the documentation of the REST interface to get detailed information about the parameter options of `post` and `put` commands,
222
220
  including which fields are required and those that are only optional.
223
221
 
@@ -259,7 +257,7 @@ After you started a server instance, you can access an interactive [swagger-ui](
259
257
  ## Functionality
260
258
 
261
259
  The following list shows the degree to which the adapters implement the offered methods.
262
- This list is auto-generated and can be shown via:
260
+ This list can be auto-generated via:
263
261
 
264
262
  ```
265
263
  $ bundle exec rake evaluation:compatibility:markdown
@@ -310,32 +308,30 @@ remove_service|✓|✓|✓|✓
310
308
  ### Core constructs
311
309
 
312
310
  Nucleus could support any constellation of PaaS offers that are currently available.
313
- In order to do so, we differentiate between three types:
311
+ In order to do so, we differentiate between between vendors, providers, and endpoints:
314
312
 
315
- The **vendor**, or the PaaS platform, which determines the functionality,
316
- a **provider** that runs the vendor's platform and offers it to its customers and finally
317
- the **endpoint** of the provider's offer.
313
+ A *vendor* is the organization that developed the platform software, which also determines the offered functionalities.
314
+ A *provider* runs the platform, which always has at least one *endpoint*.
318
315
 
319
316
  For most scenarios the *endpoint* is identical to the *provider*, but in some cases,
320
317
  for instance on [IBM Bluemix][bluemix], *endpoints* distinguish different deployment regions.
321
318
 
322
- If running Nucleus as web service, all changes made to these entities at runtime will be discarded,
323
- unless you enable the functionality in the configuration and specify a location where to persist the data to.
319
+ If running Nucleus as web service, all changes made to these entities at runtime will be discarded, unless you enable persistence functionality in the configuration and specify a location where to persist the data to.
324
320
 
325
321
  #### Vendors
326
322
 
327
323
  You can use the API of Nucleus to show a list of all supported vendors.
328
324
  This request is publicly available and does not require any authentication.
329
325
 
330
- However, you can't create, delete or update a vendor at runtime because it represents the logic to communicate with the associated platform.
331
- All developers that want to have more information on how to add a new vendor can take a look at the instructions: [Add a vendor (or implement a new adapter)](wiki/implement_new_adapter.md)
326
+ However, you cannot create, delete or update a vendor at runtime because it represents the logic to communicate with the associated platform.
327
+ All developers that want to have more information on how to add a new vendor, please see the instructions: [Add a vendor (or implement a new adapter)](wiki/implement_new_adapter.md)
332
328
 
333
329
  #### Providers and Endpoints
334
330
 
335
331
  Providers and Endpoints can be managed *without authentication* and support `GET`, `POST`, `PATCH`, `DELETE` requests.
336
332
 
337
333
  A new entity can be registered at runtime by sending a `POST` request.
338
- Whereas a provider only requires a `name`, an endpoint also needs a further attribute, the `url`.
334
+ Whereas a provider only requires a `name`, an endpoint also needs the `url` as further attribute.
339
335
  Please refer to the swagger-ui documentation for additional information about the requests.
340
336
 
341
337
  ### Authentication
@@ -345,13 +341,12 @@ The credentials must be provided as [Basic authentication](https://en.wikipedia.
345
341
 
346
342
  Authorization: Basic thebase64encodedcredentialsstring
347
343
 
348
- #### Special characters (umlauts, ...)
344
+ #### Special characters
349
345
 
350
- The usage of special characters, for instance german umlauts as ä, ö and ü may cause issues with some platforms.
351
- Please make sure to select the correct encoding for your credentials before encoding them with base64:
346
+ The usage of special characters, for instance german umlauts may cause issues with some platforms.
347
+ Please make sure to select the correct encoding for your credentials before encoding them with Base64:
352
348
 
353
- * Stackato 3.4.2
354
- * Different encodings cause the requests to crash and return status 500
349
+ * Stackato 3.4.2: Different encodings cause the requests to crash and return status 500
355
350
 
356
351
  ### Application logs
357
352
 
@@ -512,13 +507,6 @@ They are described with increasing importance, meaning that the last option over
512
507
  1. A file in user account's home directory. On UNIX systems this file must be placed at `~/.nucleus/nucleus_config.rb`, whereas it is expected at `~/nucleus/nucleus_config.rb` if running Windows.
513
508
  2. The `config/nucleus_config.rb` file in the project's directory
514
509
 
515
- #### Database backend
516
-
517
- The database backend can be specified in the `config/nucleus_config.rb` configuration file.
518
- It defaults to [Daybreak](https://github.com/propublica/daybreak) on Unix systems and [LMDB](https://github.com/minad/lmdb) on Windows.
519
-
520
- Note: *[Daybreak](https://github.com/propublica/daybreak) does not run on Windows*
521
-
522
510
  ### Vendors, Providers, and Endpoints
523
511
 
524
512
  A vendor is reflected by an adapter implementation, but the providers and their endpoints can either be changed at runtime or via `.yaml` configuration files.
data/Rakefile CHANGED
@@ -1,137 +1,137 @@
1
- import 'tasks/compatibility.rake'
2
- import 'tasks/evaluation.rake'
3
- import 'spec/test_suites.rake'
4
-
5
- require 'rake'
6
- require 'rubygems'
7
- require 'bundler'
8
- require 'bundler/gem_tasks'
9
- require 'rspec/core/rake_task'
10
- require 'rainbow/ext/string' unless String.respond_to?(:color)
11
- require 'rubocop/rake_task'
12
-
13
- RuboCop::RakeTask.new
14
-
15
- # first check code style, then execute the tests
16
- task default: [:rubocop, :spec]
17
-
18
- # map spec task to all test suites
19
- task :spec do
20
- # first, run all tests
21
- Rake::Task['spec:suite:all'].invoke
22
- # if on the CI system, push coverage report to codeclimate
23
- if ENV['CODECLIMATE_REPO_TOKEN']
24
- require 'simplecov'
25
- require 'codeclimate-test-reporter'
26
- CodeClimate::TestReporter::Formatter.new.format(SimpleCov.result)
27
- end
28
- end
29
-
30
- task :doc_toc do
31
- File.open('README.md', 'r') do |f|
32
- f.each_line do |line|
33
- forbidden_words = ['Table of contents', 'define', 'pragma']
34
- next if !line.start_with?('#') || forbidden_words.any? { |w| line =~ /#{w}/ }
35
-
36
- title = line.delete('#').strip
37
- href = title.tr(' ', '-').downcase
38
- puts ' ' * (line.count('#') - 1) + "* [#{title}](\##{href})"
39
- end
40
- end
41
- end
42
-
43
- desc 'Record all adapter tests'
44
- task :record do
45
- # http://www.relishapp.com/vcr/vcr/v/2-9-3/docs/record-modes
46
- ENV['VCR_RECORD_MODE'] = 'once'
47
- # recording only valid for adapter tests
48
- Rake::Task['spec:suite:adapters'].invoke
49
- end
50
-
51
- namespace :record do
52
- FileList['spec/adapter/v1/**'].each do |file|
53
- next unless File.directory?(file)
54
- adapter = File.basename(file)
55
-
56
- desc "Record #{adapter} adapter tests"
57
- RSpec::Core::RakeTask.new(adapter) do |t|
58
- # new_episodes
59
- ENV['VCR_RECORD_MODE'] = 'once'
60
- t.pattern = "spec/adapter/v1/#{adapter}/*_spec.rb"
61
- t.verbose = true
62
- end
63
- end
64
- end
65
-
66
- task :environment do
67
- ENV['RACK_ENV'] ||= 'development'
68
- require 'configatron'
69
- require 'nucleus/scripts/setup_config'
70
- nucleus_config.logging.level = Logger::Severity::ERROR
71
- require 'nucleus_api/scripts/load_api'
72
- require 'nucleus_api/scripts/initialize_api'
73
- end
74
-
75
- task routes: :environment do
76
- Nucleus::API::RootAPI.routes.each do |route|
77
- next if route.nil? || route.route_method.nil?
78
- method = route.route_method.ljust(10)
79
- path = route.route_path
80
- version = route.instance_variable_get(:@options)[:version]
81
- path = path.gsub(/:version/, version) unless version.nil?
82
- puts " #{method} #{path} - [#{version}]"
83
- end
84
- end
85
-
86
- task schema_v1: :environment do
87
- require 'json'
88
- response = Nucleus::API::RootAPI.call(
89
- 'REQUEST_METHOD' => 'GET',
90
- 'PATH_INFO' => '/schema',
91
- 'rack.input' => StringIO.new)[2].body[0]
92
- json = JSON.parse(response)
93
- puts JSON.pretty_generate(json)
94
- end
95
-
96
- begin
97
- require 'yard'
98
- DOC_FILES = %w(lib/**/*.rb)
99
-
100
- YARD::Rake::YardocTask.new(:doc) do |t|
101
- t.files = DOC_FILES
102
- end
103
-
104
- namespace :doc do
105
- YARD::Rake::YardocTask.new(:pages) do |t|
106
- t.files = DOC_FILES
107
- t.options = ['-o', '../nucleus.doc/docs', '--title', "Nucleus #{Nucleus::VERSION} Documentation"]
108
- end
109
-
110
- desc 'Check out gh-pages.'
111
- task :checkout do
112
- dir = File.join(__dir__, '..', 'nucleus.doc')
113
- unless Dir.exist?(dir)
114
- Dir.mkdir(dir)
115
- Dir.chdir(dir) do
116
- system('git init')
117
- system('git remote add origin git@github.com:stefan-kolb/nucleus.git')
118
- system('git pull')
119
- system('git checkout gh-pages')
120
- end
121
- end
122
- end
123
-
124
- desc 'Generate and publish YARD docs to GitHub pages.'
125
- task publish: %w(doc:pages:checkout doc:pages) do
126
- Dir.chdir(File.join(__dir__, '..', 'nucleus.doc')) do
127
- system('git checkout gh-pages')
128
- system('git add .')
129
- system('git add -u')
130
- system("git commit -m 'Generating docs for version #{Nucleus::VERSION}.'")
131
- system('git push origin gh-pages')
132
- end
133
- end
134
- end
135
- rescue LoadError
136
- puts 'You need to install YARD.'
137
- end
1
+ import 'tasks/compatibility.rake'
2
+ import 'tasks/evaluation.rake'
3
+ import 'spec/test_suites.rake'
4
+
5
+ require 'rake'
6
+ require 'rubygems'
7
+ require 'bundler'
8
+ require 'bundler/gem_tasks'
9
+ require 'rspec/core/rake_task'
10
+ require 'rainbow/ext/string' unless String.respond_to?(:color)
11
+ require 'rubocop/rake_task'
12
+
13
+ RuboCop::RakeTask.new
14
+
15
+ # first check code style, then execute the tests
16
+ task default: [:rubocop, :spec]
17
+
18
+ # map spec task to all test suites
19
+ task :spec do
20
+ # first, run all tests
21
+ Rake::Task['spec:suite:all'].invoke
22
+ # if on the CI system, push coverage report to codeclimate
23
+ if ENV['CODECLIMATE_REPO_TOKEN']
24
+ require 'simplecov'
25
+ require 'codeclimate-test-reporter'
26
+ CodeClimate::TestReporter::Formatter.new.format(SimpleCov.result)
27
+ end
28
+ end
29
+
30
+ task :doc_toc do
31
+ File.open('README.md', 'r') do |f|
32
+ f.each_line do |line|
33
+ forbidden_words = ['Table of contents', 'define', 'pragma']
34
+ next if !line.start_with?('#') || forbidden_words.any? { |w| line =~ /#{w}/ }
35
+
36
+ title = line.delete('#').strip
37
+ href = title.tr(' ', '-').downcase
38
+ puts ' ' * (line.count('#') - 1) + "* [#{title}](\##{href})"
39
+ end
40
+ end
41
+ end
42
+
43
+ desc 'Record all adapter tests'
44
+ task :record do
45
+ # http://www.relishapp.com/vcr/vcr/v/2-9-3/docs/record-modes
46
+ ENV['VCR_RECORD_MODE'] = 'once'
47
+ # recording only valid for adapter tests
48
+ Rake::Task['spec:suite:adapters'].invoke
49
+ end
50
+
51
+ namespace :record do
52
+ FileList['spec/adapter/v1/**'].each do |file|
53
+ next unless File.directory?(file)
54
+ adapter = File.basename(file)
55
+
56
+ desc "Record #{adapter} adapter tests"
57
+ RSpec::Core::RakeTask.new(adapter) do |t|
58
+ # new_episodes
59
+ ENV['VCR_RECORD_MODE'] = 'once'
60
+ t.pattern = "spec/adapter/v1/#{adapter}/*_spec.rb"
61
+ t.verbose = true
62
+ end
63
+ end
64
+ end
65
+
66
+ task :environment do
67
+ ENV['RACK_ENV'] ||= 'development'
68
+ require 'configatron'
69
+ require 'nucleus/scripts/setup_config'
70
+ nucleus_config.logging.level = Logger::Severity::ERROR
71
+ require 'nucleus_api/scripts/load_api'
72
+ require 'nucleus_api/scripts/initialize_api'
73
+ end
74
+
75
+ task routes: :environment do
76
+ Nucleus::API::RootAPI.routes.each do |route|
77
+ next if route.nil? || route.route_method.nil?
78
+ method = route.route_method.ljust(10)
79
+ path = route.route_path
80
+ version = route.instance_variable_get(:@options)[:version]
81
+ path = path.gsub(/:version/, version) unless version.nil?
82
+ puts " #{method} #{path} - [#{version}]"
83
+ end
84
+ end
85
+
86
+ task schema_v1: :environment do
87
+ require 'json'
88
+ response = Nucleus::API::RootAPI.call(
89
+ 'REQUEST_METHOD' => 'GET',
90
+ 'PATH_INFO' => '/schema',
91
+ 'rack.input' => StringIO.new)[2].body[0]
92
+ json = JSON.parse(response)
93
+ puts JSON.pretty_generate(json)
94
+ end
95
+
96
+ begin
97
+ require 'yard'
98
+ DOC_FILES = %w(lib/**/*.rb).freeze
99
+
100
+ YARD::Rake::YardocTask.new(:doc) do |t|
101
+ t.files = DOC_FILES
102
+ end
103
+
104
+ namespace :doc do
105
+ YARD::Rake::YardocTask.new(:pages) do |t|
106
+ t.files = DOC_FILES
107
+ t.options = ['-o', '../nucleus.doc/docs', '--title', "Nucleus #{Nucleus::VERSION} Documentation"]
108
+ end
109
+
110
+ desc 'Check out gh-pages.'
111
+ task :checkout do
112
+ dir = File.join(__dir__, '..', 'nucleus.doc')
113
+ unless Dir.exist?(dir)
114
+ Dir.mkdir(dir)
115
+ Dir.chdir(dir) do
116
+ system('git init')
117
+ system('git remote add origin git@github.com:stefan-kolb/nucleus.git')
118
+ system('git pull')
119
+ system('git checkout gh-pages')
120
+ end
121
+ end
122
+ end
123
+
124
+ desc 'Generate and publish YARD docs to GitHub pages.'
125
+ task publish: %w(doc:pages:checkout doc:pages) do
126
+ Dir.chdir(File.join(__dir__, '..', 'nucleus.doc')) do
127
+ system('git checkout gh-pages')
128
+ system('git add .')
129
+ system('git add -u')
130
+ system("git commit -m 'Generating docs for version #{Nucleus::VERSION}.'")
131
+ system('git push origin gh-pages')
132
+ end
133
+ end
134
+ end
135
+ rescue LoadError
136
+ puts 'You need to install YARD.'
137
+ end