station 0.0.113 → 0.0.114

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +9 -7
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +2 -2
  5. data/docs/How-To-Use.md +2 -0
  6. data/lib/nexmo_developer/.nvmrc +1 -1
  7. data/lib/nexmo_developer/.ruby-version +1 -1
  8. data/lib/nexmo_developer/Gemfile +8 -9
  9. data/lib/nexmo_developer/Gemfile.lock +101 -98
  10. data/lib/nexmo_developer/Runbook.md +4 -4
  11. data/lib/nexmo_developer/app/controllers/jobs_controller.rb +7 -7
  12. data/lib/nexmo_developer/app/controllers/static_controller.rb +2 -13
  13. data/lib/nexmo_developer/app/models/feedback/feedback.rb +2 -0
  14. data/lib/nexmo_developer/app/presenters/head.rb +5 -1
  15. data/lib/nexmo_developer/app/presenters/improve_page_presenter.rb +1 -1
  16. data/lib/nexmo_developer/app/services/orbit_feedback_notifier.rb +53 -0
  17. data/lib/nexmo_developer/app/services/translator/files_list_coordinator.rb +1 -1
  18. data/lib/nexmo_developer/app/views/contribute/guides/landing-pages.md +0 -10
  19. data/lib/nexmo_developer/app/views/contribute/guides/markdown-guide.md +0 -38
  20. data/lib/nexmo_developer/app/views/contribute/guides/platform.md +0 -1
  21. data/lib/nexmo_developer/app/webpacker/packs/application.js +0 -3
  22. data/lib/nexmo_developer/config/routes.rb +0 -2
  23. data/lib/nexmo_developer/lib/tasks/cache.rake +1 -1
  24. data/lib/nexmo_developer/lib/tasks/careers.rake +1 -1
  25. data/lib/nexmo_developer/lib/tasks/ci.rake +7 -7
  26. data/lib/nexmo_developer/lib/tasks/diff.rake +5 -5
  27. data/lib/nexmo_developer/lib/tasks/documentation.rake +1 -1
  28. data/lib/nexmo_developer/lib/tasks/generate_search_terms.rake +2 -2
  29. data/lib/nexmo_developer/lib/tasks/links.rake +6 -6
  30. data/lib/nexmo_developer/lib/tasks/smartling.rake +1 -1
  31. data/lib/nexmo_developer/version.rb +1 -1
  32. data/package.json +20 -22
  33. data/station.gemspec +4 -4
  34. data/yarn.lock +983 -2784
  35. metadata +47 -52
  36. data/lib/nexmo_developer/.dockerignore +0 -1
  37. data/lib/nexmo_developer/Dockerfile +0 -28
  38. data/lib/nexmo_developer/app/screenshots/webhook-url-for-delivery-receipt.js +0 -44
  39. data/lib/nexmo_developer/app/screenshots/webhook-url-for-inbound-message.js +0 -44
  40. data/lib/nexmo_developer/app/views/static/default_landing/partials/_submit_your_idea_form.html.erb +0 -58
  41. data/lib/nexmo_developer/app/webpacker/javascript/spotlight/index.js +0 -12
  42. data/lib/nexmo_developer/docker-compose.yml +0 -43
  43. data/lib/nexmo_developer/lib/tasks/screenshots.rake +0 -11
@@ -4,7 +4,7 @@ Nexmo Developer is a simple Rails application with a mounted Sinatra app that ha
4
4
 
5
5
  # Deployment
6
6
 
