foreman_statistics 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +619 -0
  3. data/README.md +40 -0
  4. data/Rakefile +47 -0
  5. data/app/controllers/concerns/foreman_statistics/parameters/trend.rb +20 -0
  6. data/app/controllers/foreman_statistics/api/v2/statistics_controller.rb +33 -0
  7. data/app/controllers/foreman_statistics/api/v2/trends_controller.rb +58 -0
  8. data/app/controllers/foreman_statistics/react_controller.rb +19 -0
  9. data/app/controllers/foreman_statistics/statistics_controller.rb +24 -0
  10. data/app/controllers/foreman_statistics/trends_controller.rb +58 -0
  11. data/app/helpers/foreman_statistics/trends_helper.rb +53 -0
  12. data/app/models/concerns/foreman_statistics/compute_resource_decorations.rb +9 -0
  13. data/app/models/concerns/foreman_statistics/environment_decorations.rb +9 -0
  14. data/app/models/concerns/foreman_statistics/general_setting_decorations.rb +17 -0
  15. data/app/models/concerns/foreman_statistics/hostgroup_decorations.rb +9 -0
  16. data/app/models/concerns/foreman_statistics/model_decorations.rb +9 -0
  17. data/app/models/concerns/foreman_statistics/operatingsystem_decorations.rb +9 -0
  18. data/app/models/concerns/foreman_statistics/setting_decorations.rb +9 -0
  19. data/app/models/foreman_statistics/fact_trend.rb +57 -0
  20. data/app/models/foreman_statistics/foreman_trend.rb +41 -0
  21. data/app/models/foreman_statistics/trend.rb +38 -0
  22. data/app/models/foreman_statistics/trend_counter.rb +11 -0
  23. data/app/services/foreman_statistics/statistics.rb +21 -0
  24. data/app/services/foreman_statistics/statistics/base.rb +39 -0
  25. data/app/services/foreman_statistics/statistics/count_facts.rb +17 -0
  26. data/app/services/foreman_statistics/statistics/count_hosts.rb +9 -0
  27. data/app/services/foreman_statistics/statistics/count_numerical_fact_pair.rb +43 -0
  28. data/app/services/foreman_statistics/statistics/count_puppet_classes.rb +23 -0
  29. data/app/services/foreman_statistics/trend_importer.rb +63 -0
  30. data/app/views/foreman_statistics/api/v2/trends/base.json.rabl +4 -0
  31. data/app/views/foreman_statistics/api/v2/trends/create.json.rabl +3 -0
  32. data/app/views/foreman_statistics/api/v2/trends/index.json.rabl +3 -0
  33. data/app/views/foreman_statistics/api/v2/trends/main.json.rabl +5 -0
  34. data/app/views/foreman_statistics/api/v2/trends/show.json.rabl +3 -0
  35. data/app/views/foreman_statistics/api/v2/trends/update.json.rabl +3 -0
  36. data/app/views/foreman_statistics/layouts/application_react.html.erb +16 -0
  37. data/app/views/foreman_statistics/trends/_empty_data.html.erb +7 -0
  38. data/app/views/foreman_statistics/trends/_fields.html.erb +7 -0
  39. data/app/views/foreman_statistics/trends/_form.html.erb +8 -0
  40. data/app/views/foreman_statistics/trends/_hosts.html.erb +13 -0
  41. data/app/views/foreman_statistics/trends/edit.html.erb +46 -0
  42. data/app/views/foreman_statistics/trends/index.html.erb +39 -0
  43. data/app/views/foreman_statistics/trends/new.html.erb +4 -0
  44. data/app/views/foreman_statistics/trends/show.html.erb +25 -0
  45. data/app/views/foreman_statistics/trends/welcome.html.erb +12 -0
  46. data/config/routes.rb +22 -0
  47. data/db/migrate/20200605153005_migrate_core_types.rb +15 -0
  48. data/db/migrate_foreman/20121012170851_create_trends.rb +25 -0
  49. data/db/migrate_foreman/20121012170936_create_trend_counters.rb +14 -0
  50. data/db/migrate_foreman/20150202094307_add_range_to_trend_counters.rb +6 -0
  51. data/db/migrate_foreman/20181031155025_add_trend_counter_created_at_unique_constraint.rb +9 -0
  52. data/lib/foreman_statistics.rb +4 -0
  53. data/lib/foreman_statistics/engine.rb +104 -0
  54. data/lib/foreman_statistics/version.rb +3 -0
  55. data/lib/tasks/foreman_statistics_tasks.rake +78 -0
  56. data/locale/Makefile +60 -0
  57. data/locale/en/foreman_statistics.po +19 -0
  58. data/locale/foreman_statistics.pot +19 -0
  59. data/locale/gemspec.rb +2 -0
  60. data/test/factories/foreman_statistics_factories.rb +68 -0
  61. data/test/fixtures/permissions.yml +26 -0
  62. data/test/fixtures/settings.yml +6 -0
  63. data/test/functional/foreman_statistics/api/v2/statistics_controller_test.rb +19 -0
  64. data/test/functional/foreman_statistics/api/v2/trends_controller_test.rb +74 -0
  65. data/test/functional/foreman_statistics/statistics_controller_test.rb +23 -0
  66. data/test/functional/foreman_statistics/trends_controller_test.rb +115 -0
  67. data/test/models/foreman_statistics/trend_counter_test.rb +10 -0
  68. data/test/models/foreman_statistics/trend_test.rb +22 -0
  69. data/test/test_plugin_helper.rb +6 -0
  70. data/test/unit/foreman_statistics/access_permissions_test.rb +16 -0
  71. data/test/unit/foreman_statistics/statistics_test.rb +82 -0
  72. data/test/unit/foreman_statistics_test.rb +11 -0
  73. data/test/unit/tasks/foreman_statistics_tasks_test.rb +205 -0
  74. metadata +199 -0