7
- NDP is hosted in Heroku and is automatically deployed every time a branch is merged into master via a Github integration.
7
+ NDP is hosted in Heroku and is automatically deployed every time a branch is merged into main via a Github integration.
8
8
  In case you want to force a deploy, you can always deploy NDP from [Heroku's dashboard](https://dashboard.heroku.com/apps/nexmo-developer).
9
9
 
10
10
  ## Required Resources
@@ -39,7 +39,7 @@ In case NDP is Down:
39
39
 
40
40
  * Check if [Heroku](https://status.heroku.com/) is having an outage. Unfortunately, if that is the case then there isn't much you can do about it (at least for now).
41
41
  * Otherwise, check the [logs](#logs) or [Bugsnag](#error-monitoring-and-reporting) to see if any issues show up and try to reproduce it locally.
42
- If the issue is related to the latest deploy, just revert the offending commits and the deploy again while you work on a fix. Once a fix is ready, open a Pull Request, make sure that it works in the corresponding Review App and finally after all the checks pass merge it into master.
42
+ If the issue is related to the latest deploy, just revert the offending commits and the deploy again while you work on a fix. Once a fix is ready, open a Pull Request, make sure that it works in the corresponding Review App and finally after all the checks pass merge it into main.
43
43
 
44
44
  # Available configuration options
45
45
 
@@ -53,7 +53,7 @@ To enable the Search form locally, the `ALGOLIA_SEARCH_KEY` environment variable
53
53
 
54
54
  # Common issues when running NDP locally
55
55
 
56
- NDP can be run locally either directly or using Docker, for more information about how to run it see the [Readme](https://github.com/Nexmo/nexmo-developer/blob/master/README.md#running-locally). When using docker, re-building the image should fix the following issues
56
+ NDP can be run locally either directly or using Docker, for more information about how to run it see the [Readme](https://github.com/Nexmo/nexmo-developer/blob/main/README.md#running-locally). When using docker, re-building the image should fix the following issues
57
57
 
58
58
  * `Could not find definition '<insert_file_here>' in '<path>'`: set the right `OAS_PATH` in `.env`, check `.env.example` for the default value.
59
59
 
@@ -66,4 +66,4 @@ NDP can be run locally either directly or using Docker, for more information abo
66
66
 
67
67
  * Webpacker errors:
68
68
  * `The engine "node" is incompatible with this module. Expected version...` We use [nvm](https://github.com/nvm-sh/nvm) as node's version manage, check that the right version of node is installed (specified in `.nvmrc`) and run `nvm use <version>`.
69
- * Make sure that all the packages are install by running `yarn install`
69
+ * Make sure that all the packages are installed by running `yarn install`
@@ -8,19 +8,19 @@ class JobsController < ApplicationController
8
8
  if params['ref'] == 'refs/heads/master'
9
9
  url = "https://api.travis-ci.org/repo/#{ENV['TRAVIS_REPO_ID']}/requests"
10
10
  RestClient.post(url, {
11
- "request": {
12
- "branch": 'master',
13
- "config": {
14
- "script": 'bundle exec rake diff:execute',
15
- "env": {
16
- "SSH_KEY_REQUIRED": true,
11
+ request: {
12
+ branch: 'master',
13
+ config: {
14
+ script: 'bundle exec rake diff:execute',
15
+ env: {
16
+ SSH_KEY_REQUIRED: true,
17
17
  },
18
18
  },
19
19
  },
20
20
  }.to_json, {
21
21
  content_type: :json,
22
22
  accept: :json,
23
- 'Authorization': "token #{ENV['TRAVIS_TOKEN']}",
23
+ Authorization: "token #{ENV['TRAVIS_TOKEN']}",
24
24
  'Travis-API-Version': '3',
25
25
  })
26
26
 
@@ -45,6 +45,8 @@ class StaticController < ApplicationController
45
45
  migrate_tropo
46
46
  end
47
47
 
48
+ @frontmatter = @landing_config
49
+ @document_title = @landing_config['title']
48
50
  @navigation = yaml_name.to_sym
49
51
  render layout: 'landing'
50
52
  end
@@ -145,19 +147,6 @@ class StaticController < ApplicationController
145
147
  end
146
148
  end
147
149
 
148
- def spotlight
149
- response = RestClient.post(
150
- 'https://hooks.zapier.com/hooks/catch/1936493/oyzjr4i/',
151
- params.permit(:name, :email_address, :background, :outline, :previous_content).to_h
152
- )
153
-
154
- if response.code == 200
155
- head :ok
156
- else
157
- head :unprocessable_entity
158
- end
159
- end
160
-
161
150
  def blog_cookie
162
151
  # This is the first touch time so we only want to set it if it's not already set
163
152
  set_utm_cookie('ft', Time.now.getutc.to_i) unless cookies[:ft]
@@ -26,6 +26,8 @@ module Feedback
26
26
  end
27
27
 
28
28
  def notify
29
+ OrbitFeedbackNotifier.call(self) if !owner.nil? && owner.email.present?
30
+
29
31
  return unless ENV['SLACK_WEBHOOK']
30
32
 
31
33
  FeedbackSlackNotifier.call(self)
@@ -26,11 +26,15 @@ class Head
26
26
  end
27
27
 
28
28
  def title
29
- @title ||= config.fetch('title') do
29
+ @title ||= title_from_frontmatter || config.fetch('title') do
30
30
  raise "You must provide a 'title' parameter in header_meta.yml"
31
31
  end
32
32
  end
33
33
 
34
+ def title_from_frontmatter
35
+ @frontmatter && (@frontmatter['meta_title'] || @frontmatter['title'])
36
+ end
37
+
34
38
  def description
35
39
  @description ||= Description.new(config: config, frontmatter: frontmatter).description
36
40
  end
@@ -4,7 +4,7 @@ class ImprovePagePresenter
4
4
  end
5
5
 
6
6
  def github_url
7
- @github_url ||= "https://github.com/#{docs_repo}/blob/#{ENV.fetch('branch', 'master')}/#{path_to_url}"
7
+ @github_url ||= "https://github.com/#{docs_repo}/blob/#{ENV.fetch('branch', 'main')}/#{path_to_url}"
8
8
  end
9
9
 
10
10
  def docs_repo
@@ -0,0 +1,53 @@
1
+ class OrbitFeedbackNotifier
2
+ CONFIG = YAML.load_file("#{Rails.configuration.docs_base_path}/config/business_info.yml")
3
+
4
+ def self.call(feedback)
5
+ new(feedback).post!
6
+ end
7
+
8
+ def initialize(feedback)
9
+ @feedback = feedback
10
+ end
11
+
12
+ def params
13
+ @params ||= {
14
+ id: @feedback.id,
15
+ email: @feedback.owner.email,
16
+ resource: "Offered #{@feedback.sentiment} feedback on #{@feedback.resource.uri}",
17
+ }
18
+ end
19
+
20
+ def uri
21
+ @uri ||= URI("https://app.orbit.love/api/v1/#{ENV['ORBIT_WORKSPACE_ID']}/activities")
22
+ end
23
+
24
+ def post!
25
+ return unless ENV['ORBIT_WORKSPACE_ID']
26
+
27
+ http = Net::HTTP.new(uri.host, uri.port)
28
+ http.use_ssl = true
29
+ req = Net::HTTP::Post.new(uri)
30
+ req['Accept'] = 'application/json'
31
+ req['Content-Type'] = 'application/json'
32
+ req['Authorization'] = "Bearer #{ENV['ORBIT_API_KEY']}"
33
+
34
+ req.body = {
35
+ activity: {
36
+ activity_type: 'adp:feedback',
37
+ key: "adp-feedback-#{params[:id]}",
38
+ title: 'Offered feedback on ADP',
39
+ description: params[:resource],
40
+ occurred_at: Time.zone.now.iso8601,
41
+ },
42
+ identity: {
43
+ source: 'email',
44
+ source_host: CONFIG['base_url'],
45
+ email: params[:email],
46
+ },
47
+ }
48
+
49
+ req.body = req.body.to_json
50
+
51
+ http.request(req)
52
+ end
53
+ end
@@ -13,7 +13,7 @@ module Translator
13
13
  end
14
14
 
15
15
  def files
16
- @files ||= `(git fetch origin master:master) && (git log --since="#{@days} days" --name-only --oneline --diff-filter=ACM --pretty=format: master #{Rails.configuration.docs_base_path}/_documentation/en #{Rails.configuration.docs_base_path}/_tutorials/en #{Rails.configuration.docs_base_path}/_use_cases/en) | uniq | awk 'NF'`.split("\n")
16
+ @files ||= `(git fetch origin main:main) && (git log --since="#{@days} days" --name-only --oneline --diff-filter=ACM --pretty=format: main #{Rails.configuration.docs_base_path}/_documentation/en #{Rails.configuration.docs_base_path}/_tutorials/en #{Rails.configuration.docs_base_path}/_use_cases/en) | uniq | awk 'NF'`.split("\n")
17
17
  end
18
18
 
19
19
  def process_files(files)
@@ -544,13 +544,3 @@ The `warning_callout` content block provides an element to render a warning mess
544
544
  content: # Warning message goes here
545
545
 
546
546
  ```
547
-
548
- ### Write for Nexmo
549
-
550
- The `write_for_nexmo` content block will provide a call to action element to Write for Nexmo with a Developer Spotlight graphic on the left-hand side and text advertising the Write for Nexmo program on the left-hand side.
551
-
552
- ```yaml
553
-
554
- - type: write_for_nexmo
555
-
556
- ```
@@ -359,44 +359,6 @@ If you are adding support for a changed header this would normally go above the
359
359
 
360
360
  [Go to the anchor](#anchor-example). I've placed at the top of this document.
361
361
 
362
- ## Screenshots
363
-
364
- Webpage screenshots can be scripted so that they only require sourcing once. Define a screenshot as such:
365
-
366
- ````
367
- ```screenshot
368
- script: app/screenshots/webhook-url-for-delivery-receipt.js
369
- ```
370
- ````
371
-
372
- Run the following command:
373
-
374
- ```
375
- $ rake screenshots:new
376
- ```
377
-
378
- This changes the original source document to add an `image` value pointing to the screenshot:
379
-
380
- ````
381
- ```screenshot
382
- script: app/screenshots/webhook-url-for-delivery-receipt.js
383
- image: public/assets/screenshots/da5f952d465355c19eb888fa1049844b31e090c2.png
384
- ```
385
- ````
386
-
387
- You can also update all examples by running the following command:
388
-
389
- ```
390
- $ rake screenshots:all
391
- ```
392
-
393
- Here is the example of the final rendered output:
394
-
395
- ```screenshot
396
- script: app/screenshots/webhook-url-for-delivery-receipt.js
397
- image: public/assets/screenshots/da5f952d465355c19eb888fa1049844b31e090c2.png
398
- ```
399
-
400
362
  ## Audio (custom plugin)
401
363
 
402
364
  The HTML `<audio>` element can be utilised in Markdown with the following syntax:
@@ -145,7 +145,6 @@ Frontmatter | No | [Implicit] | Strips frontmatter from documents
145
145
  PHPInliner | No | [Implicit] | Fixes a quirk with our code parser that requires PHP code to have `<?php` at the start. This filter adds an option onto PHP code examples that makes this not required.
146
146
  InlineEscape | No | [Extended] | Allows for escaping of inline code where normally the internals would be processes by the markdown. For example this isn't turned into a ``[label]`` when surrounded by two backticks.
147
147
  BlockEscape | No | [Extended] | Allows for escaping of code fences where normally the internals would be processes by the markdown.
148
- Screenshot | No | [Plugin] | Allows for screenshots be put into documentation that are captured by a headless browser so they can be easily refreshed.
149
148
  Anchor | No | [Extended] | Useful for when a title changes, an explicit anchor can be added and renders a non-visible anchor link to the same content.
150
149
  Audio | No | [Extended] | Used to embed audio examples using the `<audio>` element.
151
150
  Tooltip | No | [Extended] | Allows for ^[Toolips](Hello world!) to be added with a markdown-style syntax.
@@ -7,7 +7,6 @@
7
7
  // To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
8
8
  // layout file, like app/views/layouts/application.html.erb
9
9
 
10
- import '@babel/polyfill'
11
10
  import '@vonagevolta/volta2/js/addons/prism'
12
11
 
13
12
  import Rails from "@rails/ujs"
@@ -39,7 +38,6 @@ import GithubCards from '../javascript/github_cards'
39
38
  import VoltaTabbedExamples from '../javascript/volta_tabbed_examples'
40
39
  import Format from '../javascript/format'
41
40
  import Scroll from '../javascript/scroll'
42
- import Spotlight from '../javascript/spotlight'
43
41
  import Notices from '../javascript/notices'
44
42
  import Feedback from '../javascript/components/feedback/Feedback.vue'
45
43
  import JwtGenerator from '../javascript/components/jwt_generator/JwtGenerator.vue'
@@ -62,7 +60,6 @@ $(document).ready(function() {
62
60
  Scroll()
63
61
  CodeSnippetEvents()
64
62
  new Sidenav()
65
- Spotlight()
66
63
  new Careers
67
64
  new LocaleSwitcher
68
65
 
@@ -57,8 +57,6 @@ Rails.application.routes.draw do
57
57
 
58
58
  get '(/:locale)/documentation', to: 'static#documentation', constraints: LocaleConstraint.new, as: :documentation
59
59
 
60
- post '/spotlight', to: 'static#spotlight'
61
-
62
60
  get '/community/slack', to: 'slack#join'
63
61
  post '/community/slack', to: 'slack#invite'
64
62
 
@@ -1,6 +1,6 @@
1
1
  namespace :cache do
2
2
  desc "Clear Rails' redis cache"
3
- task 'clear': :environment do
3
+ task clear: :environment do
4
4
  Rails.cache.clear
5
5
  end
6
6
  end
@@ -1,6 +1,6 @@
1
1
  namespace :careers do
2
2
  desc 'Expire careers cache'
3
- task 'expire_cache': :environment do
3
+ task expire_cache: :environment do
4
4
  p 'Expiring cache...'
5
5
  Greenhouse.expire_cache
6
6
  p 'Done'
@@ -2,7 +2,7 @@ require_relative '../common_errors'
2
2
 
3
3
  namespace :ci do
4
4
  desc 'Verify all pages to make sure that no exceptions are thrown'
5
- task 'verify_pages': :environment do
5
+ task verify_pages: :environment do
6
6
  document_paths =
7
7
  [
8
8
  "#{Rails.configuration.docs_base_path}/_documentation/en/**/*.md",
@@ -24,7 +24,7 @@ namespace :ci do
24
24
  end
25
25
 
26
26
  desc 'Verify side navigation to make sure every page has valid YAML metadata'
27
- task 'verify_navigation': :environment do
27
+ task verify_navigation: :environment do
28
28
  session = ActionDispatch::Integration::Session.new(Rails.application)
29
29
  res = session.get '/documentation'
30
30
 
@@ -35,7 +35,7 @@ namespace :ci do
35
35
  end
36
36
 
37
37
  desc 'Render all OAS based API references'
38
- task 'verify_oas_reference': :environment do
38
+ task verify_oas_reference: :environment do
39
39
  session = ActionDispatch::Integration::Session.new(Rails.application)
40
40
  OpenApiConstraint.list.each do |name|
41
41
  res = session.get "/api/#{name}"
@@ -48,7 +48,7 @@ namespace :ci do
48
48
  end
49
49
 
50
50
  desc 'Ensure all OAS error URLS resolve'
51
- task 'verify_error_urls_resolve': :environment do
51
+ task verify_error_urls_resolve: :environment do
52
52
  session = ActionDispatch::Integration::Session.new(Rails.application)
53
53
  session.host! 'localhost' unless Rails.env.test?
54
54
 
@@ -114,7 +114,7 @@ namespace :ci do
114
114
  end
115
115
  end
116
116
 
117
- task 'check_word_blocklist': :environment do
117
+ task check_word_blocklist: :environment do
118
118
  markdown_files =
119
119
  [
120
120
  "#{Rails.configuration.docs_base_path}/_documentation/en/**/*.md",
@@ -145,7 +145,7 @@ namespace :ci do
145
145
  end
146
146
  end
147
147
 
148
- task 'check_ruby_version': :environment do
148
+ task check_ruby_version: :environment do
149
149
  # We treat .ruby-version as the canonical source
150
150
  ruby_version = File.read('.ruby-version').strip
151
151
 
@@ -154,7 +154,7 @@ namespace :ci do
154
154
  gemfile_version = gemfile.match(/RUBY VERSION.*ruby (\d+\.\d+\.\d+).*BUNDLED WITH/m)[1].strip
155
155
 
156
156
  # How about Docker?
157
- docker = File.read('Dockerfile')
157
+ docker = File.read('../../Dockerfile')
158
158
  docker_version = docker.match(/FROM ruby:(\d+\.\d+\.\d+).*/)[1].strip
159
159
 
160
160
  errors = []
@@ -1,6 +1,6 @@
1
1
  namespace :diff do
2
2
  desc 'Build files for comparison'
3
- task 'execute': :environment do
3
+ task execute: :environment do
4
4
  puts 'Building base'.colorize(:yellow)
5
5
  Rake::Task['diff:build:base'].invoke
6
6
 
@@ -15,24 +15,24 @@ namespace :diff do
15
15
  end
16
16
 
17
17
  desc 'Build files for comparison'
18
- task 'build:base': :environment do
18
+ task 'build:base' => :environment do
19
19
  Diff.generate(mode: 'base')
20
20
  end
21
21
 
22
22
  desc 'Build files for comparison'
23
- task 'build:compare': :environment do
23
+ task 'build:compare' => :environment do
24
24
  Diff.generate(mode: 'compare')
25
25
  end
26
26
 
27
27
  desc 'Build files for comparison'
28
- task 'compare:cli': :environment do
28
+ task 'compare:cli' => :environment do
29
29
  diff = Diff.new
30
30
  diff.diff(:color)
31
31
  diff.report_cli
32
32
  end
33
33
 
34
34
  desc 'Build files for comparison'
35
- task 'compare:pr': :environment do
35
+ task 'compare:pr' => :environment do
36
36
  diff = Diff.new
37
37
  diff.diff(:text)
38
38
  diff.report_pull_request
@@ -1,6 +1,6 @@
1
1
  namespace :documentation do
2
2
  desc 'Verify all pages have meta_title and description keys'
3
- task 'check_keys': :environment do
3
+ task check_keys: :environment do
4
4
  documentation_path = "#{Rails.configuration.docs_base_path}/_documentation/**/*.md"
5
5
  documents = []
6
6
 
@@ -21,7 +21,7 @@ namespace :search_terms do
21
21
  end
22
22
 
23
23
  desc 'Clear the index in Algolia'
24
- task 'algolia:clear': :environment do
24
+ task 'algolia:clear' => :environment do
25
25
  unless ENV['ALGOLIA_APPLICATION_ID']
26
26
  puts 'Not rebuilding search index, Algolia Application ID not set'
27
27
  next
@@ -32,7 +32,7 @@ namespace :search_terms do
32
32
  end
33
33
 
34
34
  desc 'Refresh the Algolia index'
35
- task 'algolia:refresh': :environment do
35
+ task 'algolia:refresh' => :environment do
36
36
  Rake::Task['search_terms:algolia:clear'].invoke
37
37
  Rake::Task['search_terms:algolia:generate'].invoke
38
38
  end
@@ -2,7 +2,7 @@ require 'terminal-table'
2
2
 
3
3
  namespace :links do
4
4
  desc 'Generate a report of all links FROM a given page'
5
- task 'report_outbound': :environment do
5
+ task report_outbound: :environment do
6
6
  ARGV.each { |a| task a.to_sym }
7
7
  filter = ARGV[1]
8
8
  table = Terminal::Table.new do |t|
@@ -18,7 +18,7 @@ namespace :links do
18
18
  end
19
19
 
20
20
  desc 'Generate a report of all links TO a given page'
21
- task 'report_inbound': :environment do
21
+ task report_inbound: :environment do
22
22
  ARGV.each { |a| task a.to_sym }
23
23
  filter = ARGV[1]
24
24
  table = Terminal::Table.new do |t|
@@ -34,21 +34,21 @@ namespace :links do
34
34
  end
35
35
 
36
36
  desc 'Show all pages with no outbound links'
37
- task 'no_links_outbound': :environment do
37
+ task no_links_outbound: :environment do
38
38
  get_links_on_a_page("#{Rails.configuration.docs_base_path}/_documentation/**/*.md").each do |from, to|
39
39
  puts from if to.empty?
40
40
  end
41
41
  end
42
42
 
43
43
  desc 'Show all pages with no inbound links'
44
- task 'no_links_inbound': :environment do
44
+ task no_links_inbound: :environment do
45
45
  get_links_to_a_page("#{Rails.configuration.docs_base_path}/_documentation/**/*.md").each do |to, from|
46
46
  puts to if from.empty?
47
47
  end
48
48
  end
49
49
 
50
50
  desc 'Generate graph of all links out of pages'
51
- task 'graph_outbound': :environment do
51
+ task graph_outbound: :environment do
52
52
  ARGV.each { |a| task a.to_sym }
53
53
  filter = ARGV[1]
54
54
  additional_title = ''
@@ -69,7 +69,7 @@ namespace :links do
69
69
  end
70
70
 
71
71
  desc 'Generate graph of all links to pages'
72
- task 'graph_inbound': :environment do
72
+ task graph_inbound: :environment do
73
73
  ARGV.each { |a| task a.to_sym }
74
74
  filter = ARGV[1]
75
75
  additional_title = ''