@@ -0,0 +1,8 @@
1
+ <%= form_for @trend do |f| %>
2
+ <%= base_errors_for @trend %>
3
+ <% types = trendable_types %>
4
+ <%= selectable_f f, :trendable_type, types, { }, :place_holder => _('Please Select'), :onchange => 'tfm.trends.trendTypeSelected(this)' %>
5
+ <%= select_f(f, :trendable_id, FactName.no_timestamp_fact, :id, :name, { :include_blank => true }, :disabled => types.first[1] != 'FactName') %>
6
+ <%= text_f f, :name, :disabled => types.first[1] != 'FactName' %>
7
+ <%= submit_or_cancel f %>
8
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <% @trend.find_hosts.in_groups(4, false) do |group| %>
2
+ <div class="col-md-3">
3
+ <td>
4
+ <% group.each do |host| %>
5
+ <ul class="base">
6
+ <li>
7
+ <%= link_to(host, host_path(:id => host), :title => _("Show Host")) %>
8
+ </li>
9
+ </ul>
10
+ <% end %>
11
+ </td>
12
+ </div>
13
+ <% end %>
@@ -0,0 +1,46 @@
1
+ <% title _("Edit Trend %s") % @trend.to_label %>
2
+ <div class="col-md-6">
3
+ <%= form_tag trend_path, :method => :put do %>
4
+ <% if @trend.is_a?(ForemanStatistics::FactTrend) %>
5
+ <table class="table">
6
+ <thead>
7
+ <tr>
8
+ <th style='width: 40%'><%= _("Fact Name") %></th>
9
+ <th style="width: 60%"><%= _("Display Name") %></th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <tr>
14
+ <%= fields_for "trend[]", @trend do |f| %>
15
+ <td>
16
+ <%= @trend.fact_name %>
17
+ </td>
18
+ <td>
19
+ <%= f.text_field :name %>
20
+ </td>
21
+ <% end %>
22
+ </tr>
23
+ </tbody>
24
+ </table>
25
+ <% end %>
26
+ <table class="table">
27
+ <thead>
28
+ <tr>
29
+ <th style="width: 40%">Value</th>
30
+ <th style="width: 60%"><%= _("Display Name") %></th>
31
+ </tr>
32
+ </thead>
33
+ <tbody>
34
+ <% @trend.values.each do |trend| %>
35
+ <tr>
36
+ <%= fields_for "trend[]", trend do |f| %>
37
+ <%= render 'fields', :f => f, :trend => trend %>
38
+ <% end %>
39
+ </tr>
40
+ <% end %>
41
+ </tbody>
42
+ </table>
43
+ <%= link_to(_("Cancel"), trends_path, :class => "btn btn-default") %>
44
+ <%= submit_tag _("Submit"), :class => "btn-primary btn" %>
45
+ <% end %>
46
+ </div>
@@ -0,0 +1,39 @@
1
+ <%= javascript 'charts' %>
2
+ <% title _("Trends") %>
3
+ <% title_actions new_link(_("Add Trend Counter")),
4
+ documentation_button('4.1.3Trends') %>
5
+ <% if @trends.empty? %>
6
+ <%= alert :class => 'alert-info', :header => _("No trend counter defined"),
7
+ :text => (_("To define trend counters, use the Add Trend Counter button.</br> To start collecting trend data, set a cron job to execute 'foreman-rake foreman_statistics:trends:counter' at least every %s minutes.") % Setting[:outofsync_interval]).html_safe %>
8
+ <% end %>
9
+
10
+ <% if @trends.any? and ForemanStatistics::TrendCounter.unconfigured? %>
11
+ <%= alert :class => 'alert-info', :header => _("No trend counter found"),
12
+ :text => (_("To start collecting trend data, set a cron job to execute <span class='black'>foreman-rake foreman_statistics:trends:counter</span> at least every %s minutes.") % Setting[:outofsync_interval]).html_safe %>
13
+ <% end %>
14
+
15
+ <table class="<%= table_css_classes 'table-fixed' %>">
16
+ <thead>
17
+ <tr>
18
+ <th class='col-md-10'><%= _("Name") %></th>
19
+ <th class='col-md-2'><%= _("Action") %></th>
20
+ </tr>
21
+ </thead>
22
+ <tbody>
23
+ <% @trends.each do |trend| %>
24
+ <tr>
25
+ <td class="ellipsis"><%= link_to trend.to_label, trend_path(:id => trend), :title => _("Show Trends") %></td>
26
+ <td>
27
+ <%= action_buttons(
28
+ display_link_if_authorized(_("Edit"), hash_for_edit_trend_path(:id => trend)),
29
+ display_delete_if_authorized(hash_for_trend_path(:id => trend), :data => { :confirm => _("Delete all the trend history for %s?") % trend.type_name })) %>
30
+ </td>
31
+ </tr>
32
+ <% end %>
33
+ </tbody>
34
+ </table>
35
+ <%= will_paginate_with_info @trends %>
36
+ <% unless ForemanStatistics::TrendCounter.unconfigured? %>
37
+ <%= _("Last update:") %>
38
+ <%= date_time_relative(ForemanStatistics::TrendCounter.order(:created_at).last.created_at) %>
39
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <% title _("Create Trend") %>
2
+ <% javascript *webpack_asset_paths('foreman_statistics', :extension => 'js') %>
3
+
4
+ <%= render :partial => 'form' %>
@@ -0,0 +1,25 @@
1
+ <%= javascript 'charts' %>
2
+ <% title(_("Trends for %s") % trend_title(@trend)) %>
3
+ <% content_for(:search_bar) { trend_days_filter(@trend) } %>
4
+ <div class="row">
5
+ <div class="stats-well col-md-12">
6
+ <h4 class="ca"><%= "#{trend_title(@trend)}" %></h4>
7
+ <h6 class="ca"><%= n_("last %s day", "last %s days", range) % range %></h6>
8
+ <%= flot_chart 'trend_graph','' ,_('Number of Hosts') , chart_data(@trend, range.days.ago), :class=>'statistics-chart stack', :legend => 'external' %>
9
+ </div>
10
+ </div>
11
+ <div id="legendContainer"></div>
12
+ <table class="table">
13
+ <% unless @trend.fact_value.nil? %>
14
+ <thead>
15
+ <tr>
16
+ <th colspan="4"><%= _("Hosts") %></th>
17
+ </tr>
18
+ </thead>
19
+ <tbody>
20
+ <tr>
21
+ <%= render 'hosts' %>
22
+ </tr>
23
+ </tbody>
24
+ <% end %>
25
+ </table>
@@ -0,0 +1,12 @@
1
+ <% content_for(:title, _("Trends")) %>
2
+ <div class="blank-slate-pf">
3
+ <div class="blank-slate-pf-icon">
4
+ <%= icon_text("area-chart", "", :kind => "fa") %>
5
+ </div>
6
+ <h1><%= _('Trends') %></h1>
7
+ <p><%= _("Trends in Foreman allow you to track changes in your infrastructure over time. It allows you to track both Foreman related information and to any fact. The Trend pages give a graph of how the number of hosts with that value have changed over time, and list the current hosts.") %></p>
8
+ <p><%= link_to _('Learn more about this in the documentation.'), documentation_url("4.1.3Trends")%></p>
9
+ <div class="blank-slate-pf-main-action">
10
+ <%= new_link(_("Add Trend Counter"), :class => 'btn-lg') %>
11
+ </div>
12
+ </div>
@@ -0,0 +1,22 @@
1
+ ForemanStatistics::Engine.routes.draw do
2
+ resources :trends do
3
+ collection do
4
+ post 'count'
5
+ get 'help', :action => :welcome
6
+ end
7
+ end
8
+
9
+ resources :statistics, :only => %i[index show], constraints: ->(req) { req.format == :json }
10
+ match 'statistics' => 'react#index', :via => :get
11
+
12
+ namespace :api, defaults: { format: 'json' } do
13
+ scope '(:apiv)', module: :v2, defaults: { apiv: 'v2' }, apiv: /v1|v2/, constraints: ApiConstraints.new(version: 2, default: true) do
14
+ resources :trends, :only => %i[create index show destroy]
15
+ resources :statistics, :only => [:index]
16
+ end
17
+ end
18
+ end
19
+
20
+ Foreman::Application.routes.draw do
21
+ mount ForemanStatistics::Engine, at: '/foreman_statistics'
22
+ end
@@ -0,0 +1,15 @@
1
+ class MigrateCoreTypes < ActiveRecord::Migration[6.0]
2
+ def up
3
+ Permission.where(:resource_type => 'Trend').update_all(:resource_type => 'ForemanStatistics::Trend')
4
+ %w[ForemanTrend FactTrend Trend].each do |t|
5
+ Trend.where(:type => t).update_all(:type => "ForemanStatistics::#{t}")
6
+ end
7
+ end
8
+
9
+ def down
10
+ Permission.where(:resource_type => 'ForemanStatistics::Trend').update_all(:resource_type => 'Trend')
11
+ %w[ForemanTrend FactTrend Trend].each do |t|
12
+ Trend.where(:type => "ForemanStatistics::#{t}").update_all(:type => t)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ class CreateTrends < ActiveRecord::Migration[6.0]
2
+ def up
3
+ create_table :trends do |t|
4
+ t.string :trendable_type, :limit => 255
5
+ t.integer :trendable_id
6
+ t.string :name, :limit => 255
7
+ t.string :type, :limit => 255
8
+ t.string :fact_value, :limit => 255
9
+ t.string :fact_name, :limit => 255
10
+
11
+ t.timestamps null: true
12
+ end
13
+ add_index :trends, :type
14
+ add_index :trends, %i[trendable_type trendable_id]
15
+ add_index :trends, :fact_value
16
+ end
17
+
18
+ def down
19
+ remove_index :trends, :type
20
+ remove_index :trends, %i[trendable_type trendable_id]
21
+ remove_index :trends, :fact_value
22
+
23
+ drop_table :trends
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ class CreateTrendCounters < ActiveRecord::Migration[6.0]
2
+ def up
3
+ create_table :trend_counters do |t|
4
+ t.references :trend, foreign_key: true
5
+ t.integer :count
6
+
7
+ t.timestamps null: true
8
+ end
9
+ end
10
+
11
+ def down
12
+ drop_table :trend_counters
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class AddRangeToTrendCounters < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :trend_counters, :interval_start, :datetime
4
+ add_column :trend_counters, :interval_end, :datetime
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ class AddTrendCounterCreatedAtUniqueConstraint < ActiveRecord::Migration[6.0]
2
+ def up
3
+ add_index :trend_counters, %i[trend_id created_at], unique: true
4
+ end
5
+
6
+ def down
7
+ remove_index :trend_counters, %i[trend_id created_at]
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ require 'foreman_statistics/engine'
2
+
3
+ module ForemanStatistics
4
+ end
@@ -0,0 +1,104 @@
1
+ module ForemanStatistics
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace ForemanStatistics
4
+ engine_name 'foreman_statistics'
5
+
6
+ config.autoload_paths += Dir["#{config.root}/app/controllers/concerns"]
7
+ config.autoload_paths += Dir["#{config.root}/app/helpers/concerns"]
8
+ config.autoload_paths += Dir["#{config.root}/app/models/concerns"]
9
+ config.autoload_paths += Dir["#{config.root}/app/overrides"]
10
+
11
+ config.paths['db/migrate'] << 'db/migrate_foreman' if Gem::Dependency.new('', '>= 2.2').match?('', SETTINGS[:version])
12
+
13
+ # Add any db migrations
14
+ initializer 'foreman_statistics.load_app_instance_data' do |app|
15
+ ForemanStatistics::Engine.paths['db/migrate'].existent.each do |path|
16
+ app.config.paths['db/migrate'] << path
17
+ end
18
+ end
19
+
20
+ initializer 'foreman_statistics.register_plugin', :before => :finisher_hook do |_app|
21
+ Foreman::Plugin.register :foreman_statistics do
22
+ requires_foreman '>= 2.1.0'
23
+
24
+ # ==== Core cleanups
25
+ # TODO: clean up when this gets removed from core
26
+ delete_menu_item :top_menu, :trends
27
+ delete_menu_item :top_menu, :statistics
28
+ # ====
29
+
30
+ # Add Global JS file for extending foreman-core components and routes
31
+ register_global_js_file 'fills'
32
+
33
+ # Remove core permissions
34
+ %i[view_statistics view_trends create_trends edit_trends destroy_trends update_trends].each do |perm_name|
35
+ p = Foreman::AccessControl.permission(perm_name)
36
+ Foreman::AccessControl.remove_permission(p)
37
+ end
38
+
39
+ # Add permissions
40
+ security_block :foreman_statistics do
41
+ permission :view_statistics, { :'foreman_statistics/react' => [:index],
42
+ :'foreman_statistics/statistics' => %i[index show],
43
+ :'foreman_statistics/api/v2/statistics' => [:index] }
44
+
45
+ permission :view_trends, { :'foreman_statistics/trends' => %i[index show welcome],
46
+ :'foreman_statistics/api/v2/trends' => %i[index show] },
47
+ :resource_type => 'ForemanStatistics::Trend'
48
+ permission :create_trends, { :'foreman_statistics/trends' => %i[new create],
49
+ :'foreman_statistics/api/v2/trends' => %i[new create] },
50
+ :resource_type => 'ForemanStatistics::Trend'
51
+ permission :edit_trends, { :'foreman_statistics/trends' => %i[edit update] },
52
+ :resource_type => 'ForemanStatistics::Trend'
53
+ permission :destroy_trends, { :'foreman_statistics/trends' => [:destroy],
54
+ :'foreman_statistics/api/v2/trends' => [:destroy] },
55
+ :resource_type => 'ForemanStatistics::Trend'
56
+ permission :update_trends, { :'foreman_statistics/trends' => [:count] },
57
+ :resource_type => 'ForemanStatistics::Trend'
58
+ end
59
+
60
+ # add_resource_permissions_to_default_roles(['ForemanStatistics::Trend'])
61
+
62
+ add_menu_item :top_menu, :trends, {
63
+ :caption => N_('Trends'),
64
+ :engine => ForemanStatistics::Engine, :parent => :monitor_menu, :after => :audits,
65
+ :url_hash => { :controller => 'foreman_statistics/trends', :action => :index }
66
+ }
67
+
68
+ add_menu_item :top_menu, :statistics, {
69
+ :caption => N_('Statistics'),
70
+ :engine => ForemanStatistics::Engine, :parent => :monitor_menu, :after => :trends,
71
+ :url_hash => { :controller => 'foreman_statistics/statistics', :action => :index }
72
+ }
73
+ end
74
+ end
75
+
76
+ # Include concerns in this config.to_prepare block
77
+ config.to_prepare do
78
+ ::ComputeResource.include ForemanStatistics::ComputeResourceDecorations
79
+ ::Environment.include ForemanStatistics::EnvironmentDecorations
80
+ ::Hostgroup.include ForemanStatistics::HostgroupDecorations
81
+ ::Model.include ForemanStatistics::ModelDecorations
82
+ ::Operatingsystem.include ForemanStatistics::OperatingsystemDecorations
83
+ ::Setting.include ForemanStatistics::SettingDecorations
84
+ ::Setting::General.prepend ForemanStatistics::GeneralSettingDecorations
85
+ begin
86
+ ::Setting::General.load_defaults
87
+ rescue ActiveRecord::NoDatabaseError => e
88
+ Rails.logger.warn e
89
+ end
90
+ end
91
+
92
+ rake_tasks do
93
+ Rake::Task['db:seed'].enhance do
94
+ ForemanStatistics::Engine.load_seed
95
+ end
96
+ end
97
+
98
+ initializer 'foreman_statistics.register_gettext', after: :load_config_initializers do |_app|
99
+ locale_dir = File.join(File.expand_path('../..', __dir__), 'locale')
100
+ locale_domain = 'foreman_statistics'
101
+ Foreman::Gettext::Support.add_text_domain locale_domain, locale_dir
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,3 @@
1
+ module ForemanStatistics
2
+ VERSION = '0.1.0'.freeze
3
+ end
@@ -0,0 +1,78 @@
1
+ require 'rake/testtask'
2
+
3
+ # Tasks
4
+ namespace :foreman_statistics do
5
+ namespace :trends do
6
+ desc 'Create Trend counts'
7
+ task :counter => :environment do
8
+ ForemanStatistics::TrendImporter.update!
9
+ end
10
+
11
+ desc 'Reduces amount of points for each trend group'
12
+ task :reduce => :environment do
13
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
14
+
15
+ trends = ForemanStatistics::Trend.pluck(:id)
16
+ trends_count = trends.length
17
+ current_record = 0
18
+
19
+ trends.each do |trend_id|
20
+ puts "Working on trend_id #{trend_id}, #{(current_record += 1)} of #{trends_count}" unless Rails.env.test?
21
+
22
+ current_interval = ForemanStatistics::TrendCounter.where(trend_id: trend_id).order(:created_at).first
23
+ next if current_interval.nil?
24
+
25
+ current_interval.interval_start = current_interval.created_at
26
+ while (next_interval = ForemanStatistics::TrendCounter.where(trend_id: trend_id)
27
+ .where('created_at > ? and count <> ?', current_interval.created_at, current_interval.count)
28
+ .order(:created_at).first)
29
+ current_interval.interval_end = next_interval.created_at
30
+ current_interval.save!
31
+ current_interval = next_interval
32
+ current_interval.interval_start = current_interval.created_at
33
+ end
34
+ current_interval.save!
35
+ end
36
+
37
+ ForemanStatistics::TrendCounter.unscoped.where(interval_start: nil).delete_all
38
+
39
+ puts "It took #{Process.clock_gettime(Process::CLOCK_MONOTONIC) - start} seconds to complete" unless Rails.env.test?
40
+ end
41
+ end
42
+ end
43
+
44
+ # Tests
45
+ namespace :test do
46
+ desc 'Test ForemanStatistics'
47
+ Rake::TestTask.new(:foreman_statistics) do |t|
48
+ test_dir = File.join(File.dirname(__FILE__), '../..', 'test')
49
+ t.libs << ['test', test_dir]
50
+ t.pattern = "#{test_dir}/**/*_test.rb"
51
+ t.verbose = true
52
+ t.warning = false
53
+ end
54
+ end
55
+
56
+ namespace :foreman_statistics do
57
+ task :rubocop do
58
+ begin
59
+ require 'rubocop/rake_task'
60
+ RuboCop::RakeTask.new(:rubocop_foreman_statistics) do |task|
61
+ task.patterns = ["#{ForemanStatistics::Engine.root}/app/**/*.rb",
62
+ "#{ForemanStatistics::Engine.root}/lib/**/*.rb",
63
+ "#{ForemanStatistics::Engine.root}/test/**/*.rb"]
64
+ end
65
+ rescue StandardError
66
+ puts 'Rubocop not loaded.'
67
+ end
68
+
69
+ Rake::Task['rubocop_foreman_statistics'].invoke
70
+ end
71
+ end
72
+
73
+ Rake::Task[:test].enhance ['test:foreman_statistics']
74
+
75
+ load 'tasks/jenkins.rake'
76
+ if Rake::Task.task_defined?(:'jenkins:unit')
77
+ Rake::Task['jenkins:unit'].enhance ['test:foreman_statistics', 'foreman_statistics:rubocop']
78
+ end