From bfd06ce058ea909c47047e289b9874f84f5d9879 Mon Sep 17 00:00:00 2001 From: Yang Zhao Date: Thu, 19 Jan 2017 14:12:03 +0000 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E8=B7=AF=E5=BE=84=E5=92=8CAP?= =?UTF-8?q?P=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.rdoc | 32 +- reports/metric_fu/_data/20170103.yml | 5625 +++++++++++ .../0372be451d4207e57c60fe0ae29614.html | 2434 +++++ .../040453e670f9bf522378f941c96f38.html | 63 + .../056e56384f5153a763670265fa1c30.html | 744 ++ .../0db745639a46a8e60ee3be5e867105.html | 787 ++ .../0f158ffa97e326bbad1e7a593caead.html | 910 ++ .../1fd324d1e48fdc6e60be4573529460.html | 67 + .../28f48e0bc2718ddf87752d15b58a00.html | 917 ++ .../2cda0c6171fa7d04989507a1dd112e.html | 1343 +++ .../336729fa1d697a94f8a10fcbe3204b.html | 938 ++ .../35561829cbd17d96aac6104bfe4e41.html | 495 + .../3c949a9cef12a5b36b0ed70b82e018.html | 275 + .../479de84fe6df2ab07a531646b3fe83.html | 2510 +++++ .../49a7b37ff5a3322cd08801bd9db830.html | 2486 +++++ .../4a4e4e8e815ed295b3675d506899fa.html | 627 ++ .../4ed0c03b53dbc8320da88e78874655.html | 271 + .../586fb7c4e1add2d4d24e27566ed706.html | 648 ++ .../59459d8ae6eb34ed02b9dd3b6d4020.html | 63 + .../5af42da2f5d83e170fdde3782f6933.html | 67 + .../62e9dd18e626544eade9ed0b20dc35.html | 834 ++ .../6a75ab7bf4bb23129765c49ac82b22.html | 1379 +++ .../6da1532795e88ec4f5566b4ae0fbb2.html | 526 + .../7dc0dd94f601e507e2a20bad6adcf1.html | 297 + .../8072e824009715d8b89c1b35b6b34a.html | 510 + .../82f5d4f89a95414eac71b95d163c05.html | 850 ++ .../848e5d85436bd98a9ff164a8c102f8.html | 626 ++ .../867b0d6900a9fdc8387912df121530.html | 2494 +++++ .../8c039b786f7387f47d72c2d87dfe82.html | 622 ++ .../982d8070d769dd9745ad39d380ddc4.html | 498 + .../9b10b709acd94e71dd3a7d2d2eafc8.html | 797 ++ .../a6b6b6ea6c02af1e0847c02ef3d27b.html | 639 ++ .../a7c8e5306369685dc160701bbafa8a.html | 507 + .../a865d6cd53557a9dc1ee1be9f54f9c.html | 830 ++ .../ad557ebe130d80c883f00b97d8b633.html | 1123 +++ .../b16a6c9078bee9e4a21cdc3769d1f7.html | 163 + .../b78ca6f60114b0a291eed6a60bb703.html | 1373 +++ .../bc1187795f0f6bc820baf63adb995e.html | 2542 +++++ .../bd236a15491f27071ae7eff32d9569.html | 623 ++ .../bee33d336c194b40053da6e55f73ab.html | 738 ++ reports/metric_fu/output/bluff-min.js | 1 + reports/metric_fu/output/bluff_graph.js | 15 + .../c555c2a7405663c6de0bf97fda1795.html | 499 + .../c68b2223ecc316803aa9a1fac8d026.html | 514 + reports/metric_fu/output/churn.html | 602 ++ .../d4817edd52d8fed318c8093c134d0f.html | 271 + .../d5661a80f29613c4639194a4590030.html | 2430 +++++ .../d77bcf2e32d9b5be36cec41f45385e.html | 275 + .../db1473ea3bf22cb068987f76accffa.html | 783 ++ .../de882ff77d4a5d5fc32876cf4a3162.html | 734 ++ .../e7659e4d60673db32cf627de6ccc8d.html | 287 + .../e782303906061f982438021be1eaff.html | 627 ++ .../e9733564f675453b1f324b65b93eaf.html | 918 ++ .../eea85b20f9cc91cfbd0d5109cd9100.html | 63 + reports/metric_fu/output/excanvas.js | 35 + .../f0ac75ef65c83c69099f12437e6ff1.html | 879 ++ .../f4e09c0c86f17297887b6b687bc49b.html | 510 + reports/metric_fu/output/flay.html | 604 ++ reports/metric_fu/output/flay.js | 3 + reports/metric_fu/output/highcharts.js | 294 + reports/metric_fu/output/highcharts_graph.js | 38 + reports/metric_fu/output/hotspots.html | 3192 ++++++ reports/metric_fu/output/index.html | 589 ++ reports/metric_fu/output/js-class.js | 1 + .../output/rails_best_practices.html | 723 ++ .../metric_fu/output/rails_best_practices.js | 3 + reports/metric_fu/output/rcov.html | 8533 +++++++++++++++++ reports/metric_fu/output/rcov.js | 3 + reports/metric_fu/output/reek.html | 1494 +++ reports/metric_fu/output/reek.js | 3 + reports/metric_fu/output/roodi.html | 627 ++ reports/metric_fu/output/roodi.js | 3 + reports/metric_fu/output/saikuro.html | 1704 ++++ .../metric_fu/output/standalone-framework.js | 17 + reports/metric_fu/output/stats.html | 653 ++ reports/metric_fu/output/stats.js | 3 + reports/metric_fu/output/utils.js | 9 + reports/metric_fu/report.yml | 5625 +++++++++++ ...27d9087ce9d29318206d328847a9cee1ad1ba.json | 1 + ...d8fda9b061141447ab6b39d744586a53406d0.json | 1 + 80 files changed, 72811 insertions(+), 28 deletions(-) create mode 100644 reports/metric_fu/_data/20170103.yml create mode 100644 reports/metric_fu/output/0372be451d4207e57c60fe0ae29614.html create mode 100644 reports/metric_fu/output/040453e670f9bf522378f941c96f38.html create mode 100644 reports/metric_fu/output/056e56384f5153a763670265fa1c30.html create mode 100644 reports/metric_fu/output/0db745639a46a8e60ee3be5e867105.html create mode 100644 reports/metric_fu/output/0f158ffa97e326bbad1e7a593caead.html create mode 100644 reports/metric_fu/output/1fd324d1e48fdc6e60be4573529460.html create mode 100644 reports/metric_fu/output/28f48e0bc2718ddf87752d15b58a00.html create mode 100644 reports/metric_fu/output/2cda0c6171fa7d04989507a1dd112e.html create mode 100644 reports/metric_fu/output/336729fa1d697a94f8a10fcbe3204b.html create mode 100644 reports/metric_fu/output/35561829cbd17d96aac6104bfe4e41.html create mode 100644 reports/metric_fu/output/3c949a9cef12a5b36b0ed70b82e018.html create mode 100644 reports/metric_fu/output/479de84fe6df2ab07a531646b3fe83.html create mode 100644 reports/metric_fu/output/49a7b37ff5a3322cd08801bd9db830.html create mode 100644 reports/metric_fu/output/4a4e4e8e815ed295b3675d506899fa.html create mode 100644 reports/metric_fu/output/4ed0c03b53dbc8320da88e78874655.html create mode 100644 reports/metric_fu/output/586fb7c4e1add2d4d24e27566ed706.html create mode 100644 reports/metric_fu/output/59459d8ae6eb34ed02b9dd3b6d4020.html create mode 100644 reports/metric_fu/output/5af42da2f5d83e170fdde3782f6933.html create mode 100644 reports/metric_fu/output/62e9dd18e626544eade9ed0b20dc35.html create mode 100644 reports/metric_fu/output/6a75ab7bf4bb23129765c49ac82b22.html create mode 100644 reports/metric_fu/output/6da1532795e88ec4f5566b4ae0fbb2.html create mode 100644 reports/metric_fu/output/7dc0dd94f601e507e2a20bad6adcf1.html create mode 100644 reports/metric_fu/output/8072e824009715d8b89c1b35b6b34a.html create mode 100644 reports/metric_fu/output/82f5d4f89a95414eac71b95d163c05.html create mode 100644 reports/metric_fu/output/848e5d85436bd98a9ff164a8c102f8.html create mode 100644 reports/metric_fu/output/867b0d6900a9fdc8387912df121530.html create mode 100644 reports/metric_fu/output/8c039b786f7387f47d72c2d87dfe82.html create mode 100644 reports/metric_fu/output/982d8070d769dd9745ad39d380ddc4.html create mode 100644 reports/metric_fu/output/9b10b709acd94e71dd3a7d2d2eafc8.html create mode 100644 reports/metric_fu/output/a6b6b6ea6c02af1e0847c02ef3d27b.html create mode 100644 reports/metric_fu/output/a7c8e5306369685dc160701bbafa8a.html create mode 100644 reports/metric_fu/output/a865d6cd53557a9dc1ee1be9f54f9c.html create mode 100644 reports/metric_fu/output/ad557ebe130d80c883f00b97d8b633.html create mode 100644 reports/metric_fu/output/b16a6c9078bee9e4a21cdc3769d1f7.html create mode 100644 reports/metric_fu/output/b78ca6f60114b0a291eed6a60bb703.html create mode 100644 reports/metric_fu/output/bc1187795f0f6bc820baf63adb995e.html create mode 100644 reports/metric_fu/output/bd236a15491f27071ae7eff32d9569.html create mode 100644 reports/metric_fu/output/bee33d336c194b40053da6e55f73ab.html create mode 100644 reports/metric_fu/output/bluff-min.js create mode 100644 reports/metric_fu/output/bluff_graph.js create mode 100644 reports/metric_fu/output/c555c2a7405663c6de0bf97fda1795.html create mode 100644 reports/metric_fu/output/c68b2223ecc316803aa9a1fac8d026.html create mode 100644 reports/metric_fu/output/churn.html create mode 100644 reports/metric_fu/output/d4817edd52d8fed318c8093c134d0f.html create mode 100644 reports/metric_fu/output/d5661a80f29613c4639194a4590030.html create mode 100644 reports/metric_fu/output/d77bcf2e32d9b5be36cec41f45385e.html create mode 100644 reports/metric_fu/output/db1473ea3bf22cb068987f76accffa.html create mode 100644 reports/metric_fu/output/de882ff77d4a5d5fc32876cf4a3162.html create mode 100644 reports/metric_fu/output/e7659e4d60673db32cf627de6ccc8d.html create mode 100644 reports/metric_fu/output/e782303906061f982438021be1eaff.html create mode 100644 reports/metric_fu/output/e9733564f675453b1f324b65b93eaf.html create mode 100644 reports/metric_fu/output/eea85b20f9cc91cfbd0d5109cd9100.html create mode 100644 reports/metric_fu/output/excanvas.js create mode 100644 reports/metric_fu/output/f0ac75ef65c83c69099f12437e6ff1.html create mode 100644 reports/metric_fu/output/f4e09c0c86f17297887b6b687bc49b.html create mode 100644 reports/metric_fu/output/flay.html create mode 100644 reports/metric_fu/output/flay.js create mode 100644 reports/metric_fu/output/highcharts.js create mode 100644 reports/metric_fu/output/highcharts_graph.js create mode 100644 reports/metric_fu/output/hotspots.html create mode 100644 reports/metric_fu/output/index.html create mode 100644 reports/metric_fu/output/js-class.js create mode 100644 reports/metric_fu/output/rails_best_practices.html create mode 100644 reports/metric_fu/output/rails_best_practices.js create mode 100644 reports/metric_fu/output/rcov.html create mode 100644 reports/metric_fu/output/rcov.js create mode 100644 reports/metric_fu/output/reek.html create mode 100644 reports/metric_fu/output/reek.js create mode 100644 reports/metric_fu/output/roodi.html create mode 100644 reports/metric_fu/output/roodi.js create mode 100644 reports/metric_fu/output/saikuro.html create mode 100644 reports/metric_fu/output/standalone-framework.js create mode 100644 reports/metric_fu/output/stats.html create mode 100644 reports/metric_fu/output/stats.js create mode 100644 reports/metric_fu/output/utils.js create mode 100644 reports/metric_fu/report.yml create mode 100644 reports/metric_fu/scratch/churn/cf527d9087ce9d29318206d328847a9cee1ad1ba.json create mode 100644 reports/metric_fu/scratch/churn/ef6d8fda9b061141447ab6b39d744586a53406d0.json diff --git a/README.rdoc b/README.rdoc index dd4e97e..62b206f 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,28 +1,4 @@ -== README - -This README would normally document whatever steps are necessary to get the -application up and running. - -Things you may want to cover: - -* Ruby version - -* System dependencies - -* Configuration - -* Database creation - -* Database initialization - -* How to run the test suite - -* Services (job queues, cache servers, search engines, etc.) - -* Deployment instructions - -* ... - - -Please feel free to use a different markup language if you do not plan to run -rake doc:app. +APP-URL:https://ambition-ucas.herokuapp.com/pages/login.html +用户名:lucio.yang@qq.com +密码:123123123 +报告路径:reports/metric_fu/output/index.html \ No newline at end of file diff --git a/reports/metric_fu/_data/20170103.yml b/reports/metric_fu/_data/20170103.yml new file mode 100644 index 0000000..cba9aee --- /dev/null +++ b/reports/metric_fu/_data/20170103.yml @@ -0,0 +1,5625 @@ +--- +:flay: + :total_score: '268' + :matches: + - :reason: 1) Similar code found in :defn (mass = 160) + :matches: + - :name: app/models/comment.rb + :line: '23' + - :name: app/models/mission.rb + :line: '36' + - :name: app/models/missions_user.rb + :line: '10' + - :name: app/models/missions_user.rb + :line: '20' + - :name: app/models/note.rb + :line: '32' + - :name: app/models/note.rb + :line: '41' + - :name: app/models/projects_user.rb + :line: '11' + - :name: app/models/projects_user.rb + :line: '20' + - :name: app/models/share.rb + :line: '20' + - :name: app/models/share.rb + :line: '28' + - :reason: 2) Similar code found in :lasgn (mass = 40) + :matches: + - :name: app/controllers/projects_controller.rb + :line: '66' + - :name: app/controllers/projects_controller.rb + :line: '92' + - :reason: 3) Similar code found in :defn (mass = 36) + :matches: + - :name: app/models/mission.rb + :line: '22' + - :name: app/models/note.rb + :line: '24' + - :reason: 4) Similar code found in :defn (mass = 32) + :matches: + - :name: app/controllers/users_controller.rb + :line: '11' + - :name: app/controllers/users_controller.rb + :line: '19' +:rails_best_practices: + :total: + - Found 31 errors. + :problems: + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '16' + :problem: always add db index (comments => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '26' + :problem: always add db index (missions => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '37' + :problem: always add db index (missions_users => [mission_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '37' + :problem: always add db index (missions_users => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '42' + :problem: always add db index (notes => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '60' + :problem: always add db index (projects_users => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '60' + :problem: always add db index (projects_users => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '65' + :problem: always add db index (shares => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '65' + :problem: always add db index (shares => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '48' + :problem: move model logic into model (mission use_count > 4) + :url: http://rails-bestpractices.com/posts/2010/07/21/move-model-logic-into-the-model/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '87' + :problem: move model logic into model (mission use_count > 4) + :url: http://rails-bestpractices.com/posts/2010/07/21/move-model-logic-into-the-model/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '113' + :problem: move model logic into model (mission use_count > 4) + :url: http://rails-bestpractices.com/posts/2010/07/21/move-model-logic-into-the-model/ + - :file: "/home/ccx/RubymineProjects/ambition/app/helpers/users_helper.rb" + :line: '1' + :problem: remove empty helpers + :url: http://rails-bestpractices.com/posts/2011/04/09/remove-empty-helpers/ + - :file: "/home/ccx/RubymineProjects/ambition/app/helpers/sessions_helper.rb" + :line: '1' + :problem: remove empty helpers + :url: http://rails-bestpractices.com/posts/2011/04/09/remove-empty-helpers/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/shares_controller.rb" + :line: '10' + :problem: use model association (for share) + :url: http://rails-bestpractices.com/posts/2010/07/19/use-model-association/ + - :file: "/home/ccx/RubymineProjects/ambition/Gemfile" + :line: '37' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/note.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/project.rb" + :line: '5' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/missions_user.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/projects_user.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/share.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/comment.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/mission.rb" + :line: '4' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/db/migrate/20161229084919_change_note_field_type_to_category.rb" + :line: '3' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/notes_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/shares_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/sessions_controller.rb" + :line: '7' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/projects_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/config/routes.rb" + :line: '65' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/config/application.rb" + :line: '25' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ +:churn: + :changes: + - :file_path: app/controllers/projects_controller.rb + :times_changed: 16 + - :file_path: db/schema.rb + :times_changed: 12 + :class_churn: + - klass: + file: app/controllers/missions_controller.rb + klass: MissionsController + times_changed: 1 + :method_churn: + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#detail + times_changed: 1 + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#create + times_changed: 1 + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#update + times_changed: 1 + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#commentPublish + times_changed: 1 + :changed_files: + - ".gitignore" + - ".metrics" + - Gemfile + - db/schema.rb + - spec/controllers/sessions_controller_spec.rb + - spec/controllers/users_controller_spec.rb + - spec/models/user_spec.rb + :changed_classes: [] + :changed_methods: [] +:saikuro: + :files: + - :classes: + - :class_name: ProjectsController + :complexity: 13 + :lines: 149 + :methods: + - :name: ProjectsController#update + :complexity: 2 + :lines: 7 + - :name: ProjectsController#detail + :complexity: 2 + :lines: 31 + - :name: ProjectsController#deleteUsers + :complexity: 2 + :lines: 21 + - :name: ProjectsController#addUsers + :complexity: 2 + :lines: 20 + - :name: ProjectsController#create + :complexity: 2 + :lines: 9 + - :name: ProjectsController#index + :complexity: 2 + :lines: 23 + - :name: ProjectsController#project_params + :complexity: 1 + :lines: 2 + :filename: app/controllers/projects_controller.rb + - :classes: + - :class_name: MissionsController + :complexity: 12 + :lines: 153 + :methods: + - :name: MissionsController#create + :complexity: 3 + :lines: 22 + - :name: MissionsController#detail + :complexity: 3 + :lines: 36 + - :name: MissionsController#commentPublish + :complexity: 2 + :lines: 12 + - :name: MissionsController#update + :complexity: 2 + :lines: 24 + - :name: MissionsController#getlist + :complexity: 2 + :lines: 31 + :filename: app/controllers/missions_controller.rb + - :classes: + - :class_name: UsersController + :complexity: 10 + :lines: 52 + :methods: + - :name: UsersController#update + :complexity: 2 + :lines: 7 + - :name: UsersController#create + :complexity: 2 + :lines: 7 + - :name: UsersController#usernameExist + :complexity: 2 + :lines: 6 + - :name: UsersController#emailExist + :complexity: 2 + :lines: 6 + - :name: UsersController#user_params + :complexity: 1 + :lines: 2 + - :name: UsersController#checkExist? + :complexity: 1 + :lines: 2 + :filename: app/controllers/users_controller.rb + - :classes: + - :class_name: Note + :complexity: 8 + :lines: 49 + :methods: + - :name: Note#project_exist + :complexity: 2 + :lines: 7 + - :name: Note#user_exist + :complexity: 2 + :lines: 7 + - :name: Note#note_category_should_among_valid_values + :complexity: 2 + :lines: 6 + - :name: Note#note_has_atleast_one_character + :complexity: 2 + :lines: 5 + :filename: app/models/note.rb + - :classes: + - :class_name: SharesController + :complexity: 6 + :lines: 54 + :methods: + - :name: SharesController#create + :complexity: 3 + :lines: 17 + - :name: SharesController#getShareList + :complexity: 2 + :lines: 18 + - :name: SharesController#share_params + :complexity: 1 + :lines: 2 + :filename: app/controllers/shares_controller.rb + - :classes: + - :class_name: Mission + :complexity: 6 + :lines: 46 + :methods: + - :name: Mission#project_exists + :complexity: 2 + :lines: 8 + - :name: Mission#status_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#priority_is_among_valid_values + :complexity: 2 + :lines: 5 + :filename: app/models/mission.rb + - :classes: + - :class_name: Share + :complexity: 6 + :lines: 36 + :methods: + - :name: Share#project_exists + :complexity: 2 + :lines: 7 + - :name: Share#user_exists + :complexity: 2 + :lines: 7 + - :name: Share#share_has_atleast_one_character + :complexity: 2 + :lines: 5 + :filename: app/models/share.rb + - :classes: + - :class_name: SessionsController + :complexity: 4 + :lines: 28 + :methods: + - :name: SessionsController#create + :complexity: 2 + :lines: 8 + - :name: SessionsController#show + :complexity: 1 + :lines: 2 + - :name: SessionsController#destroy + :complexity: 1 + :lines: 4 + :filename: app/controllers/sessions_controller.rb + - :classes: + - :class_name: NotesController + :complexity: 4 + :lines: 36 + :methods: + - :name: NotesController#getNotesList + :complexity: 4 + :lines: 28 + :filename: app/controllers/notes_controller.rb + - :classes: + - :class_name: ApplicationController + :complexity: 4 + :lines: 15 + :methods: + - :name: ApplicationController#current_user + :complexity: 2 + :lines: 2 + - :name: ApplicationController#authenticate + :complexity: 2 + :lines: 2 + :filename: app/controllers/application_controller.rb + - :classes: + - :class_name: Comment + :complexity: 4 + :lines: 43 + :methods: + - :name: Comment#user_id_exist + :complexity: 2 + :lines: 7 + - :name: Comment#comment_has_atleast_one_character + :complexity: 2 + :lines: 5 + :filename: app/models/comment.rb + - :classes: + - :class_name: Missions_user + :complexity: 4 + :lines: 29 + :methods: + - :name: Missions_user#user_exist + :complexity: 2 + :lines: 7 + - :name: Missions_user#mission_exist + :complexity: 2 + :lines: 8 + :filename: app/models/missions_user.rb + - :classes: + - :class_name: Projects_user + :complexity: 4 + :lines: 28 + :methods: + - :name: Projects_user#user_exists + :complexity: 2 + :lines: 7 + - :name: Projects_user#project_exists + :complexity: 2 + :lines: 7 + :filename: app/models/projects_user.rb + - :classes: + - :class_name: Project + :complexity: 2 + :lines: 14 + :methods: + - :name: Project#require_at_least_on_user + :complexity: 2 + :lines: 4 + :filename: app/models/project.rb + - :classes: + - :class_name: ApplicationHelper + :complexity: 0 + :lines: 1 + :methods: [] + :filename: app/helpers/application_helper.rb + - :classes: + - :class_name: SessionsHelper + :complexity: 0 + :lines: 1 + :methods: [] + :filename: app/helpers/sessions_helper.rb + - :classes: + - :class_name: UsersHelper + :complexity: 0 + :lines: 1 + :methods: [] + :filename: app/helpers/users_helper.rb + - :classes: + - :class_name: User + :complexity: 0 + :lines: 14 + :methods: [] + :filename: app/models/user.rb + :classes: + - :name: ProjectsController + :complexity: 13 + :lines: 149 + :defs: + - :name: ProjectsController#index + :complexity: 2 + :lines: 23 + - :name: ProjectsController#create + :complexity: 2 + :lines: 9 + - :name: ProjectsController#addUsers + :complexity: 2 + :lines: 20 + - :name: ProjectsController#deleteUsers + :complexity: 2 + :lines: 21 + - :name: ProjectsController#detail + :complexity: 2 + :lines: 31 + - :name: ProjectsController#update + :complexity: 2 + :lines: 7 + - :name: ProjectsController#project_params + :complexity: 1 + :lines: 2 + - :name: MissionsController + :complexity: 12 + :lines: 153 + :defs: + - :name: MissionsController#getlist + :complexity: 2 + :lines: 31 + - :name: MissionsController#detail + :complexity: 3 + :lines: 36 + - :name: MissionsController#create + :complexity: 3 + :lines: 22 + - :name: MissionsController#update + :complexity: 2 + :lines: 24 + - :name: MissionsController#commentPublish + :complexity: 2 + :lines: 12 + - :name: UsersController + :complexity: 10 + :lines: 52 + :defs: + - :name: UsersController#emailExist + :complexity: 2 + :lines: 6 + - :name: UsersController#usernameExist + :complexity: 2 + :lines: 6 + - :name: UsersController#create + :complexity: 2 + :lines: 7 + - :name: UsersController#update + :complexity: 2 + :lines: 7 + - :name: UsersController#checkExist? + :complexity: 1 + :lines: 2 + - :name: UsersController#user_params + :complexity: 1 + :lines: 2 + - :name: Note + :complexity: 8 + :lines: 49 + :defs: + - :name: Note#note_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Note#note_category_should_among_valid_values + :complexity: 2 + :lines: 6 + - :name: Note#user_exist + :complexity: 2 + :lines: 7 + - :name: Note#project_exist + :complexity: 2 + :lines: 7 + - :name: Share + :complexity: 6 + :lines: 36 + :defs: + - :name: Share#share_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Share#user_exists + :complexity: 2 + :lines: 7 + - :name: Share#project_exists + :complexity: 2 + :lines: 7 + - :name: Mission + :complexity: 6 + :lines: 46 + :defs: + - :name: Mission#priority_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#status_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#project_exists + :complexity: 2 + :lines: 8 + - :name: SharesController + :complexity: 6 + :lines: 54 + :defs: + - :name: SharesController#create + :complexity: 3 + :lines: 17 + - :name: SharesController#getShareList + :complexity: 2 + :lines: 18 + - :name: SharesController#share_params + :complexity: 1 + :lines: 2 + - :name: Projects_user + :complexity: 4 + :lines: 28 + :defs: + - :name: Projects_user#project_exists + :complexity: 2 + :lines: 7 + - :name: Projects_user#user_exists + :complexity: 2 + :lines: 7 + - :name: Missions_user + :complexity: 4 + :lines: 29 + :defs: + - :name: Missions_user#mission_exist + :complexity: 2 + :lines: 8 + - :name: Missions_user#user_exist + :complexity: 2 + :lines: 7 + - :name: Comment + :complexity: 4 + :lines: 43 + :defs: + - :name: Comment#comment_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Comment#user_id_exist + :complexity: 2 + :lines: 7 + - :name: ApplicationController + :complexity: 4 + :lines: 15 + :defs: + - :name: ApplicationController#authenticate + :complexity: 2 + :lines: 2 + - :name: ApplicationController#current_user + :complexity: 2 + :lines: 2 + - :name: NotesController + :complexity: 4 + :lines: 36 + :defs: + - :name: NotesController#getNotesList + :complexity: 4 + :lines: 28 + - :name: SessionsController + :complexity: 4 + :lines: 28 + :defs: + - :name: SessionsController#create + :complexity: 2 + :lines: 8 + - :name: SessionsController#destroy + :complexity: 1 + :lines: 4 + - :name: SessionsController#show + :complexity: 1 + :lines: 2 + - :name: Project + :complexity: 2 + :lines: 14 + :defs: + - :name: Project#require_at_least_on_user + :complexity: 2 + :lines: 4 + - :name: User + :complexity: 0 + :lines: 14 + - :name: UsersHelper + :complexity: 0 + :lines: 1 + - :name: SessionsHelper + :complexity: 0 + :lines: 1 + - :name: ApplicationHelper + :complexity: 0 + :lines: 1 + :methods: + - :name: NotesController#getNotesList + :complexity: 4 + :lines: 28 + - :name: SharesController#create + :complexity: 3 + :lines: 17 + - :name: MissionsController#create + :complexity: 3 + :lines: 22 + - :name: MissionsController#detail + :complexity: 3 + :lines: 36 + - :name: Project#require_at_least_on_user + :complexity: 2 + :lines: 4 + - :name: Projects_user#user_exists + :complexity: 2 + :lines: 7 + - :name: Projects_user#project_exists + :complexity: 2 + :lines: 7 + - :name: Missions_user#user_exist + :complexity: 2 + :lines: 7 + - :name: Missions_user#mission_exist + :complexity: 2 + :lines: 8 + - :name: Comment#user_id_exist + :complexity: 2 + :lines: 7 + - :name: Comment#comment_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: ApplicationController#current_user + :complexity: 2 + :lines: 2 + - :name: ApplicationController#authenticate + :complexity: 2 + :lines: 2 + - :name: SessionsController#create + :complexity: 2 + :lines: 8 + - :name: Share#project_exists + :complexity: 2 + :lines: 7 + - :name: Share#user_exists + :complexity: 2 + :lines: 7 + - :name: Share#share_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Mission#project_exists + :complexity: 2 + :lines: 8 + - :name: Mission#status_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#priority_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: SharesController#getShareList + :complexity: 2 + :lines: 18 + - :name: Note#project_exist + :complexity: 2 + :lines: 7 + - :name: Note#user_exist + :complexity: 2 + :lines: 7 + - :name: Note#note_category_should_among_valid_values + :complexity: 2 + :lines: 6 + - :name: Note#note_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: UsersController#update + :complexity: 2 + :lines: 7 + - :name: UsersController#create + :complexity: 2 + :lines: 7 + - :name: UsersController#usernameExist + :complexity: 2 + :lines: 6 + - :name: UsersController#emailExist + :complexity: 2 + :lines: 6 + - :name: MissionsController#commentPublish + :complexity: 2 + :lines: 12 + - :name: MissionsController#update + :complexity: 2 + :lines: 24 + - :name: MissionsController#getlist + :complexity: 2 + :lines: 31 + - :name: ProjectsController#update + :complexity: 2 + :lines: 7 + - :name: ProjectsController#detail + :complexity: 2 + :lines: 31 + - :name: ProjectsController#deleteUsers + :complexity: 2 + :lines: 21 + - :name: ProjectsController#addUsers + :complexity: 2 + :lines: 20 + - :name: ProjectsController#create + :complexity: 2 + :lines: 9 + - :name: ProjectsController#index + :complexity: 2 + :lines: 23 + - :name: SessionsController#show + :complexity: 1 + :lines: 2 + - :name: SessionsController#destroy + :complexity: 1 + :lines: 4 + - :name: SharesController#share_params + :complexity: 1 + :lines: 2 + - :name: UsersController#user_params + :complexity: 1 + :lines: 2 + - :name: UsersController#checkExist? + :complexity: 1 + :lines: 2 + - :name: ProjectsController#project_params + :complexity: 1 + :lines: 2 +:roodi: + :total: + - Checked 18 files + :problems: + - :file: app/models/missions_user.rb + :line: '1' + :problem: Class name "Missions_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/ + - :file: app/models/projects_user.rb + :line: '1' + :problem: Class name "Projects_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/ + - :file: app/controllers/notes_controller.rb + :line: '7' + :problem: Method "getNotesList" has 24 lines. It should have 20 or less. + - :file: app/controllers/missions_controller.rb + :line: '13' + :problem: Method "getlist" has 27 lines. It should have 20 or less. + - :file: app/controllers/missions_controller.rb + :line: '48' + :problem: Method "detail" has 24 lines. It should have 20 or less. + - :file: app/controllers/missions_controller.rb + :line: '113' + :problem: Method "update" has 23 lines. It should have 20 or less. + - :file: app/controllers/projects_controller.rb + :line: '103' + :problem: Method "detail" has 23 lines. It should have 20 or less. + - :file: app/controllers/notes_controller.rb + :line: '7' + :problem: Method name "getNotesList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/shares_controller.rb + :line: '31' + :problem: Method name "getShareList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/users_controller.rb + :line: '11' + :problem: Method name "emailExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/users_controller.rb + :line: '19' + :problem: Method name "usernameExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/users_controller.rb + :line: '46' + :problem: Method name "checkExist?" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/missions_controller.rb + :line: '141' + :problem: Method name "commentPublish" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/projects_controller.rb + :line: '55' + :problem: Method name "addUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/projects_controller.rb + :line: '78' + :problem: Method name "deleteUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ +:stats: + :codeLOC: 560 + :testLOC: 782 + :code_to_test_ratio: 1.4 + :lines: + - :name: Controllers + :lines: 494 + :loc: 381 + :classes: 7 + :methods: 27 + :methods_per_class: 3 + :loc_per_method: 12 + - :name: Helpers + :lines: 6 + :loc: 6 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Models + :lines: 267 + :loc: 173 + :classes: 8 + :methods: 17 + :methods_per_class: 2 + :loc_per_method: 8 + - :name: Mailers + :lines: 0 + :loc: 0 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Javascripts + :lines: 22 + :loc: 0 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Libraries + :lines: 0 + :loc: 0 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Models specs + :lines: 534 + :loc: 388 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Controllers specs + :lines: 573 + :loc: 394 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Total + :lines: 1896 + :loc: 1342 + :classes: 15 + :methods: 44 + :methods_per_class: 2 + :loc_per_method: 28 +:reek: + :matches: + - :file_path: app/controllers/application_controller.rb + :code_smells: + - :method: ApplicationController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: ApplicationController#current_user + :message: calls session[:user_id] 2 times + :type: DuplicateMethodCall + :lines: + - 12 + - 12 + - :file_path: app/models/comment.rb + :code_smells: + - :method: Comment#user_id_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 26 + - :file_path: app/models/mission.rb + :code_smells: + - :method: Mission + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Mission#project_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 40 + - :file_path: app/controllers/missions_controller.rb + :code_smells: + - :method: MissionsController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: MissionsController#commentPublish + :message: has approx 7 statements + :type: TooManyStatements + :lines: + - 141 + - :method: MissionsController#commentPublish + :message: has the name 'commentPublish' + :type: UncommunicativeMethodName + :lines: + - 141 + - :method: MissionsController#create + :message: calls user_enties.id 2 times + :type: DuplicateMethodCall + :lines: + - 100 + - 105 + - :method: MissionsController#create + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 87 + - :method: MissionsController#detail + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 48 + - :method: MissionsController#detail + :message: has the variable name 'c' + :type: UncommunicativeVariableName + :lines: + - 63 + - :method: MissionsController#detail + :message: refers to mission more than self + :type: FeatureEnvy + :lines: + - 48 + - :method: MissionsController#getlist + :message: has approx 7 statements + :type: TooManyStatements + :lines: + - 13 + - :method: MissionsController#update + :message: calls user_enties.id 2 times + :type: DuplicateMethodCall + :lines: + - 127 + - 132 + - :method: MissionsController#update + :message: has approx 17 statements + :type: TooManyStatements + :lines: + - 113 + - :file_path: app/models/missions_user.rb + :code_smells: + - :method: Missions_user + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Missions_user#mission_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 13 + - :method: Missions_user#user_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 23 + - :file_path: app/models/note.rb + :code_smells: + - :method: Note + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Note#project_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 44 + - :method: Note#user_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 35 + - :file_path: app/controllers/notes_controller.rb + :code_smells: + - :method: NotesController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: NotesController#getNotesList + :message: calls n.created_at 2 times + :type: DuplicateMethodCall + :lines: + - 16 + - 17 + - :method: NotesController#getNotesList + :message: calls n.created_at.to_s 2 times + :type: DuplicateMethodCall + :lines: + - 16 + - 17 + - :method: NotesController#getNotesList + :message: has approx 13 statements + :type: TooManyStatements + :lines: + - 7 + - :method: NotesController#getNotesList + :message: has the name 'getNotesList' + :type: UncommunicativeMethodName + :lines: + - 7 + - :method: NotesController#getNotesList + :message: has the variable name 'h' + :type: UncommunicativeVariableName + :lines: + - 12 + - :method: NotesController#getNotesList + :message: has the variable name 'k' + :type: UncommunicativeVariableName + :lines: + - 12 + - 25 + - :method: NotesController#getNotesList + :message: has the variable name 'n' + :type: UncommunicativeVariableName + :lines: + - 15 + - :method: NotesController#getNotesList + :message: has the variable name 'v' + :type: UncommunicativeVariableName + :lines: + - 25 + - :method: NotesController#getNotesList + :message: refers to n more than self + :type: FeatureEnvy + :lines: + - 7 + - :file_path: app/models/project.rb + :code_smells: + - :method: Project + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :file_path: app/controllers/projects_controller.rb + :code_smells: + - :method: ProjectsController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: ProjectsController#addUsers + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 55 + - :method: ProjectsController#addUsers + :message: has the name 'addUsers' + :type: UncommunicativeMethodName + :lines: + - 55 + - :method: ProjectsController#addUsers + :message: performs a nil-check + :type: NilCheck + :lines: + - 61 + - :method: ProjectsController#deleteUsers + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 78 + - :method: ProjectsController#deleteUsers + :message: has the name 'deleteUsers' + :type: UncommunicativeMethodName + :lines: + - 78 + - :method: ProjectsController#deleteUsers + :message: performs a nil-check + :type: NilCheck + :lines: + - 84 + - :method: ProjectsController#detail + :message: has approx 9 statements + :type: TooManyStatements + :lines: + - 103 + - :method: ProjectsController#detail + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 113 + - :method: ProjectsController#index + :message: has approx 10 statements + :type: TooManyStatements + :lines: + - 14 + - :method: ProjectsController#index + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 18 + - :method: ProjectsController#index + :message: has the variable name 'p' + :type: UncommunicativeVariableName + :lines: + - 20 + - :file_path: app/models/projects_user.rb + :code_smells: + - :method: Projects_user + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Projects_user#project_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 14 + - :method: Projects_user#user_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 23 + - :file_path: app/controllers/sessions_controller.rb + :code_smells: + - :method: SessionsController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :file_path: app/models/share.rb + :code_smells: + - :method: Share + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Share#project_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 31 + - :method: Share#user_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 23 + - :file_path: app/controllers/shares_controller.rb + :code_smells: + - :method: SharesController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: SharesController#create + :message: has approx 11 statements + :type: TooManyStatements + :lines: + - 10 + - :method: SharesController#create + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 18 + - :method: SharesController#getShareList + :message: calls i.content 2 times + :type: DuplicateMethodCall + :lines: + - 37 + - 42 + - :method: SharesController#getShareList + :message: has approx 7 statements + :type: TooManyStatements + :lines: + - 31 + - :method: SharesController#getShareList + :message: has the name 'getShareList' + :type: UncommunicativeMethodName + :lines: + - 31 + - :method: SharesController#getShareList + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 36 + - :method: SharesController#getShareList + :message: refers to i more than self + :type: FeatureEnvy + :lines: + - 31 + - :file_path: app/models/user.rb + :code_smells: + - :method: User + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :file_path: app/controllers/users_controller.rb + :code_smells: + - :method: UsersController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: UsersController#checkExist? + :message: doesn't depend on instance state + :type: UtilityFunction + :lines: + - 46 + - :method: UsersController#checkExist? + :message: has the name 'checkExist?' + :type: UncommunicativeMethodName + :lines: + - 46 + - :method: UsersController#emailExist + :message: has the name 'emailExist' + :type: UncommunicativeMethodName + :lines: + - 11 + - :method: UsersController#usernameExist + :message: has the name 'usernameExist' + :type: UncommunicativeMethodName + :lines: + - 19 +:rcov: + "./app/controllers/application_controller.rb": + :lines: + - :content: class ApplicationController < ActionController::Base + :was_run: 1 + - :content: " # Prevent CSRF attacks by raising an exception." + :was_run: + - :content: " # For APIs, you may want to use :null_session instead." + :was_run: + - :content: " protect_from_forgery with: :exception" + :was_run: 1 + - :content: " def authenticate" + :was_run: 1 + - :content: " render status: :unauthorized, nothing: true unless session['user_id']" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def current_user" + :was_run: 1 + - :content: " @current_user ||= User.find(session[:user_id]) if session[:user_id]" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " helper_method :current_user" + :was_run: 1 + - :content: end + :was_run: + :percent_run: 100 + :methods: + ApplicationController#authenticate: 0.0 + ApplicationController#current_user: 0.0 + "./app/controllers/missions_controller.rb": + :lines: + - :content: class MissionsController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :create," + :was_run: + - :content: " :getlist," + :was_run: + - :content: " :detail," + :was_run: + - :content: " :update," + :was_run: + - :content: " :commentPublish" + :was_run: + - :content: " ]" + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7o + jrflj5blvZPliY3pobnnm67mn5DnirbmgIHnmoTku7vliqHliJfooag= + :was_run: + - :content: " " + :was_run: + - :content: " def getlist" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " pid = params[:project_id]" + :was_run: 1 + - :content: " stu = params[:status_type]" + :was_run: 1 + - :content: " #missions = []" + :was_run: + - :content: " details = []" + :was_run: 1 + - :content: ' missions = Mission.where("project_id = ? AND status = ?",pid,stu).all' + :was_run: 1 + - :content: " " + :was_run: + - :content: " missions.each do |mission|" + :was_run: 1 + - :content: " " + :was_run: + - :content: " #puts mission.inspect" + :was_run: + - :content: " " + :was_run: + - :content: " details += [{" + :was_run: 1 + - :content: " :id => mission.id," + :was_run: + - :content: " :name => mission.name," + :was_run: + - :content: " :content => mission.content" + :was_run: + - :content: " }]" + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " # Mission.where(:project_id => pid).where(:status => stu) do + |i|" + :was_run: + - :content: " # missions += [{" + :was_run: + - :content: " # :id => i.id," + :was_run: + - :content: " # :name => i.name," + :was_run: + - :content: " # :content => i.content" + :was_run: + - :content: " # }]" + :was_run: + - :content: " # end" + :was_run: + - :content: " render :json => {" + :was_run: 1 + - :content: " :code => 0," + :was_run: + - :content: " :data => missions" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7o + jrflj5bku7vliqHor6bnu4bkv6Hmga8= + :was_run: + - :content: " " + :was_run: + - :content: " def detail" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " username = []" + :was_run: 1 + - :content: " comments_s = []" + :was_run: 1 + - :content: " mission_id = params[:id]" + :was_run: 1 + - :content: " mission = Mission.find_by(id: mission_id)" + :was_run: 1 + - :content: ' m_us = Missions_user.where("mission_id = ?",mission_id).all' + :was_run: 1 + - :content: " #puts m_us.inspect" + :was_run: + - :content: " m_us.each do |m_u|" + :was_run: 1 + - :content: " user_id = m_u.user_id" + :was_run: 0 + - :content: " user = User.find_by(id: user_id)" + :was_run: 0 + - :content: " #puts user.inspect" + :was_run: + - :content: " username << user.name" + :was_run: 0 + - :content: " end" + :was_run: + - :content: ' comments = Comment.where("mission_id = ?",mission_id).all' + :was_run: 1 + - :content: " comments.each do |c|" + :was_run: 1 + - :content: " uname = User.find_by(id: c.user_id).name" + :was_run: 1 + - :content: " comments_s += [{" + :was_run: 1 + - :content: " :nickname => uname," + :was_run: + - :content: " :content => c.content," + :was_run: + - :content: " :time => c.created_at" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " #puts comments_s.inspect" + :was_run: + - :content: " render :json => {" + :was_run: 1 + - :content: " :code => 0," + :was_run: + - :content: " :data => {" + :was_run: + - :content: " :name => mission.name," + :was_run: + - :content: " :content => mission.content," + :was_run: + - :content: " :priority => mission.priority," + :was_run: + - :content: " :status => mission.status," + :was_run: + - :content: " :deadline => mission.deadline," + :was_run: + - :content: " :users => username," + :was_run: + - :content: " :comments => comments_s" + :was_run: + - :content: " }" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: !binary |- + ICAgICAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+ + 5Yib5bu65Lu75Yqh + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " params_mission = {name: params[:name],project_id: params[:project_id],content: + params[:content],deadline: params[:deadline],priority: params[:priority],status: + params[:status]}" + :was_run: 1 + - :content: " mission = Mission.new(params_mission)" + :was_run: 1 + - :content: " if mission.save" + :was_run: 1 + - :content: " render :json => {:code => 0}" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json: mission.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " userids = params[:users]" + :was_run: 1 + - :content: " userids.each do |id|" + :was_run: 1 + - :content: " user_enties = User.find_by(id: id)" + :was_run: 1 + - :content: " #puts user_enties.inspect" + :was_run: + - :content: " params_mu = {mission_id: mission.id,user_id: user_enties.id}" + :was_run: 1 + - :content: " missions_user = Missions_user.new(params_mu)" + :was_run: 0 + - :content: " missions_user.save" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBjb250ZW50ID0gIuacieaWsOS7u+WKoSA8YT4iK21pc3Npb24u + bmFtZSsiPC9hPiI= + :was_run: 0 + - :content: " " + :was_run: + - :content: " params_note = {content: content,user_id: user_enties.id,category: + 3,project_id: mission.project_id}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7k + v67mlLnku7vliqHkv6Hmga8= + :was_run: + - :content: " " + :was_run: + - :content: " def update" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " " + :was_run: + - :content: " id = params[:id]" + :was_run: 0 + - :content: " #now = Datetime.now" + :was_run: + - :content: " mission = Mission.find_by(id: id)" + :was_run: 0 + - :content: " params_mission = {name: params[:name],content: params[:content],deadline: + params[:deadline],priority: params[:priority]}" + :was_run: 0 + - :content: " #puts params_mission" + :was_run: + - :content: " mission.update(params_mission)" + :was_run: 0 + - :content: " mission.save" + :was_run: 0 + - :content: ' Missions_user.delete_all(["mission_id = ?",id])' + :was_run: 0 + - :content: " userids = params[:users]" + :was_run: 0 + - :content: " userids.each do |name|" + :was_run: 0 + - :content: " user_enties = User.find_by(id: id)" + :was_run: 0 + - :content: " params = {mission_id: id,user_id: user_enties.id}" + :was_run: 0 + - :content: " missions_user = Missions_user.new(params)" + :was_run: 0 + - :content: " missions_user.save" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBjb250ZW50ID0gIjxhPiIrbWlzc2lvbi5uYW1lICsgIjwvYT4g + 5Lu75Yqh5L+h5oGv5Y+R55Sf5LqG5Y+Y5YyWIg== + :was_run: 0 + - :content: " " + :was_run: + - :content: " params_note = {content: content,user_id: user_enties.id,category: + 3,project_id: mission.project_id}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7l + vZPliY3nlKjmiLflj5Hooajor4Torro= + :was_run: + - :content: " " + :was_run: + - :content: " def commentPublish" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " mission_id = params[:mission_id]" + :was_run: 1 + - :content: " content = params[:content]" + :was_run: 1 + - :content: " user_id = session[:user_id]" + :was_run: 1 + - :content: " params = {content: content, mission_id: mission_id, user_id: + user_id}" + :was_run: 1 + - :content: " comment = Comment.new(params)" + :was_run: 1 + - :content: " if comment.save" + :was_run: 1 + - :content: " render :json => {:code => 0}" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json: mission.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 59 + :methods: + MissionsController#getlist: 71.42857142857143 + MissionsController#detail: 40.0 + MissionsController#create: 27.27272727272727 + MissionsController#update: 25.0 + MissionsController#commentPublish: 12.5 + "./app/controllers/notes_controller.rb": + :lines: + - :content: class NotesController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " " + :was_run: + - :content: !binary |- + ICAgICPojrflj5bnlKjmiLflvZPliY3nmoTpgJrnn6XliJfooag= + :was_run: + - :content: " " + :was_run: + - :content: " def getNotesList" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " pid = params[:project_id]" + :was_run: 1 + - :content: " uid = session[:user_id]" + :was_run: 1 + - :content: ' notes = Note.where("user_id = ? AND project_id = ? ",uid,pid).order("created_at + desc").all' + :was_run: 1 + - :content: " note = Hash.new do |h,k|" + :was_run: 1 + - :content: " h[k] = []" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " notes.each do |n|" + :was_run: 1 + - :content: " date = n.created_at.to_s[/([\\d\\-]*)\\s(.*)/,1]" + :was_run: 1 + - :content: " time = n.created_at.to_s[/(.*)\\s([\\d\\:]*)/,2]" + :was_run: 1 + - :content: " note[date] << {" + :was_run: + - :content: " :content => n.content," + :was_run: + - :content: " :time => time," + :was_run: + - :content: " :type => n.category" + :was_run: + - :content: " }" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " data = []" + :was_run: 1 + - :content: " note.each do |k,v|" + :was_run: 1 + - :content: " data += [{" + :was_run: 1 + - :content: " :time => k," + :was_run: + - :content: " :notes => v" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " render :json => {" + :was_run: 1 + - :content: " :code => 0," + :was_run: + - :content: " :data => data" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + NotesController#getNotesList: 44.0 + "./app/controllers/projects_controller.rb": + :lines: + - :content: class ProjectsController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :index," + :was_run: + - :content: " :create," + :was_run: + - :content: " :addUsers," + :was_run: + - :content: " :detail," + :was_run: + - :content: " :update," + :was_run: + - :content: " :deleteUsers" + :was_run: + - :content: " ]" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6I635Y+W5oiR55qE6aG555uu5YiX6KGo77yMdXNlcl9pZOS/neWt + mOWcqHNlc3Npb27kuK0u + :was_run: + - :content: " def index" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " uid = session[:user_id]" + :was_run: 0 + - :content: " data=[]" + :was_run: 0 + - :content: " Projects_user.where(:user_id => uid).each do |i|" + :was_run: 0 + - :content: " pid=i.project_id" + :was_run: 0 + - :content: " p=Project.find_by(id:pid)" + :was_run: 0 + - :content: " mc = Mission.where(:project_id => pid).size" + :was_run: 0 + - :content: " uc = Projects_user.where(:project_id => pid).size" + :was_run: 0 + - :content: " sc = Share.where(:project_id => pid).size" + :was_run: 0 + - :content: " data+=[{" + :was_run: 0 + - :content: " :id => pid," + :was_run: + - :content: " :name => p.name," + :was_run: + - :content: " :content => p.content," + :was_run: + - :content: " :mission_count => mc," + :was_run: + - :content: " :users_count => uc," + :was_run: + - :content: " :shares_count => sc" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " render :json => {" + :was_run: 0 + - :content: " :code => 0," + :was_run: + - :content: " :data => data" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+5Yib5bu66aG555uu + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " uid = session[:user_id]" + :was_run: 1 + - :content: " project = Project.new(project_params)" + :was_run: 1 + - :content: " if project.save" + :was_run: 0 + - :content: " Projects_user.create(project_id:project.id,user_id:uid)" + :was_run: 0 + - :content: " render status: :created, nothing: true" + :was_run: 0 + - :content: " else" + :was_run: + - :content: " render json: project.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu5re75Yqg55So5oi3 + :was_run: + - :content: " " + :was_run: + - :content: " def addUsers" + :was_run: 1 + - :content: !binary |- + ICAgICAgICB1aWQgPSBVc2VyLmZpbmRfYnkoZW1haWw6cGFyYW1zWzplbWFp + bF0pLmlkIyDpnIDopoHmt7vliqDnmoTnlKjmiLc= + :was_run: 1 + - :content: !binary |- + ICAgICAgICByZWdpc3RlciA9IHNlc3Npb25bOnVzZXJfaWRdIyDlvZPliY3n + lKjmiLc= + :was_run: 0 + - :content: " pid = params[:project_id]" + :was_run: 0 + - :content: !binary |- + ICAgICAgICAjIOajgOafpeivpemhueebruS4reaYr+WQpuW3sue7j+acieim + gea3u+WKoOeahOeUqOaItw== + :was_run: + - :content: " pu_exist=Projects_user.find_by(project_id:pid,user_id:uid)" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBpZiBwdV9leGlzdC5uaWw/IyDkuI3lrZjlnKg= + :was_run: 0 + - :content: " params_pu = {project_id: pid,user_id: uid}" + :was_run: 0 + - :content: " pu = Projects_user.new(params_pu)" + :was_run: 0 + - :content: " pu.save" + :was_run: 0 + - :content: " " + :was_run: + - :content: !binary |- + ICAgICAgICAgICAgY29udGVudCA9ICI8YT4iK1VzZXIuZmluZF9ieShpZDog + cmVnaXN0ZXIpLm5hbWUgKyAiPC9hPiDpgoDor7fmgqjov5vlhaXpobnnm64g + PGE+IiArIFByb2plY3QuZmluZF9ieShpZDogcGlkKS5uYW1lKyI8L2E+Ig== + :was_run: 0 + - :content: " puts content" + :was_run: 0 + - :content: " params_note = {user_id: uid,content: content,category: + 2,project_id: pid}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save!" + :was_run: 0 + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBlbHNlIyDlrZjlnKg= + :was_run: + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu5Yig6Zmk55So5oi3 + :was_run: + - :content: " def deleteUsers" + :was_run: 1 + - :content: !binary |- + ICAgICAgICB1aWQgPSBwYXJhbXNbOnVzZXJfaWRdIyDpnIDopoHmt7vliqDn + moTnlKjmiLc= + :was_run: 0 + - :content: !binary |- + ICAgICAgICByZWdpc3RlciA9IHNlc3Npb25bOnVzZXJfaWRdIyDlvZPliY3n + lKjmiLc= + :was_run: 0 + - :content: " pid = params[:project_id]" + :was_run: 0 + - :content: !binary |- + ICAgICAgICAjIOajgOafpeivpemhueebruS4reaYr+WQpuW3sue7j+acieim + gea3u+WKoOeahOeUqOaItw== + :was_run: + - :content: " projects_user=Projects_user.find_by(project_id:pid,user_id:uid)" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBpZiBwcm9qZWN0c191c2VyLm5pbD8jIOS4jeWtmOWcqA== + :was_run: 0 + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: !binary |- + ICAgICAgICAjIOWtmOWcqA== + :was_run: + - :content: " puts projects_user.user_id" + :was_run: 0 + - :content: " puts projects_user.project_id" + :was_run: 0 + - :content: " Projects_user.where(project_id:pid,user_id:uid).delete_all" + :was_run: 0 + - :content: " " + :was_run: + - :content: !binary |- + ICAgICAgICBjb250ZW50ID0iPGE+IisgVXNlci5maW5kX2J5KGlkOiByZWdp + c3RlcikubmFtZSArICI8L2E+IOaKiuaCqOS7jumhueebriA8YT4iICsgUHJv + amVjdC5maW5kX2J5KGlkOiBwaWQpLm5hbWUrIjwvYT4g5Lit5Yig6ZmkIg== + :was_run: 0 + - :content: " puts content" + :was_run: 0 + - :content: " params_note = {user_id: uid,content: content,category: 2,project_id: + pid}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save!" + :was_run: 0 + - :content: " " + :was_run: + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu6K+m5oOF + :was_run: + - :content: " " + :was_run: + - :content: " def detail" + :was_run: 1 + - :content: " #Todo " + :was_run: + - :content: " pid = params[:id]" + :was_run: 0 + - :content: " project = Project.find_by(id: pid)" + :was_run: 0 + - :content: " #uid = Projects_user.where(:project_id => pid)" + :was_run: + - :content: " users = []" + :was_run: 0 + - :content: ' projects_users = Projects_user.where("project_id = ?",pid).all' + :was_run: 0 + - :content: " " + :was_run: + - :content: " projects_users.each do |projects_user|" + :was_run: 0 + - :content: " uid = projects_user.user_id" + :was_run: 0 + - :content: " i = User.find_by(id: uid)" + :was_run: 0 + - :content: " users += [{" + :was_run: 0 + - :content: " :name => i.name," + :was_run: + - :content: " :id => i.id" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " #puts users.inspect " + :was_run: + - :content: " # Users.find(uid).each do |i|" + :was_run: + - :content: " # users += [{" + :was_run: + - :content: " # :nickname => i.name," + :was_run: + - :content: " # :id => i.id" + :was_run: + - :content: " # }]" + :was_run: + - :content: " # end" + :was_run: + - :content: " render :json => {" + :was_run: 0 + - :content: " :code => 0," + :was_run: + - :content: " :data => {" + :was_run: + - :content: " :name => project.name," + :was_run: + - :content: " :content => project.content," + :was_run: + - :content: " :users => users" + :was_run: + - :content: " }" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu5L+u5pS5 + :was_run: + - :content: " def update" + :was_run: 1 + - :content: " project = Project.find_by(:id => params[:project][:id])" + :was_run: 0 + - :content: " if project.update(project_params)" + :was_run: 0 + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: " else" + :was_run: + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def project_params" + :was_run: 1 + - :content: " params.require(:project).permit(:name,:content,:id)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 21 + :methods: + ProjectsController#index: 45.0 + ProjectsController#create: 0.0 + ProjectsController#addUsers: 14.285714285714285 + ProjectsController#deleteUsers: 23.809523809523807 + ProjectsController#detail: 58.333333333333336 + ProjectsController#update: 0.0 + ProjectsController#project_params: 0.0 + "./app/controllers/sessions_controller.rb": + :lines: + - :content: class SessionsController < ApplicationController + :was_run: 1 + - :content: !binary |- + ICAjIOmZpOeZu+W9leS5i+Wklu+8jOWFtuS9meaOpeWPo+W/hemhu+WcqOeZ + u+W9leeKtuaAgeS4i+iuv+mXrg== + :was_run: + - :content: " before_action :authenticate, except: [ :create ]" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [:create,:destroy,:show]" + :was_run: 1 + - :content: " " + :was_run: + - :content: !binary |- + ICAjIOeUqOaIt+eZu+W9lQ== + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " user = User.find_by(email: params[:email])" + :was_run: 1 + - :content: " if user && user.authenticate(params[:password])" + :was_run: 1 + - :content: " session[:user_id] = user.id" + :was_run: 1 + - :content: " render status: :ok, text: 'ok'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render status: :unauthorized, text: 'account or password is + not correct'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def destroy" + :was_run: 1 + - :content: " session.delete :user_id" + :was_run: 1 + - :content: " @current_user &&= nil" + :was_run: 1 + - :content: " render status: :ok, nothing: true" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " def show" + :was_run: 1 + - :content: " render 'show'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + SessionsController#create: 0.0 + SessionsController#destroy: 0.0 + SessionsController#show: 0.0 + "./app/controllers/shares_controller.rb": + :lines: + - :content: class SharesController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :create," + :was_run: + - :content: " :getShareList" + :was_run: + - :content: " ]" + :was_run: + - :content: !binary |- + ICAgICPlvZPliY3nlKjmiLfliJvlu7rliIbkuqs= + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " uid = session[:user_id].to_i" + :was_run: 1 + - :content: " share=Share.new(share_params)" + :was_run: 1 + - :content: " share.user_id=uid" + :was_run: 0 + - :content: " if share.save" + :was_run: 0 + - :content: !binary |- + ICAgICAgICAgICAgY29udGVudCA9ICI8YT4iK1VzZXIuZmluZCh1aWQpLm5h + bWUgKyAiPC9hPiDliIbkuqvkuobkuIDkupvkuosi + :was_run: 0 + - :content: " pid=share.project_id" + :was_run: 0 + - :content: " " + :was_run: + - :content: " Projects_user.where(:project_id => pid).each do |i|" + :was_run: 0 + - :content: " params_note = {user_id: i.user_id,content: content,category: + 1,project_id: pid}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save!" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " render status: :created, nothing: true" + :was_run: 0 + - :content: " else" + :was_run: + - :content: " render json: project.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICPojrflj5bpobnnm67nmoTliIbkuqvliJfooag= + :was_run: + - :content: " " + :was_run: + - :content: " def getShareList" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " pid = params[:project_id]" + :was_run: 0 + - :content: " " + :was_run: + - :content: " data = []" + :was_run: 0 + - :content: ' Share.where(:project_id => pid).order("created_at desc").each + do |i|' + :was_run: 0 + - :content: " puts i.content" + :was_run: 0 + - :content: " name = User.find(i.user_id).name" + :was_run: 0 + - :content: " data += [{" + :was_run: 0 + - :content: " :name => name," + :was_run: + - :content: " :time => i.created_at," + :was_run: + - :content: " :content => i.content" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " render :json => {" + :was_run: 0 + - :content: " :code => 0," + :was_run: + - :content: " :data => data" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def share_params" + :was_run: 1 + - :content: " params.require(:share).permit(:project_id,:content)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 37 + :methods: + SharesController#create: 0.0 + SharesController#getShareList: 46.666666666666664 + SharesController#share_params: 0.0 + "./app/controllers/users_controller.rb": + :lines: + - :content: class UsersController < ApplicationController + :was_run: 1 + - :content: " before_action :authenticate, except: [ :emailExist, :usernameExist, + :create ]" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :emailExist," + :was_run: + - :content: " :usernameExist," + :was_run: + - :content: " :create," + :was_run: + - :content: " :update" + :was_run: + - :content: " ]" + :was_run: + - :content: " def emailExist" + :was_run: 1 + - :content: " if checkExist?(:email, params[:email])" + :was_run: 1 + - :content: " render :text => '1'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render :text => '0'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def usernameExist" + :was_run: 1 + - :content: " if checkExist?(:name, params[:username])" + :was_run: 1 + - :content: " render :text => 'exist'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render :text => 'not exist'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " @user = User.new(user_params)" + :was_run: 1 + - :content: " if @user.save" + :was_run: 1 + - :content: " render status: :created, nothing: true" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json: @user.errors, status: :unprocessable_entity" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def update" + :was_run: 1 + - :content: " @user = current_user" + :was_run: 1 + - :content: " if @user.update(user_params)" + :was_run: 1 + - :content: " render 'show'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def checkExist?(field_name, value)" + :was_run: 1 + - :content: " User.exists?(field_name => value)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " def user_params" + :was_run: 1 + - :content: " params.require(:user).permit(:name,:password, :password_confirmation, + :email, :phone)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + UsersController#emailExist: 0.0 + UsersController#usernameExist: 0.0 + UsersController#create: 0.0 + UsersController#update: 0.0 + UsersController#checkExist?: 0.0 + UsersController#user_params: 0.0 + "./app/models/comment.rb": + :lines: + - :content: class Comment < ActiveRecord::Base + :was_run: 1 + - :content: " " + :was_run: + - :content: " belongs_to :mission" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validates :content, presence: true" + :was_run: 1 + - :content: " validates :mission_id, presence: true" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validates :user_id, presence: true" + :was_run: 1 + - :content: " validate :comment_has_atleast_one_character, on: :create" + :was_run: 1 + - :content: " validate :user_id_exist, on: :create" + :was_run: 1 + - :content: " " + :was_run: + - :content: " private " + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " def comment_has_atleast_one_character" + :was_run: 1 + - :content: " tmp = content.strip" + :was_run: 1 + - :content: " if tmp.length < 1" + :was_run: 1 + - :content: " errors[:content] = 'content should has at least one + character'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " def user_id_exist" + :was_run: 1 + - :content: " " + :was_run: + - :content: " user = User.find_by(id: user_id)" + :was_run: 1 + - :content: " if user == nil" + :was_run: 1 + - :content: ' errors[:user] = "user is not exist"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICAgICAjIG1pc3Npb24g5piv5ZCm5a2Y5Zyo55qE6aqM6K+B5bCG5pS+ + 5ZyoY29udHJvbGxlcuS4rei/m+ihjA== + :was_run: + - :content: " " + :was_run: + - :content: " # def mission_id_should_be_exist" + :was_run: + - :content: " " + :was_run: + - :content: " # @mission = Mission.find(:mission_id)" + :was_run: + - :content: " " + :was_run: + - :content: " # if @mission == nil" + :was_run: + - :content: ' # errors[:mission_id] = "mission is not exist"' + :was_run: + - :content: " # end" + :was_run: + - :content: " # end " + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + Comment#comment_has_atleast_one_character: 0.0 + Comment#user_id_exist: 25.0 + "./app/models/mission.rb": + :lines: + - :content: 'class Mission < ActiveRecord:: Base' + :was_run: 1 + - :content: " has_many :comments" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " validates :name, presence: true" + :was_run: 1 + - :content: " validates :deadline, presence: true" + :was_run: 1 + - :content: " validates :priority, presence: true" + :was_run: 1 + - :content: " validates :status, presence: true" + :was_run: 1 + - :content: " validates :content, presence: true" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validates :project_id, presence: true" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " validate :priority_is_among_valid_values" + :was_run: 1 + - :content: " validate :status_is_among_valid_values" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validate :project_exists, on: :create" + :was_run: 1 + - :content: " " + :was_run: + - :content: " private " + :was_run: 1 + - :content: " " + :was_run: + - :content: " def priority_is_among_valid_values" + :was_run: 1 + - :content: " " + :was_run: + - :content: " if priority != 1 and priority != 2 and priority != 3" + :was_run: 1 + - :content: ' errors[:priority] = "priority is not among valid + values"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " def status_is_among_valid_values" + :was_run: 1 + - :content: " " + :was_run: + - :content: " if status != 1 and status != 2 and status != 3 and + status != 4" + :was_run: 1 + - :content: ' errors[:status] = "status is not among valid values"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " def project_exists" + :was_run: 1 + - :content: " #puts project_id" + :was_run: + - :content: " project = Project.find_by(id: project_id)" + :was_run: 1 + - :content: " #puts project.inspect" + :was_run: + - :content: " if project == nil" + :was_run: 1 + - :content: ' errors[:project_id] = "project_id is not exist"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + Mission#priority_is_among_valid_values: 33.33333333333333 + Mission#status_is_among_valid_values: 33.33333333333333 + Mission#project_exists: 40.0 + "./app/models/missions_user.rb": + :lines: + - :content: 'class Missions_user 'username', :email => '1261138729@qq.com'," + :was_run: 1 + - :content: " :password => 'secret', :password_confirmation + => 'secret'," + :was_run: + - :content: " :more_field => 'test'} }" + :was_run: 1 + - :content: " it 'should throw exception without param[:user]' do" + :was_run: 1 + - :content: " expect {" + :was_run: 1 + - :content: " post :create" + :was_run: 1 + - :content: " }.to raise_error ActionController::ParameterMissing" + :was_run: + - :content: " end" + :was_run: + - :content: " it 'should not throw exception' do" + :was_run: 1 + - :content: " expect {" + :was_run: 1 + - :content: " post :create, user: data_to_send, other_param: 'test'" + :was_run: 1 + - :content: " }.to_not raise_error" + :was_run: + - :content: " end" + :was_run: + - :content: " it 'should not accept other params' do" + :was_run: 1 + - :content: " post :create, user: data_to_send" + :was_run: 1 + - :content: " user = assigns(:user)" + :was_run: 1 + - :content: " expect(user.has_attribute? :more_field).to eq false" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'PATCH #update' do" + :was_run: 1 + - :content: " context 'with valid attributes' do" + :was_run: 1 + - :content: " before :each do" + :was_run: 1 + - :content: !binary |- + ICAgICAgICAjIOWBh+iuvuW3sue7j+eZu+W9leS6hg== + :was_run: + - :content: " allow(controller).to receive(:authenticate){ true }" + :was_run: 1 + - :content: " allow(controller).to receive(:current_user).and_return(User.find + user_with_fixed_info.id)" + :was_run: 1 + - :content: " patch :update, user: valid_attributes, format: 'json'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'should located current user' do" + :was_run: 1 + - :content: " expect(assigns[:user]).to eq user_with_fixed_info" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'should render show' do" + :was_run: 1 + - :content: " expect(response).to render_template 'show'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " context 'with invalid attributes' do" + :was_run: 1 + - :content: " before :each do" + :was_run: 1 + - :content: !binary |- + ICAgICAgICAjIOWBh+iuvuW3sue7j+eZu+W9leS6hg== + :was_run: + - :content: " allow(controller).to receive(:authenticate){ true }" + :was_run: 1 + - :content: " allow(controller).to receive(:current_user).and_return(User.find + user_with_fixed_info.id)" + :was_run: 1 + - :content: " patch :update, user: invalid_attributes, format: 'json'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not change current user' do" + :was_run: 1 + - :content: " expect(assigns[:user]).to eq user_with_fixed_info" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'should return error messages and error status' do" + :was_run: 1 + - :content: " error_message = JSON.parse response.body" + :was_run: 1 + - :content: " expect(error_message['email'].nil?).to be false" + :was_run: 1 + - :content: " expect(error_message['email']).not_to be_empty" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " it 'should login first' do" + :was_run: 1 + - :content: " patch :update, user:valid_attributes, format: 'json'" + :was_run: 1 + - :content: " expect(response).to have_http_status :unauthorized" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/comment_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Comment , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: " it 'has a valid comment' do" + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: ' params = {content:"good job",mission_id:123,user_id: user.id}' + :was_run: 1 + - :content: " expect(Comment.new(params)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "content should not be empty" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " params = {content: nil,mission_id: 123,user_id: user.id}" + :was_run: 1 + - :content: " expect(Comment.new(params)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "mission_id should not be empty" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: ' params = {content:"good job", mission_id: nil,user_id: user.id}' + :was_run: 1 + - :content: " expect(Comment.new(params)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "content should has at least one word " do' + :was_run: 1 + - :content: " comment_with_allspace = build(:comment_content_allspace)" + :was_run: 1 + - :content: " comment_with_allspace.validate" + :was_run: 1 + - :content: " expect(comment_with_allspace.errors[:content].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "user should be exist" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: ' params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: + 1,status: 2,content: "mission content",project_id: project.id}' + :was_run: 1 + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.save" + :was_run: 1 + - :content: " expect(mission).to be_valid" + :was_run: 1 + - :content: " expect(mission.errors[:project_id].size).to eq(0)" + :was_run: 1 + - :content: ' params = {content: "comment", mission_id: mission.id, user_id: + user.id}' + :was_run: 1 + - :content: " comment = Comment.new(params)" + :was_run: 1 + - :content: " expect(comment).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/mission_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Mission , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: " it 'has a valid mission' do" + :was_run: 1 + - :content: !binary |- + ICAgICAgcGFyYW1zID0ge25hbWU6ICJtaXNzaW9uMSIsY29udGVudDogIm1p + c3Npb24gY29udGVudCIsZGVhZGxpbmU6IjIwMTYtMTAtMTcgMTA6MDA6MDAi + LHByaW9yaXR5OjEsc3RhdHVzOiLov5vooYzkuK0ifQ== + :was_run: 1 + - :content: " " + :was_run: + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.validate" + :was_run: 1 + - :content: " expect(mission).to be_valid " + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'content should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_content_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'deadline should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_deadline_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'status should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_status_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'priority should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_priority_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'priority is not among valid values' do" + :was_run: 1 + - :content: " mission = build(:priority_not_among_valid_values)" + :was_run: 1 + - :content: " mission.validate" + :was_run: 1 + - :content: " expect(mission.errors[:priority].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'status is not among valid values' do" + :was_run: 1 + - :content: " mission = build(:status_not_among_valid_values)" + :was_run: 1 + - :content: " mission.validate" + :was_run: 1 + - :content: " expect(mission.errors[:status].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + - :content: "# require 'rails_helper'" + :was_run: + - :content: "# RSpec.describe Mission, type: :model do" + :was_run: + - :content: "# it 'has a valid mission' do" + :was_run: + - :content: "# expect(build(:project)).to be_valid" + :was_run: + - :content: "# end" + :was_run: + - :content: "# describe 'users test' do" + :was_run: + - :content: "# it 'has at least on user' do" + :was_run: + - :content: "# mission_with_no_user = build(:mission)" + :was_run: + - :content: "# mission_with_no_user.users = []" + :was_run: + - :content: "# mission_with_no_user.valid?" + :was_run: + - :content: "# expect(mission_with_no_user.errors[:users].size).to eq(1)" + :was_run: + - :content: "# end" + :was_run: + - :content: "# end" + :was_run: + - :content: "# describe 'name test' do" + :was_run: + - :content: "# it 'does not allow absence of name' do" + :was_run: + - :content: "# expect(build(:mission, name: nil)).to_not be_valid" + :was_run: + - :content: "# end" + :was_run: + - :content: "# it 'length of name in [1,20]' do" + :was_run: + - :content: "# expect(build(:mission_name_length_gt_20)).to_not be_valid" + :was_run: + - :content: "# end" + :was_run: + - :content: "# end" + :was_run: + - :content: "# end" + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/missions_user_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Missions_user , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' it "mission should exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: ' params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: + 1,status: 2,content: "mission content",project_id: project.id}' + :was_run: 1 + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.save" + :was_run: 1 + - :content: " expect(mission).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " params = {mission_id: 5,user_id: user.id}" + :was_run: 1 + - :content: " missions_user = Missions_user.new(params)" + :was_run: 1 + - :content: " missions_user.save" + :was_run: 1 + - :content: " expect(missions_user).to_not be_valid" + :was_run: 1 + - :content: " expect(missions_user.errors[:mission].size).to eq(1)" + :was_run: 1 + - :content: " expect(Missions_user.find_by(user_id: user.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "user should exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: ' params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: + 1,status: 2,content: "mission content",project_id: project.id}' + :was_run: 1 + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.save" + :was_run: 1 + - :content: " expect(mission).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " params = {mission_id: mission.id,user_id: 2}" + :was_run: 1 + - :content: " missions_user = Missions_user.new(params)" + :was_run: 1 + - :content: " missions_user.save" + :was_run: 1 + - :content: " #puts missions_user.inspect" + :was_run: + - :content: " expect(missions_user).to_not be_valid" + :was_run: 1 + - :content: " expect(missions_user.errors[:user].size).to eq(1)" + :was_run: 1 + - :content: " expect(Missions_user.find_by(mission_id: mission.id)).to + eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/note_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Note , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' it "has a valid note" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "note content",user_id: user.id,project_id: + project.id,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "notes content should at least has one character" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: " ",user_id: user.id,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note.errors[:content].size).to eq(2)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "category should be among valid values" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: ' params = {content: " ",user_id: user.id,category: 4}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note.errors[:category].size).to eq(1)" + :was_run: 1 + - :content: " expect(note).to_not be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "notes user should be exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "note content",user_id: user.id,project_id: + 5,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note).to_not be_valid" + :was_run: 1 + - :content: " expect(note.errors[:project].size).to eq(1)" + :was_run: 1 + - :content: " expect(Note.find_by(project_id: 5)).to eq(nil)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "notes project should be exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "note content",user_id: 5,project_id: + project.id,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note).to_not be_valid" + :was_run: 1 + - :content: " expect(note.errors[:user].size).to eq(1)" + :was_run: 1 + - :content: " expect(Note.find_by(user_id: 5)).to eq(nil)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/project_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Project, type: :model do' + :was_run: 1 + - :content: " it 'has a valid factory' do" + :was_run: 1 + - :content: " expect(build(:project)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " describe 'users test' do" + :was_run: 1 + - :content: " it 'has at least on user' do" + :was_run: 1 + - :content: " project_with_no_user = build(:project)" + :was_run: 1 + - :content: " project_with_no_user.users = []" + :was_run: 1 + - :content: " project_with_no_user.valid?" + :was_run: 1 + - :content: " expect(project_with_no_user.errors[:users].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'name test' do" + :was_run: 1 + - :content: " it 'does not allow absence of name' do" + :was_run: 1 + - :content: " expect(build(:project, name: nil)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'length of name in [1,20]' do" + :was_run: 1 + - :content: " expect(build(:project_name_length_gt_20)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow duplicate name' do" + :was_run: 1 + - :content: " create(:project, name: 'project1')" + :was_run: 1 + - :content: " expect(build(:project, name: 'project1')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/share_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Share, type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' it "its a valid share" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403488@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "share content",project_id: project.id,user_id: + user.id}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to be_valid" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to_not eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "share content should have at least one character" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: " ",project_id: project.id,user_id: + user.id}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to_not be_valid" + :was_run: 1 + - :content: " expect(share.errors[:content].size).to eq(2)" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "share''s project should be exist" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "share content",project_id: 5,user_id: + user.id}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to_not be_valid" + :was_run: 1 + - :content: " expect(share.errors[:project].size).to eq(1)" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "share''s user should be exist" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "share content",project_id: project.id,user_id: + 10}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to_not be_valid" + :was_run: 1 + - :content: " expect(share.errors[:user].size).to eq(1)" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/user_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe User, type: :model do' + :was_run: 1 + - :content: " it 'has a valid factory' do" + :was_run: 1 + - :content: " expect(build(:user)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " describe 'username test' do" + :was_run: 1 + - :content: " it 'does not allow absence of username' do" + :was_run: 1 + - :content: " expect(build(:user, name: nil)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow name length > 30' do" + :was_run: 1 + - :content: " expect(build(:user_name_length_gt_30)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'email test' do" + :was_run: 1 + - :content: " it 'does not allow absence of email' do" + :was_run: 1 + - :content: " expect(build(:user, email: nil)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow email length > 50' do" + :was_run: 1 + - :content: " expect(build(:user_email_length_gt_50)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'email should match /\\A([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})\\Z/i' + do" + :was_run: 1 + - :content: " expect(build(:user, email: '123qq.com')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '@qq.com')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '123@qq')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '123@.com')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '123@qq.')).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'password test' do" + :was_run: 1 + - :content: " it 'does not allow password length < 6' do" + :was_run: 1 + - :content: " expect(build(:user_password_length_lt_6)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'password_confirmation should match password when password_confirmation + not nil' do" + :was_run: 1 + - :content: " expect(build(:user, password: '123456', password_confirmation: + '654321')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'do not trigger match when password_confirmation nil' do" + :was_run: 1 + - :content: " expect(build(:user, password: '123456', password_confirmation: + nil)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow password absence on create' do" + :was_run: 1 + - :content: " expect(build(:user, password: nil, password_confirmation: nil)).to_not + be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'can authenticate' do" + :was_run: 1 + - :content: " user = create(:user, password: '123456', password_confirmation: + '123456')" + :was_run: 1 + - :content: " expect(user.authenticate('123456')).to be_instance_of User" + :was_run: 1 + - :content: " expect(user.authenticate('654312')).to be false" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'phone test' do" + :was_run: 1 + - :content: " it 'does not allow phone absence' do" + :was_run: 1 + - :content: " expect(build(:user, phone: nil)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow character other than number' do" + :was_run: 1 + - :content: " expect(build(:user, phone: '1371234567a')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow phone longer or shorter than 11' do" + :was_run: 1 + - :content: " expect(build(:user, phone: '137123456789')).to_not be_valid" + :was_run: 1 + - :content: " expect(build(:user, phone: '1371234567')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: !binary |- + ICAgICMg6ZiyanPms6jlhaU= + :was_run: + - :content: " it 'does not allow multiline' do" + :was_run: 1 + - :content: " expect(build(:user, phone: '13712345\\n78')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + :global_percent_run: 87.1 +:hotspots: + files: + - location: + class_name: + method_name: + file_path: "./app/controllers/notes_controller.rb" + file_name: "./app/controllers/notes_controller.rb" + line_number: + hash_key: '["./app/controllers/notes_controller.rb", nil, nil]' + details: + rcov: uncovered code is 44.0% + - location: + class_name: + method_name: + file_path: "./app/models/mission.rb" + file_name: "./app/models/mission.rb" + line_number: + hash_key: '["./app/models/mission.rb", nil, nil]' + details: + saikuro: average complexity is 2.0 + rcov: average uncovered code is 35.6% + - location: + class_name: + method_name: + file_path: "./app/controllers/missions_controller.rb" + file_name: "./app/controllers/missions_controller.rb" + line_number: + hash_key: '["./app/controllers/missions_controller.rb", nil, nil]' + details: + rcov: average uncovered code is 35.2% + - location: + class_name: + method_name: + file_path: "./app/models/missions_user.rb" + file_name: "./app/models/missions_user.rb" + line_number: + hash_key: '["./app/models/missions_user.rb", nil, nil]' + details: + rcov: average uncovered code is 25.0% + - location: + class_name: + method_name: + file_path: "./app/models/note.rb" + file_name: "./app/models/note.rb" + line_number: + hash_key: '["./app/models/note.rb", nil, nil]' + details: + saikuro: average complexity is 2.0 + rcov: average uncovered code is 20.8% + - location: + class_name: + method_name: + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", nil, nil]' + details: + saikuro: average complexity is 1.7 + rcov: average uncovered code is 20.2% + - location: + class_name: + method_name: + file_path: "./app/models/share.rb" + file_name: "./app/models/share.rb" + line_number: + hash_key: '["./app/models/share.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: average uncovered code is 16.7% + - location: + class_name: + method_name: + file_path: "./app/controllers/shares_controller.rb" + file_name: "./app/controllers/shares_controller.rb" + line_number: + hash_key: '["./app/controllers/shares_controller.rb", nil, nil]' + details: + saikuro: complexity is 1.0 + rcov: average uncovered code is 15.6% + - location: + class_name: + method_name: + file_path: "./app/models/comment.rb" + file_name: "./app/models/comment.rb" + line_number: + hash_key: '["./app/models/comment.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: average uncovered code is 12.5% + - location: + class_name: + method_name: + file_path: app/controllers/notes_controller.rb + file_name: app/controllers/notes_controller.rb + line_number: + hash_key: '["app/controllers/notes_controller.rb", nil, nil]' + details: + saikuro: complexity is 4.0 + roodi: found 2 design problems + reek: found 10 code smells + - location: + class_name: + method_name: + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", nil, nil]' + details: + flay: found 1 code duplications + churn: detected high level of churn (changed 16 times) + saikuro: average complexity is 2.0 + roodi: found 3 design problems + reek: found 12 code smells + - location: + class_name: + method_name: + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", nil, nil]' + details: + saikuro: average complexity is 2.4 + roodi: found 4 design problems + reek: found 11 code smells + - location: + class_name: + method_name: + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 2.0 + roodi: found 1 design problems + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", nil, nil]' + details: + flay: found 2 code duplications + saikuro: average complexity is 2.0 + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", nil, nil]' + details: + saikuro: average complexity is 2.5 + roodi: found 1 design problems + reek: found 8 code smells + - location: + class_name: + method_name: + file_path: app/models/mission.rb + file_name: app/models/mission.rb + line_number: + hash_key: '["app/models/mission.rb", nil, nil]' + details: + flay: found 2 code duplications + saikuro: complexity is 2.0 + reek: found 2 code smells + - location: + class_name: + method_name: + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 2.0 + roodi: found 1 design problems + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 1.7 + roodi: found 3 design problems + reek: found 5 code smells + - location: + class_name: + method_name: + file_path: app/models/comment.rb + file_name: app/models/comment.rb + line_number: + hash_key: '["app/models/comment.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: complexity is 2.0 + reek: found 1 code smells + - location: + class_name: + method_name: + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 2.0 + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/controllers/application_controller.rb + file_name: app/controllers/application_controller.rb + line_number: + hash_key: '["app/controllers/application_controller.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + - location: + class_name: + method_name: + file_path: "./app/controllers/application_controller.rb" + file_name: "./app/controllers/application_controller.rb" + line_number: + hash_key: '["./app/controllers/application_controller.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: average uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: "./app/models/project.rb" + file_name: "./app/models/project.rb" + line_number: + hash_key: '["./app/models/project.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", nil, nil]' + details: + saikuro: average complexity is 1.7 + rcov: average uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", nil, nil]' + details: + saikuro: average complexity is 1.3 + rcov: average uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: db/schema.rb + file_name: db/schema.rb + line_number: + hash_key: '["db/schema.rb", nil, nil]' + details: + churn: detected high level of churn (changed 12 times) + - location: + class_name: + method_name: + file_path: app/models/project.rb + file_name: app/models/project.rb + line_number: + hash_key: '["app/models/project.rb", nil, nil]' + details: + reek: found 1 code smells + - location: + class_name: + method_name: + file_path: app/controllers/sessions_controller.rb + file_name: app/controllers/sessions_controller.rb + line_number: + hash_key: '["app/controllers/sessions_controller.rb", nil, nil]' + details: + reek: found 1 code smells + - location: + class_name: + method_name: + file_path: app/models/user.rb + file_name: app/models/user.rb + line_number: + hash_key: '["app/models/user.rb", nil, nil]' + details: + reek: found 1 code smells + classes: + - location: + class_name: NotesController + method_name: + file_path: app/controllers/notes_controller.rb + file_name: app/controllers/notes_controller.rb + line_number: + hash_key: '["app/controllers/notes_controller.rb", "NotesController", nil]' + details: + saikuro: complexity is 4.0 + reek: found 10 code smells + rcov: uncovered code is 44.0% + - location: + class_name: MissionsController + method_name: + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + nil]' + details: + saikuro: average complexity is 2.4 + reek: found 11 code smells + rcov: average uncovered code is 35.2% + - location: + class_name: Mission + method_name: + file_path: app/models/mission.rb + file_name: app/models/mission.rb + line_number: + hash_key: '["app/models/mission.rb", "Mission", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 2 code smells + rcov: average uncovered code is 35.6% + - location: + class_name: Missions_user + method_name: + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", "Missions_user", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + rcov: average uncovered code is 25.0% + - location: + class_name: Note + method_name: + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", "Note", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + rcov: average uncovered code is 20.8% + - location: + class_name: ProjectsController + method_name: + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + nil]' + details: + saikuro: average complexity is 1.9 + reek: found 12 code smells + rcov: average uncovered code is 20.2% + - location: + class_name: Share + method_name: + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", "Share", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + rcov: average uncovered code is 16.7% + - location: + class_name: SharesController + method_name: + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", "SharesController", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 8 code smells + rcov: average uncovered code is 15.6% + - location: + class_name: Comment + method_name: + file_path: app/models/comment.rb + file_name: app/models/comment.rb + line_number: + hash_key: '["app/models/comment.rb", "Comment", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 1 code smells + rcov: average uncovered code is 12.5% + - location: + class_name: Projects_user + method_name: + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", "Projects_user", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + - location: + class_name: UsersController + method_name: + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", nil]' + details: + saikuro: average complexity is 1.7 + reek: found 5 code smells + rcov: average uncovered code is 0.0% + - location: + class_name: ApplicationController + method_name: + file_path: app/controllers/application_controller.rb + file_name: app/controllers/application_controller.rb + line_number: + hash_key: '["app/controllers/application_controller.rb", "ApplicationController", + nil]' + details: + saikuro: average complexity is 2.0 + reek: found 2 code smells + rcov: average uncovered code is 0.0% + - location: + class_name: Project + method_name: + file_path: "./app/models/project.rb" + file_name: "./app/models/project.rb" + line_number: + hash_key: '["./app/models/project.rb", "Project", nil]' + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + nil]' + details: + saikuro: average complexity is 1.3 + reek: found 1 code smells + rcov: average uncovered code is 0.0% + - location: + class_name: User + method_name: + file_path: app/models/user.rb + file_name: app/models/user.rb + line_number: + hash_key: '["app/models/user.rb", "User", nil]' + details: + reek: found 1 code smells + methods: + - location: + class_name: MissionsController + method_name: MissionsController#getlist + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#getlist"]' + simple_method_name: "#getlist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 71.4% + - location: + class_name: ProjectsController + method_name: ProjectsController#detail + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#detail"]' + simple_method_name: "#detail" + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + rcov: uncovered code is 58.3% + - location: + class_name: SharesController + method_name: SharesController#getShareList + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", "SharesController", "SharesController#getShareList"]' + simple_method_name: "#getShareList" + details: + saikuro: complexity is 2.0 + reek: found 5 code smells + rcov: uncovered code is 46.7% + - location: + class_name: NotesController + method_name: NotesController#getNotesList + file_path: app/controllers/notes_controller.rb + file_name: app/controllers/notes_controller.rb + line_number: + hash_key: '["app/controllers/notes_controller.rb", "NotesController", "NotesController#getNotesList"]' + simple_method_name: "#getNotesList" + details: + saikuro: complexity is 4.0 + reek: found 9 code smells + rcov: uncovered code is 44.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#index + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#index"]' + simple_method_name: "#index" + details: + saikuro: complexity is 2.0 + reek: found 3 code smells + rcov: uncovered code is 45.0% + - location: + class_name: MissionsController + method_name: MissionsController#detail + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#detail"]' + simple_method_name: "#detail" + details: + saikuro: complexity is 3.0 + reek: found 3 code smells + rcov: uncovered code is 40.0% + - location: + class_name: Mission + method_name: Mission#project_exists + file_path: app/models/mission.rb + file_name: app/models/mission.rb + line_number: + hash_key: '["app/models/mission.rb", "Mission", "Mission#project_exists"]' + simple_method_name: "#project_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 40.0% + - location: + class_name: Note + method_name: Note#note_category_should_among_valid_values + file_path: "./app/models/note.rb" + file_name: "./app/models/note.rb" + line_number: + hash_key: '["./app/models/note.rb", "Note", "Note#note_category_should_among_valid_values"]' + simple_method_name: "#note_category_should_among_valid_values" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 33.3% + - location: + class_name: Mission + method_name: Mission#status_is_among_valid_values + file_path: "./app/models/mission.rb" + file_name: "./app/models/mission.rb" + line_number: + hash_key: '["./app/models/mission.rb", "Mission", "Mission#status_is_among_valid_values"]' + simple_method_name: "#status_is_among_valid_values" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 33.3% + - location: + class_name: Mission + method_name: Mission#priority_is_among_valid_values + file_path: "./app/models/mission.rb" + file_name: "./app/models/mission.rb" + line_number: + hash_key: '["./app/models/mission.rb", "Mission", "Mission#priority_is_among_valid_values"]' + simple_method_name: "#priority_is_among_valid_values" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 33.3% + - location: + class_name: MissionsController + method_name: MissionsController#create + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 3.0 + reek: found 2 code smells + rcov: uncovered code is 27.3% + - location: + class_name: MissionsController + method_name: MissionsController#update + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#update"]' + simple_method_name: "#update" + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Comment + method_name: Comment#user_id_exist + file_path: app/models/comment.rb + file_name: app/models/comment.rb + line_number: + hash_key: '["app/models/comment.rb", "Comment", "Comment#user_id_exist"]' + simple_method_name: "#user_id_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Missions_user + method_name: Missions_user#mission_exist + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", "Missions_user", "Missions_user#mission_exist"]' + simple_method_name: "#mission_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Missions_user + method_name: Missions_user#user_exist + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", "Missions_user", "Missions_user#user_exist"]' + simple_method_name: "#user_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Note + method_name: Note#project_exist + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", "Note", "Note#project_exist"]' + simple_method_name: "#project_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Note + method_name: Note#user_exist + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", "Note", "Note#user_exist"]' + simple_method_name: "#user_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Share + method_name: Share#project_exists + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", "Share", "Share#project_exists"]' + simple_method_name: "#project_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Share + method_name: Share#user_exists + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", "Share", "Share#user_exists"]' + simple_method_name: "#user_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#deleteUsers + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#deleteUsers"]' + simple_method_name: "#deleteUsers" + details: + saikuro: complexity is 2.0 + reek: found 3 code smells + rcov: uncovered code is 23.8% + - location: + class_name: ProjectsController + method_name: ProjectsController#addUsers + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#addUsers"]' + simple_method_name: "#addUsers" + details: + saikuro: complexity is 2.0 + reek: found 3 code smells + rcov: uncovered code is 14.3% + - location: + class_name: MissionsController + method_name: MissionsController#commentPublish + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#commentPublish"]' + simple_method_name: "#commentPublish" + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + rcov: uncovered code is 12.5% + - location: + class_name: SharesController + method_name: SharesController#create + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", "SharesController", "SharesController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 3.0 + reek: found 2 code smells + rcov: uncovered code is 0.0% + - location: + class_name: ApplicationController + method_name: ApplicationController#current_user + file_path: app/controllers/application_controller.rb + file_name: app/controllers/application_controller.rb + line_number: + hash_key: '["app/controllers/application_controller.rb", "ApplicationController", + "ApplicationController#current_user"]' + simple_method_name: "#current_user" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: Projects_user + method_name: Projects_user#project_exists + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", "Projects_user", "Projects_user#project_exists"]' + simple_method_name: "#project_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + - location: + class_name: Projects_user + method_name: Projects_user#user_exists + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", "Projects_user", "Projects_user#user_exists"]' + simple_method_name: "#user_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + - location: + class_name: UsersController + method_name: UsersController#emailExist + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", "UsersController", "UsersController#emailExist"]' + simple_method_name: "#emailExist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#update + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#update"]' + simple_method_name: "#update" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#create + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#update + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", "UsersController#update"]' + simple_method_name: "#update" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#create + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", "UsersController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#usernameExist + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", "UsersController", "UsersController#usernameExist"]' + simple_method_name: "#usernameExist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: Note + method_name: Note#note_has_atleast_one_character + file_path: "./app/models/note.rb" + file_name: "./app/models/note.rb" + line_number: + hash_key: '["./app/models/note.rb", "Note", "Note#note_has_atleast_one_character"]' + simple_method_name: "#note_has_atleast_one_character" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: Share + method_name: Share#share_has_atleast_one_character + file_path: "./app/models/share.rb" + file_name: "./app/models/share.rb" + line_number: + hash_key: '["./app/models/share.rb", "Share", "Share#share_has_atleast_one_character"]' + simple_method_name: "#share_has_atleast_one_character" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: SessionsController#create + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + "SessionsController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: ApplicationController + method_name: ApplicationController#authenticate + file_path: "./app/controllers/application_controller.rb" + file_name: "./app/controllers/application_controller.rb" + line_number: + hash_key: '["./app/controllers/application_controller.rb", "ApplicationController", + "ApplicationController#authenticate"]' + simple_method_name: "#authenticate" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: Comment + method_name: Comment#comment_has_atleast_one_character + file_path: "./app/models/comment.rb" + file_name: "./app/models/comment.rb" + line_number: + hash_key: '["./app/models/comment.rb", "Comment", "Comment#comment_has_atleast_one_character"]' + simple_method_name: "#comment_has_atleast_one_character" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: Project + method_name: Project#require_at_least_on_user + file_path: "./app/models/project.rb" + file_name: "./app/models/project.rb" + line_number: + hash_key: '["./app/models/project.rb", "Project", "Project#require_at_least_on_user"]' + simple_method_name: "#require_at_least_on_user" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#checkExist? + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", "UsersController", "UsersController#checkExist?"]' + simple_method_name: "#checkExist?" + details: + saikuro: complexity is 1.0 + reek: found 2 code smells + rcov: uncovered code is 0.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#project_params + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#project_params"]' + simple_method_name: "#project_params" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#user_params + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", "UsersController#user_params"]' + simple_method_name: "#user_params" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: SharesController + method_name: SharesController#share_params + file_path: "./app/controllers/shares_controller.rb" + file_name: "./app/controllers/shares_controller.rb" + line_number: + hash_key: '["./app/controllers/shares_controller.rb", "SharesController", "SharesController#share_params"]' + simple_method_name: "#share_params" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: SessionsController#show + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + "SessionsController#show"]' + simple_method_name: "#show" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: SessionsController#destroy + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + "SessionsController#destroy"]' + simple_method_name: "#destroy" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% diff --git a/reports/metric_fu/output/0372be451d4207e57c60fe0ae29614.html b/reports/metric_fu/output/0372be451d4207e57c60fe0ae29614.html new file mode 100644 index 0000000..3a5332f --- /dev/null +++ b/reports/metric_fu/output/0372be451d4207e57c60fe0ae29614.html @@ -0,0 +1,2434 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class ProjectsController < ApplicationController
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :index,
+
+
+ +
+ +   + + +
+
6        :create,
+
+
+ +
+ +   + + +
+
7        :addUsers,
+
+
+ +
+ +   + + +
+
8        :detail,
+
+
+ +
+ +   + + +
+
 9        :update,
+
+
+ +
+ +   + + +
+
10        :deleteUsers
+
+
+ +
+ +   + + +
+
11    ]
+
+
+ +
+ +   + + +
+
12    
+
+
+ +
+ +   + + +
+
13    #=============================================>user_idsession.
+
+
+ +
+ +   + + +
+
14    def index
+
+
+ +
+ +   + + +
+
15    #Todo
+
+
+ +
+ +   + + +
+
16    uid = session[:user_id]
+
+
+ +
+ +   + + +
+
17    data=[]
+
+
+ +
+ +   + + +
+
18    Projects_user.where(:user_id => uid).each do |i|
+
+
+ +
+ +   + + +
+
19        pid=i.project_id
+
+
+ +
+ +   + + +
+
20        p=Project.find_by(id:pid)
+
+
+ +
+ +   + + +
+
21        mc = Mission.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
22        uc = Projects_user.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
23        sc = Share.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
24        data+=[{
+
+
+ +
+ +   + + +
+
25            :id => pid,
+
+
+ +
+ +   + + +
+
26            :name => p.name,
+
+
+ +
+ +   + + +
+
27            :content => p.content,
+
+
+ +
+ +   + + +
+
28            :mission_count => mc,
+
+
+ +
+ +   + + +
+
29            :users_count => uc,
+
+
+ +
+ +   + + +
+
30            :shares_count => sc
+
+
+ +
+ +   + + +
+
31        }]
+
+
+ +
+ +   + + +
+
32    end
+
+
+ +
+ +   + + +
+
33    render :json => {
+
+
+ +
+ +   + + +
+
34        :code => 0,
+
+
+ +
+ +   + + +
+
35        :data => data
+
+
+ +
+ +   + + +
+
36    }
+
+
+ +
+ +   + + +
+
37    end
+
+
+ +
+ +   + + +
+
38    
+
+
+ +
+ +   + + +
+
39    #=============================================>
+
+
+ +
+ +   + + +
+
40    
+
+
+ +
+ +   + + +
+
41    def create
+
+
+ +
+ +   + + +
+
42        uid = session[:user_id]
+
+
+ +
+ +   + + +
+
43        project = Project.new(project_params)
+
+
+ +
+ +   + + +
+
44        if project.save
+
+
+ +
+ +   + + +
+
45            Projects_user.create(project_id:project.id,user_id:uid)
+
+
+ +
+ +   + + +
+
46            render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
47        else
+
+
+ +
+ +   + + +
+
48            render json: project.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
49        end
+
+
+ +
+ +   + + +
+
50     end
+
+
+ +
+ +   + + +
+
51    
+
+
+ +
+ +   + + +
+
52    
+
+
+ +
+ +   + + +
+
53    #=============================================>
+
+
+ +
+ +   + + +
+
54    
+
+
+ +
+ +   + + +
+
55    def addUsers
+
+
+ +
+ +   + + +
+
56        uid = User.find_by(email:params[:email]).id# 
+
+
+ +
+ +   + + +
+
57        register = session[:user_id]# 
+
+
+ +
+ +   + + +
+
58        pid = params[:project_id]
+
+
+ +
+ +   + + +
+
59        # 
+
+
+ +
+ +   + + +
+
60        pu_exist=Projects_user.find_by(project_id:pid,user_id:uid)
+
+
+ +
+ +   + + +
+
61        if pu_exist.nil?# 
+
+
+ +
+ +   + + +
+
62            params_pu = {project_id: pid,user_id: uid}
+
+
+ +
+ +   + + +
+
63            pu = Projects_user.new(params_pu)
+
+
+ +
+ +   + + +
+
64            pu.save
+
+
+ +
+ +   + + +
+
65            
+
+
+ +
+ +   + + +
+
66            content = "<a>"+User.find_by(id: register).name + "</a>  <a>" + Project.find_by(id: pid).name+"</a>"
+
+
+ +
+ +   + + +
+
67            puts content
+
+
+ +
+ +   + + +
+
68            params_note = {user_id: uid,content: content,category: 2,project_id: pid}
+
+
+ +
+ +   + + +
+
69            note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
70            note.save!
+
+
+ +
+ +   + + +
+
71            render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
72        else# 
+
+
+ +
+ +   + + +
+
73            render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
74        end
+
+
+ +
+ +   + + +
+
75    end
+
+
+ +
+ +   + + +
+
76    
+
+
+ +
+ +   + + +
+
77    #=============================================>
+
+
+ +
+ +   + + +
+
78    def deleteUsers
+
+
+ +
+ +   + + +
+
79        uid = params[:user_id]# 
+
+
+ +
+ +   + + +
+
80        register = session[:user_id]# 
+
+
+ +
+ +   + + +
+
81        pid = params[:project_id]
+
+
+ +
+ +   + + +
+
82        # 
+
+
+ +
+ +   + + +
+
83        projects_user=Projects_user.find_by(project_id:pid,user_id:uid)
+
+
+ +
+ +   + + +
+
84        if projects_user.nil?# 
+
+
+ +
+ +   + + +
+
85            render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
86        end
+
+
+ +
+ +   + + +
+
87        # 
+
+
+ +
+ +   + + +
+
88        puts projects_user.user_id
+
+
+ +
+ +   + + +
+
89        puts projects_user.project_id
+
+
+ +
+ +   + + +
+
90        Projects_user.where(project_id:pid,user_id:uid).delete_all
+
+
+ +
+ +   + + +
+
91            
+
+
+ +
+ +   + + +
+
92        content ="<a>"+ User.find_by(id: register).name + "</a>  <a>" + Project.find_by(id: pid).name+"</a> "
+
+
+ +
+ +   + + +
+
93        puts content
+
+
+ +
+ +   + + +
+
94        params_note = {user_id: uid,content: content,category: 2,project_id: pid}
+
+
+ +
+ +   + + +
+
95        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
96        note.save!
+
+
+ +
+ +   + + +
+
97            
+
+
+ +
+ +   + + +
+
98        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
 99    end
+
+
+ +
+ +   + + +
+
100    
+
+
+ +
+ +   + + +
+
101    #=============================================>
+
+
+ +
+ +   + + +
+
102    
+
+
+ +
+ +   + + +
+
103    def detail
+
+
+ +
+ +   + + +
+
104        #Todo    
+
+
+ +
+ +   + + +
+
105        pid = params[:id]
+
+
+ +
+ +   + + +
+
106        project = Project.find_by(id: pid)
+
+
+ +
+ +   + + +
+
107        #uid = Projects_user.where(:project_id => pid)
+
+
+ +
+ +   + + +
+
108        users = []
+
+
+ +
+ +   + + +
+
109        projects_users = Projects_user.where("project_id = ?",pid).all
+
+
+ +
+ +   + + +
+
110        
+
+
+ +
+ +   + + +
+
111        projects_users.each do |projects_user|
+
+
+ +
+ +   + + +
+
112            uid = projects_user.user_id
+
+
+ +
+ +   + + +
+
113            i = User.find_by(id: uid)
+
+
+ +
+ +   + + +
+
114            users += [{
+
+
+ +
+ +   + + +
+
115                :name => i.name,
+
+
+ +
+ +   + + +
+
116                :id => i.id
+
+
+ +
+ +   + + +
+
117            }]
+
+
+ +
+ +   + + +
+
118        end
+
+
+ +
+ +   + + +
+
119        #puts users.inspect 
+
+
+ +
+ +   + + +
+
120        # Users.find(uid).each do |i|
+
+
+ +
+ +   + + +
+
121        #     users += [{
+
+
+ +
+ +   + + +
+
122        #         :nickname => i.name,
+
+
+ +
+ +   + + +
+
123        #         :id => i.id
+
+
+ +
+ +   + + +
+
124        #     }]
+
+
+ +
+ +   + + +
+
125        # end
+
+
+ +
+ +   + + +
+
126        render :json => {
+
+
+ +
+ +   + + +
+
127            :code => 0,
+
+
+ +
+ +   + + +
+
128            :data => {
+
+
+ +
+ +   + + +
+
129                :name => project.name,
+
+
+ +
+ +   + + +
+
130                :content => project.content,
+
+
+ +
+ +   + + +
+
131                :users => users
+
+
+ +
+ +   + + +
+
132            }
+
+
+ +
+ +   + + +
+
133        }
+
+
+ +
+ +   + + +
+
134    end
+
+
+ +
+ +   + + +
+
135    
+
+
+ +
+ +   + + +
+
136    #=============================================>
+
+
+ +
+ +   + + +
+
137    def update
+
+
+ +
+ +   + + +
+
138        project = Project.find_by(:id => params[:project][:id])
+
+
+ +
+ +   + + +
+
139        if project.update(project_params)
+
+
+ +
+ +   + + +
+
140            render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
141        else
+
+
+ +
+ +   + + +
+
142          render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
143        end
+
+
+ +
+ +   + + +
+
144    end
+
+
+ +
+ +   + + +
+
145    
+
+
+ +
+ +   + + +
+
146    private
+
+
+ +
+ +   + + +
+
147        def project_params
+
+
+ +
+ +   + + +
+
148          params.require(:project).permit(:name,:content,:id)
+
+
+ +
+ +   + + +
+
149        end
+
+
+ +
+ +   + + +
+
150end
+
+ +
+ + diff --git a/reports/metric_fu/output/040453e670f9bf522378f941c96f38.html b/reports/metric_fu/output/040453e670f9bf522378f941c96f38.html new file mode 100644 index 0000000..a148680 --- /dev/null +++ b/reports/metric_fu/output/040453e670f9bf522378f941c96f38.html @@ -0,0 +1,63 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + +
+ +   + + +
+
1module ApplicationHelper
+
+
+ +
+ +   + + +
+
2end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/056e56384f5153a763670265fa1c30.html b/reports/metric_fu/output/056e56384f5153a763670265fa1c30.html new file mode 100644 index 0000000..2e03d58 --- /dev/null +++ b/reports/metric_fu/output/056e56384f5153a763670265fa1c30.html @@ -0,0 +1,744 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Comment < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    belongs_to :mission
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :content, presence: true
+
+
+ +
+ +   + + +
+
6    validates :mission_id, presence: true
+
+
+ +
+ +   + + +
+
7    
+
+
+ +
+ +   + + +
+
8    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
 9    validate :comment_has_atleast_one_character, on: :create
+
+
+ +
+ +   + + +
+
10    validate :user_id_exist, on: :create
+
+
+ +
+ +   + + +
+
11    
+
+
+ +
+ +   + + +
+
12    private 
+
+
+ +
+ +   + + +
+
13    
+
+
+ +
+ +   + + +
+
14      
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
15        def comment_has_atleast_one_character
+
+
+ +
+ +   + + +
+
16            tmp = content.strip
+
+
+ +
+ +   + + +
+
17            if tmp.length < 1
+
+
+ +
+ +   + + +
+
18                errors[:content] = 'content should has at least one character'
+
+
+ +
+ +   + + +
+
19            end
+
+
+ +
+ +   + + +
+
20        end
+
+
+ +
+ +   + + +
+
21        
+
+
+ +
+ +   + + +
+
22        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
23        def user_id_exist
+
+
+ +
+ +   + + +
+
24            
+
+
+ +
+ +   + + +
+
25            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
26            if user == nil
+
+
+ +
+ +   + + +
+
27                errors[:user] = "user is not exist"
+
+
+ +
+ +   + + +
+
28            end
+
+
+ +
+ +   + + +
+
29    
+
+
+ +
+ +   + + +
+
30        end
+
+
+ +
+ +   + + +
+
31        
+
+
+ +
+ +   + + +
+
32        
+
+
+ +
+ +   + + +
+
33        # mission controller
+
+
+ +
+ +   + + +
+
34        
+
+
+ +
+ +   + + +
+
35        # def mission_id_should_be_exist
+
+
+ +
+ +   + + +
+
36            
+
+
+ +
+ +   + + +
+
37        #     @mission = Mission.find(:mission_id)
+
+
+ +
+ +   + + +
+
38            
+
+
+ +
+ +   + + +
+
39        #     if @mission == nil
+
+
+ +
+ +   + + +
+
40        #         errors[:mission_id] = "mission is not exist"
+
+
+ +
+ +   + + +
+
41        #     end
+
+
+ +
+ +   + + +
+
42        # end    
+
+
+ +
+ +   + + +
+
43    
+
+
+ +
+ +   + + +
+
44end
+
+ +
+ + diff --git a/reports/metric_fu/output/0db745639a46a8e60ee3be5e867105.html b/reports/metric_fu/output/0db745639a46a8e60ee3be5e867105.html new file mode 100644 index 0000000..eff451e --- /dev/null +++ b/reports/metric_fu/output/0db745639a46a8e60ee3be5e867105.html @@ -0,0 +1,787 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Mission < ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3    has_many :comments
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
4    
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validates :name, presence: true
+
+
+ +
+ +   + + +
+
7    validates :deadline, presence: true
+
+
+ +
+ +   + + +
+
8    validates :priority, presence: true
+
+
+ +
+ +   + + +
+
 9    validates :status, presence: true
+
+
+ +
+ +   + + +
+
10    validates :content, presence: true
+
+
+ +
+ +   + + +
+
11    
+
+
+ +
+ +   + + +
+
12    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
13    
+
+
+ +
+ +   + + +
+
14    
+
+
+ +
+ +   + + +
+
15    validate :priority_is_among_valid_values
+
+
+ +
+ +   + + +
+
16    validate :status_is_among_valid_values
+
+
+ +
+ +   + + +
+
17    
+
+
+ +
+ +   + + +
+
18    validate :project_exists, on: :create
+
+
+ +
+ +   + + +
+
19    
+
+
+ +
+ +   + + +
+
20    private 
+
+
+ +
+ +   + + +
+
21    
+
+
+ +
+ +   + + +
+
22        def priority_is_among_valid_values
+
+
+ +
+ +   + + +
+
23            
+
+
+ +
+ +   + + +
+
24            if priority != 1 and  priority != 2 and priority != 3
+
+
+ +
+ +   + + +
+
25                errors[:priority] = "priority is not among valid values"
+
+
+ +
+ +   + + +
+
26            end
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        
+
+
+ +
+ +   + + +
+
29        def status_is_among_valid_values
+
+
+ +
+ +   + + +
+
30            
+
+
+ +
+ +   + + +
+
31            if  status != 1 and  status != 2 and status != 3 and status != 4
+
+
+ +
+ +   + + +
+
32                errors[:status] = "status is not among valid values"
+
+
+ +
+ +   + + +
+
33            end
+
+
+ +
+ +   + + +
+
34        end
+
+
+ +
+ +   + + +
+
35        
+
+
+ +
+ +   + + +
+
36        def project_exists
+
+
+ +
+ +   + + +
+
37            #puts project_id
+
+
+ +
+ +   + + +
+
38            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
39            #puts project.inspect
+
+
+ +
+ +   + + +
+
40            if project == nil
+
+
+ +
+ +   + + +
+
41                errors[:project_id] = "project_id is not exist"
+
+
+ +
+ +   + + +
+
42            end
+
+
+ +
+ +   + + +
+
43            
+
+
+ +
+ +   + + +
+
44        end
+
+
+ +
+ +   + + +
+
45    
+
+
+ +
+ +   + + +
+
46    
+
+
+ +
+ +   + + +
+
47end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/0f158ffa97e326bbad1e7a593caead.html b/reports/metric_fu/output/0f158ffa97e326bbad1e7a593caead.html new file mode 100644 index 0000000..22bb7f5 --- /dev/null +++ b/reports/metric_fu/output/0f158ffa97e326bbad1e7a593caead.html @@ -0,0 +1,910 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class SharesController < ApplicationController
+
+
+ +
+ +   + + +
+
2   
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :create,
+
+
+ +
+ +   + + +
+
6        :getShareList
+
+
+ +
+ +   + + +
+
7    ]
+
+
+ +
+ +   + + +
+
8    #
+
+
+ +
+ +   + + +
+
 9   
+
+
+ +
+ +   + + +
+
10    def create
+
+
+ +
+ +   + + +
+
11        uid = session[:user_id].to_i
+
+
+ +
+ +   + + +
+
12        share=Share.new(share_params)
+
+
+ +
+ +   + + +
+
13        share.user_id=uid
+
+
+ +
+ +   + + +
+
14        if share.save
+
+
+ +
+ +   + + +
+
15            content = "<a>"+User.find(uid).name + "</a> "
+
+
+ +
+ +   + + +
+
16            pid=share.project_id
+
+
+ +
+ +   + + +
+
17            
+
+
+ +
+ +   + + +
+
18            Projects_user.where(:project_id => pid).each do |i|
+
+
+ +
+ +   + + +
+
19                params_note = {user_id: i.user_id,content: content,category: 1,project_id: pid}
+
+
+ +
+ +   + + +
+
20                note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
21                note.save!
+
+
+ +
+ +   + + +
+
22            end
+
+
+ +
+ +   + + +
+
23            render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
24        else
+
+
+ +
+ +   + + +
+
25            render json: project.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
26        end
+
+
+ +
+ +   + + +
+
27    end
+
+
+ +
+ +   + + +
+
28    
+
+
+ +
+ +   + + +
+
29    #
+
+
+ +
+ +   + + +
+
30    
+
+
+ +
+ +   + + +
+
31    def getShareList
+
+
+ +
+ +   + + +
+
32    #Todo
+
+
+ +
+ +   + + +
+
33    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
34    
+
+
+ +
+ +   + + +
+
35    data = []
+
+
+ +
+ +   + + +
+
36    Share.where(:project_id => pid).order("created_at desc").each do |i|
+
+
+ +
+ +   + + +
+
37        puts i.content
+
+
+ +
+ +   + + +
+
38        name = User.find(i.user_id).name
+
+
+ +
+ +   + + +
+
39        data += [{
+
+
+ +
+ +   + + +
+
40            :name => name,
+
+
+ +
+ +   + + +
+
41            :time => i.created_at,
+
+
+ +
+ +   + + +
+
42            :content => i.content
+
+
+ +
+ +   + + +
+
43        }]
+
+
+ +
+ +   + + +
+
44    end
+
+
+ +
+ +   + + +
+
45    render :json => {
+
+
+ +
+ +   + + +
+
46        :code => 0,
+
+
+ +
+ +   + + +
+
47        :data => data
+
+
+ +
+ +   + + +
+
48    }
+
+
+ +
+ +   + + +
+
49    end
+
+
+ +
+ +   + + +
+
50
+
+
+ +
+ +   + + +
+
51    private
+
+
+ +
+ +   + + +
+
52        def share_params
+
+
+ +
+ +   + + +
+
53          params.require(:share).permit(:project_id,:content)
+
+
+ +
+ +   + + +
+
54        end
+
+
+ +
+ +   + + +
+
55end
+
+ +
+ + diff --git a/reports/metric_fu/output/1fd324d1e48fdc6e60be4573529460.html b/reports/metric_fu/output/1fd324d1e48fdc6e60be4573529460.html new file mode 100644 index 0000000..0dec47f --- /dev/null +++ b/reports/metric_fu/output/1fd324d1e48fdc6e60be4573529460.html @@ -0,0 +1,67 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + +
+ +
    + +
  • remove empty helpers » rails_best_practices
  • + +
+ +
+
+
1module SessionsHelper
+
+
+ +
+ +   + + +
+
2end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/28f48e0bc2718ddf87752d15b58a00.html b/reports/metric_fu/output/28f48e0bc2718ddf87752d15b58a00.html new file mode 100644 index 0000000..60685a8 --- /dev/null +++ b/reports/metric_fu/output/28f48e0bc2718ddf87752d15b58a00.html @@ -0,0 +1,917 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class UsersController < ApplicationController
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3  before_action :authenticate, except: [ :emailExist, :usernameExist, :create ]
+
+
+ +
+ +   + + +
+
4  skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5    :emailExist,
+
+
+ +
+ +   + + +
+
6    :usernameExist,
+
+
+ +
+ +   + + +
+
7    :create,
+
+
+ +
+ +   + + +
+
8    :update
+
+
+ +
+ +   + + +
+
 9  ]
+
+
+ +
+ +   + + +
+
10
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method name "emailExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • UncommunicativeMethodName - has the name 'emailExist' » reek
  • + +
+ +
+
+
11  def emailExist
+
+
+ +
+ +   + + +
+
12    if checkExist?(:email, params[:email])
+
+
+ +
+ +   + + +
+
13      render :text => '1'
+
+
+ +
+ +   + + +
+
14    else
+
+
+ +
+ +   + + +
+
15      render :text => '0'
+
+
+ +
+ +   + + +
+
16    end
+
+
+ +
+ +   + + +
+
17  end
+
+
+ +
+ +   + + +
+
18
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method name "usernameExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • UncommunicativeMethodName - has the name 'usernameExist' » reek
  • + +
+ +
+
+
19  def usernameExist
+
+
+ +
+ +   + + +
+
20    if checkExist?(:name, params[:username])
+
+
+ +
+ +   + + +
+
21      render :text => 'exist'
+
+
+ +
+ +   + + +
+
22    else
+
+
+ +
+ +   + + +
+
23      render :text => 'not exist'
+
+
+ +
+ +   + + +
+
24    end
+
+
+ +
+ +   + + +
+
25  end
+
+
+ +
+ +   + + +
+
26
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
27  def create
+
+
+ +
+ +   + + +
+
28    @user = User.new(user_params)
+
+
+ +
+ +   + + +
+
29    if @user.save
+
+
+ +
+ +   + + +
+
30      render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
31    else
+
+
+ +
+ +   + + +
+
32      render json: @user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
33    end
+
+
+ +
+ +   + + +
+
34  end
+
+
+ +
+ +   + + +
+
35
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
36  def update
+
+
+ +
+ +   + + +
+
37    @user = current_user
+
+
+ +
+ +   + + +
+
38    if @user.update(user_params)
+
+
+ +
+ +   + + +
+
39      render 'show'
+
+
+ +
+ +   + + +
+
40    else
+
+
+ +
+ +   + + +
+
41      render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
42    end
+
+
+ +
+ +   + + +
+
43  end
+
+
+ +
+ +   + + +
+
44
+
+
+ +
+ +   + + +
+
45  private
+
+
+ +
+ +
    + +
  • Complexity 1 » saikuro
  • + +
  • Method name "checkExist?" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • UtilityFunction - doesn't depend on instance state » reek
  • + +
  • UncommunicativeMethodName - has the name 'checkExist?' » reek
  • + +
+ +
+
+
46    def checkExist?(field_name, value)
+
+
+ +
+ +   + + +
+
47      User.exists?(field_name => value)
+
+
+ +
+ +   + + +
+
48    end
+
+
+ +
+ +   + + +
+
49
+
+
+ +
+ +
    + +
  • Complexity 1 » saikuro
  • + +
+ +
+
+
50    def user_params
+
+
+ +
+ +   + + +
+
51      params.require(:user).permit(:name,:password, :password_confirmation, :email, :phone)
+
+
+ +
+ +   + + +
+
52    end
+
+
+ +
+ +   + + +
+
53end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/2cda0c6171fa7d04989507a1dd112e.html b/reports/metric_fu/output/2cda0c6171fa7d04989507a1dd112e.html new file mode 100644 index 0000000..c006183 --- /dev/null +++ b/reports/metric_fu/output/2cda0c6171fa7d04989507a1dd112e.html @@ -0,0 +1,1343 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1# encoding: UTF-8
+
+
+ +
+ +   + + +
+
2# This file is auto-generated from the current state of the database. Instead
+
+
+ +
+ +   + + +
+
3# of editing this file, please use the migrations feature of Active Record to
+
+
+ +
+ +   + + +
+
4# incrementally modify your database, and then regenerate this schema definition.
+
+
+ +
+ +   + + +
+
5#
+
+
+ +
+ +   + + +
+
6# Note that this schema.rb definition is the authoritative source for your
+
+
+ +
+ +   + + +
+
7# database schema. If you need to create the application database on another
+
+
+ +
+ +   + + +
+
8# system, you should be using db:schema:load, not running all the migrations
+
+
+ +
+ +   + + +
+
 9# from scratch. The latter is a flawed and unsustainable approach (the more migrations
+
+
+ +
+ +   + + +
+
10# you'll amass, the slower it'll run and the greater likelihood for issues).
+
+
+ +
+ +   + + +
+
11#
+
+
+ +
+ +   + + +
+
12# It's strongly recommended that you check this file into your version control system.
+
+
+ +
+ +   + + +
+
13
+
+
+ +
+ +   + + +
+
14ActiveRecord::Schema.define(version: 20161229084919) do
+
+
+ +
+ +   + + +
+
15
+
+
+ +
+ +   + + +
+
16  create_table "comments", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
17    t.text     "content"
+
+
+ +
+ +   + + +
+
18    t.integer  "mission_id"
+
+
+ +
+ +   + + +
+
19    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
20    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
21    t.integer  "user_id"
+
+
+ +
+ +   + + +
+
22  end
+
+
+ +
+ +   + + +
+
23
+
+
+ +
+ +   + + +
+
24  add_index "comments", ["mission_id"], name: "index_comments_on_mission_id"
+
+
+ +
+ +   + + +
+
25
+
+
+ +
+ +   + + +
+
26  create_table "missions", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
27    t.string   "name"
+
+
+ +
+ +   + + +
+
28    t.datetime "deadline"
+
+
+ +
+ +   + + +
+
29    t.integer  "priority"
+
+
+ +
+ +   + + +
+
30    t.integer  "status"
+
+
+ +
+ +   + + +
+
31    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
32    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
33    t.string   "content"
+
+
+ +
+ +   + + +
+
34    t.integer  "project_id"
+
+
+ +
+ +   + + +
+
35  end
+
+
+ +
+ +   + + +
+
36
+
+
+ +
+ +   + + +
+
37  create_table "missions_users", id: false, force: :cascade do |t|
+
+
+ +
+ +   + + +
+
38    t.integer "mission_id"
+
+
+ +
+ +   + + +
+
39    t.integer "user_id"
+
+
+ +
+ +   + + +
+
40  end
+
+
+ +
+ +   + + +
+
41
+
+
+ +
+ +   + + +
+
42  create_table "notes", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
43    t.string   "content"
+
+
+ +
+ +   + + +
+
44    t.integer  "user_id"
+
+
+ +
+ +   + + +
+
45    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
46    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
47    t.integer  "project_id"
+
+
+ +
+ +   + + +
+
48    t.integer  "category"
+
+
+ +
+ +   + + +
+
49  end
+
+
+ +
+ +   + + +
+
50
+
+
+ +
+ +   + + +
+
51  add_index "notes", ["user_id"], name: "index_notes_on_user_id"
+
+
+ +
+ +   + + +
+
52
+
+
+ +
+ +   + + +
+
53  create_table "projects", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
54    t.string   "name"
+
+
+ +
+ +   + + +
+
55    t.string   "content"
+
+
+ +
+ +   + + +
+
56    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
57    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
58  end
+
+
+ +
+ +   + + +
+
59
+
+
+ +
+ +   + + +
+
60  create_table "projects_users", id: false, force: :cascade do |t|
+
+
+ +
+ +   + + +
+
61    t.integer "project_id"
+
+
+ +
+ +   + + +
+
62    t.integer "user_id"
+
+
+ +
+ +   + + +
+
63  end
+
+
+ +
+ +   + + +
+
64
+
+
+ +
+ +   + + +
+
65  create_table "shares", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
66    t.string   "content"
+
+
+ +
+ +   + + +
+
67    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
68    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
69    t.integer  "project_id"
+
+
+ +
+ +   + + +
+
70    t.integer  "user_id"
+
+
+ +
+ +   + + +
+
71  end
+
+
+ +
+ +   + + +
+
72
+
+
+ +
+ +   + + +
+
73  create_table "users", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
74    t.string   "name"
+
+
+ +
+ +   + + +
+
75    t.string   "password_digest"
+
+
+ +
+ +   + + +
+
76    t.string   "email"
+
+
+ +
+ +   + + +
+
77    t.datetime "created_at",      null: false
+
+
+ +
+ +   + + +
+
78    t.datetime "updated_at",      null: false
+
+
+ +
+ +   + + +
+
79    t.string   "phone"
+
+
+ +
+ +   + + +
+
80  end
+
+
+ +
+ +   + + +
+
81
+
+
+ +
+ +   + + +
+
82end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/336729fa1d697a94f8a10fcbe3204b.html b/reports/metric_fu/output/336729fa1d697a94f8a10fcbe3204b.html new file mode 100644 index 0000000..3c9a96d --- /dev/null +++ b/reports/metric_fu/output/336729fa1d697a94f8a10fcbe3204b.html @@ -0,0 +1,938 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class SharesController < ApplicationController
+
+
+ +
+ +   + + +
+
2   
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :create,
+
+
+ +
+ +   + + +
+
6        :getShareList
+
+
+ +
+ +   + + +
+
7    ]
+
+
+ +
+ +   + + +
+
8    #
+
+
+ +
+ +   + + +
+
 9   
+
+
+ +
+ +
    + +
  • Complexity 3 » saikuro
  • + +
  • TooManyStatements - has approx 11 statements » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'i' » reek
  • + +
+ +
+
+
10    def create
+
+
+ +
+ +   + + +
+
11        uid = session[:user_id].to_i
+
+
+ +
+ +   + + +
+
12        share=Share.new(share_params)
+
+
+ +
+ +   + + +
+
13        share.user_id=uid
+
+
+ +
+ +   + + +
+
14        if share.save
+
+
+ +
+ +   + + +
+
15            content = "<a>"+User.find(uid).name + "</a> "
+
+
+ +
+ +   + + +
+
16            pid=share.project_id
+
+
+ +
+ +   + + +
+
17            
+
+
+ +
+ +   + + +
+
18            Projects_user.where(:project_id => pid).each do |i|
+
+
+ +
+ +   + + +
+
19                params_note = {user_id: i.user_id,content: content,category: 1,project_id: pid}
+
+
+ +
+ +   + + +
+
20                note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
21                note.save!
+
+
+ +
+ +   + + +
+
22            end
+
+
+ +
+ +   + + +
+
23            render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
24        else
+
+
+ +
+ +   + + +
+
25            render json: project.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
26        end
+
+
+ +
+ +   + + +
+
27    end
+
+
+ +
+ +   + + +
+
28    
+
+
+ +
+ +   + + +
+
29    #
+
+
+ +
+ +   + + +
+
30    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method name "getShareList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • DuplicateMethodCall - calls i.content 2 times » reek
  • + +
  • TooManyStatements - has approx 7 statements » reek
  • + +
  • UncommunicativeMethodName - has the name 'getShareList' » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'i' » reek
  • + +
  • FeatureEnvy - refers to i more than self » reek
  • + +
+ +
+
+
31    def getShareList
+
+
+ +
+ +   + + +
+
32    #Todo
+
+
+ +
+ +   + + +
+
33    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
34    
+
+
+ +
+ +   + + +
+
35    data = []
+
+
+ +
+ +   + + +
+
36    Share.where(:project_id => pid).order("created_at desc").each do |i|
+
+
+ +
+ +   + + +
+
37        puts i.content
+
+
+ +
+ +   + + +
+
38        name = User.find(i.user_id).name
+
+
+ +
+ +   + + +
+
39        data += [{
+
+
+ +
+ +   + + +
+
40            :name => name,
+
+
+ +
+ +   + + +
+
41            :time => i.created_at,
+
+
+ +
+ +   + + +
+
42            :content => i.content
+
+
+ +
+ +   + + +
+
43        }]
+
+
+ +
+ +   + + +
+
44    end
+
+
+ +
+ +   + + +
+
45    render :json => {
+
+
+ +
+ +   + + +
+
46        :code => 0,
+
+
+ +
+ +   + + +
+
47        :data => data
+
+
+ +
+ +   + + +
+
48    }
+
+
+ +
+ +   + + +
+
49    end
+
+
+ +
+ +   + + +
+
50
+
+
+ +
+ +   + + +
+
51    private
+
+
+ +
+ +
    + +
  • Complexity 1 » saikuro
  • + +
+ +
+
+
52        def share_params
+
+
+ +
+ +   + + +
+
53          params.require(:share).permit(:project_id,:content)
+
+
+ +
+ +   + + +
+
54        end
+
+
+ +
+ +   + + +
+
55end
+
+ +
+ + diff --git a/reports/metric_fu/output/35561829cbd17d96aac6104bfe4e41.html b/reports/metric_fu/output/35561829cbd17d96aac6104bfe4e41.html new file mode 100644 index 0000000..b012eb4 --- /dev/null +++ b/reports/metric_fu/output/35561829cbd17d96aac6104bfe4e41.html @@ -0,0 +1,495 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class SessionsController < ApplicationController
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3  # 
+
+
+ +
+ +   + + +
+
4  before_action :authenticate, except: [ :create ]
+
+
+ +
+ +   + + +
+
5  skip_before_action :verify_authenticity_token, :only => [:create,:destroy,:show]
+
+
+ +
+ +   + + +
+
6
+
+
+ +
+ +   + + +
+
7  
+
+
+ +
+ +   + + +
+
8  # 
+
+
+ +
+ +   + + +
+
 9  
+
+
+ +
+ +   + + +
+
10  def create
+
+
+ +
+ +   + + +
+
11    user = User.find_by(email: params[:email])
+
+
+ +
+ +   + + +
+
12    if user && user.authenticate(params[:password])
+
+
+ +
+ +   + + +
+
13      session[:user_id] = user.id
+
+
+ +
+ +   + + +
+
14      render status: :ok, text: 'ok'
+
+
+ +
+ +   + + +
+
15    else
+
+
+ +
+ +   + + +
+
16      render status: :unauthorized, text: 'account or password is not correct'
+
+
+ +
+ +   + + +
+
17    end
+
+
+ +
+ +   + + +
+
18  end
+
+
+ +
+ +   + + +
+
19
+
+
+ +
+ +   + + +
+
20  def destroy
+
+
+ +
+ +   + + +
+
21    session.delete :user_id
+
+
+ +
+ +   + + +
+
22    @current_user &&= nil
+
+
+ +
+ +   + + +
+
23    render status: :ok, nothing: true
+
+
+ +
+ +   + + +
+
24  end
+
+
+ +
+ +   + + +
+
25
+
+
+ +
+ +   + + +
+
26  def show
+
+
+ +
+ +   + + +
+
27    render 'show'
+
+
+ +
+ +   + + +
+
28  end
+
+
+ +
+ +   + + +
+
29end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/3c949a9cef12a5b36b0ed70b82e018.html b/reports/metric_fu/output/3c949a9cef12a5b36b0ed70b82e018.html new file mode 100644 index 0000000..fc4e7d6 --- /dev/null +++ b/reports/metric_fu/output/3c949a9cef12a5b36b0ed70b82e018.html @@ -0,0 +1,275 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Project < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2  has_and_belongs_to_many :users
+
+
+ +
+ +   + + +
+
3
+
+
+ +
+ +   + + +
+
4  validate :require_at_least_on_user,on: :update # 
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
5  
+
+
+ +
+ +   + + +
+
6  validates :name, presence: true, length: { minimum: 1, maximum: 50 }, uniqueness: true
+
+
+ +
+ +   + + +
+
7
+
+
+ +
+ +   + + +
+
8  private
+
+
+ +
+ +   + + +
+
 9
+
+
+ +
+ +   + + +
+
10    def  require_at_least_on_user
+
+
+ +
+ +   + + +
+
11      if !users || users.size == 0  # size
+
+
+ +
+ +   + + +
+
12        errors[:users] = 'at least one user in the project'
+
+
+ +
+ +   + + +
+
13      end
+
+
+ +
+ +   + + +
+
14    end
+
+
+ +
+ +   + + +
+
15end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/479de84fe6df2ab07a531646b3fe83.html b/reports/metric_fu/output/479de84fe6df2ab07a531646b3fe83.html new file mode 100644 index 0000000..1a52e14 --- /dev/null +++ b/reports/metric_fu/output/479de84fe6df2ab07a531646b3fe83.html @@ -0,0 +1,2510 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class MissionsController < ApplicationController
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :create,
+
+
+ +
+ +   + + +
+
6        :getlist,
+
+
+ +
+ +   + + +
+
7        :detail,
+
+
+ +
+ +   + + +
+
8        :update,
+
+
+ +
+ +   + + +
+
 9        :commentPublish
+
+
+ +
+ +   + + +
+
10    ]
+
+
+ +
+ +   + + +
+
11    #======================================>
+
+
+ +
+ +   + + +
+
12    
+
+
+ +
+ +   + + +
+
13    def getlist
+
+
+ +
+ +   + + +
+
14    #Todo
+
+
+ +
+ +   + + +
+
15    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
16    stu = params[:status_type]
+
+
+ +
+ +   + + +
+
17    #missions = []
+
+
+ +
+ +   + + +
+
18    details = []
+
+
+ +
+ +   + + +
+
19    missions = Mission.where("project_id = ? AND status = ?",pid,stu).all
+
+
+ +
+ +   + + +
+
20    
+
+
+ +
+ +   + + +
+
21    missions.each do |mission|
+
+
+ +
+ +   + + +
+
22        
+
+
+ +
+ +   + + +
+
23        #puts mission.inspect
+
+
+ +
+ +   + + +
+
24        
+
+
+ +
+ +   + + +
+
25        details += [{
+
+
+ +
+ +   + + +
+
26            :id => mission.id,
+
+
+ +
+ +   + + +
+
27            :name => mission.name,
+
+
+ +
+ +   + + +
+
28            :content => mission.content
+
+
+ +
+ +   + + +
+
29        }]
+
+
+ +
+ +   + + +
+
30        
+
+
+ +
+ +   + + +
+
31    end
+
+
+ +
+ +   + + +
+
32    
+
+
+ +
+ +   + + +
+
33    # Mission.where(:project_id => pid).where(:status => stu) do |i|
+
+
+ +
+ +   + + +
+
34    #     missions += [{
+
+
+ +
+ +   + + +
+
35    #         :id => i.id,
+
+
+ +
+ +   + + +
+
36    #         :name => i.name,
+
+
+ +
+ +   + + +
+
37    #         :content => i.content
+
+
+ +
+ +   + + +
+
38    #     }]
+
+
+ +
+ +   + + +
+
39    # end
+
+
+ +
+ +   + + +
+
40    render :json => {
+
+
+ +
+ +   + + +
+
41        :code => 0,
+
+
+ +
+ +   + + +
+
42        :data => missions
+
+
+ +
+ +   + + +
+
43    }
+
+
+ +
+ +   + + +
+
44    end
+
+
+ +
+ +   + + +
+
45    
+
+
+ +
+ +   + + +
+
46    #======================================>
+
+
+ +
+ +   + + +
+
47    
+
+
+ +
+ +
    + +
  • move model logic into model (mission use_count > 4) » rails_best_practices
  • + +
+ +
+
+
48    def detail
+
+
+ +
+ +   + + +
+
49    #Todo
+
+
+ +
+ +   + + +
+
50    username = []
+
+
+ +
+ +   + + +
+
51    comments_s = []
+
+
+ +
+ +   + + +
+
52    mission_id = params[:id]
+
+
+ +
+ +   + + +
+
53    mission = Mission.find_by(id: mission_id)
+
+
+ +
+ +   + + +
+
54    m_us = Missions_user.where("mission_id = ?",mission_id).all
+
+
+ +
+ +   + + +
+
55    #puts m_us.inspect
+
+
+ +
+ +   + + +
+
56    m_us.each do |m_u|
+
+
+ +
+ +   + + +
+
57        user_id = m_u.user_id
+
+
+ +
+ +   + + +
+
58        user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
59        #puts user.inspect
+
+
+ +
+ +   + + +
+
60        username << user.name
+
+
+ +
+ +   + + +
+
61    end
+
+
+ +
+ +   + + +
+
62    comments = Comment.where("mission_id = ?",mission_id).all
+
+
+ +
+ +   + + +
+
63    comments.each do |c|
+
+
+ +
+ +   + + +
+
64        uname = User.find_by(id: c.user_id).name
+
+
+ +
+ +   + + +
+
65        comments_s += [{
+
+
+ +
+ +   + + +
+
66            :nickname => uname,
+
+
+ +
+ +   + + +
+
67            :content => c.content,
+
+
+ +
+ +   + + +
+
68            :time => c.created_at
+
+
+ +
+ +   + + +
+
69        }]
+
+
+ +
+ +   + + +
+
70    end
+
+
+ +
+ +   + + +
+
71    #puts comments_s.inspect
+
+
+ +
+ +   + + +
+
72    render :json => {
+
+
+ +
+ +   + + +
+
73        :code => 0,
+
+
+ +
+ +   + + +
+
74        :data => {
+
+
+ +
+ +   + + +
+
75            :name => mission.name,
+
+
+ +
+ +   + + +
+
76            :content => mission.content,
+
+
+ +
+ +   + + +
+
77            :priority => mission.priority,
+
+
+ +
+ +   + + +
+
78            :status => mission.status,
+
+
+ +
+ +   + + +
+
79            :deadline => mission.deadline,
+
+
+ +
+ +   + + +
+
80            :users => username,
+
+
+ +
+ +   + + +
+
81            :comments => comments_s
+
+
+ +
+ +   + + +
+
82        }
+
+
+ +
+ +   + + +
+
83    }
+
+
+ +
+ +   + + +
+
84    end
+
+
+ +
+ +   + + +
+
85     #======================================>
+
+
+ +
+ +   + + +
+
86    
+
+
+ +
+ +
    + +
  • move model logic into model (mission use_count > 4) » rails_best_practices
  • + +
+ +
+
+
87    def create
+
+
+ +
+ +   + + +
+
88    #Todo
+
+
+ +
+ +   + + +
+
89    params_mission = {name: params[:name],project_id: params[:project_id],content: params[:content],deadline: params[:deadline],priority: params[:priority],status: params[:status]}
+
+
+ +
+ +   + + +
+
90    mission = Mission.new(params_mission)
+
+
+ +
+ +   + + +
+
91    if mission.save
+
+
+ +
+ +   + + +
+
92        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
93    else
+
+
+ +
+ +   + + +
+
94        render json: mission.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
95    end
+
+
+ +
+ +   + + +
+
96    userids = params[:users]
+
+
+ +
+ +   + + +
+
97    userids.each do |id|
+
+
+ +
+ +   + + +
+
98        user_enties = User.find_by(id: id)
+
+
+ +
+ +   + + +
+
 99        #puts user_enties.inspect
+
+
+ +
+ +   + + +
+
100        params_mu = {mission_id: mission.id,user_id: user_enties.id}
+
+
+ +
+ +   + + +
+
101        missions_user = Missions_user.new(params_mu)
+
+
+ +
+ +   + + +
+
102        missions_user.save
+
+
+ +
+ +   + + +
+
103        content = " <a>"+mission.name+"</a>"
+
+
+ +
+ +   + + +
+
104        
+
+
+ +
+ +   + + +
+
105        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
+
+
+ +
+ +   + + +
+
106        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
107        note.save
+
+
+ +
+ +   + + +
+
108    end
+
+
+ +
+ +   + + +
+
109    end
+
+
+ +
+ +   + + +
+
110    
+
+
+ +
+ +   + + +
+
111    #======================================>
+
+
+ +
+ +   + + +
+
112    
+
+
+ +
+ +
    + +
  • move model logic into model (mission use_count > 4) » rails_best_practices
  • + +
+ +
+
+
113    def update
+
+
+ +
+ +   + + +
+
114    #Todo
+
+
+ +
+ +   + + +
+
115    
+
+
+ +
+ +   + + +
+
116    id = params[:id]
+
+
+ +
+ +   + + +
+
117    #now = Datetime.now
+
+
+ +
+ +   + + +
+
118    mission = Mission.find_by(id: id)
+
+
+ +
+ +   + + +
+
119    params_mission = {name: params[:name],content: params[:content],deadline: params[:deadline],priority: params[:priority]}
+
+
+ +
+ +   + + +
+
120    #puts params_mission
+
+
+ +
+ +   + + +
+
121    mission.update(params_mission)
+
+
+ +
+ +   + + +
+
122    mission.save
+
+
+ +
+ +   + + +
+
123    Missions_user.delete_all(["mission_id = ?",id])
+
+
+ +
+ +   + + +
+
124    userids = params[:users]
+
+
+ +
+ +   + + +
+
125    userids.each do |name|
+
+
+ +
+ +   + + +
+
126        user_enties = User.find_by(id: id)
+
+
+ +
+ +   + + +
+
127        params = {mission_id: id,user_id: user_enties.id}
+
+
+ +
+ +   + + +
+
128        missions_user = Missions_user.new(params)
+
+
+ +
+ +   + + +
+
129        missions_user.save
+
+
+ +
+ +   + + +
+
130        content = "<a>"+mission.name + "</a> "
+
+
+ +
+ +   + + +
+
131        
+
+
+ +
+ +   + + +
+
132        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
+
+
+ +
+ +   + + +
+
133        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
134        note.save
+
+
+ +
+ +   + + +
+
135    end
+
+
+ +
+ +   + + +
+
136    render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
137    end
+
+
+ +
+ +   + + +
+
138    
+
+
+ +
+ +   + + +
+
139    #======================================>
+
+
+ +
+ +   + + +
+
140    
+
+
+ +
+ +   + + +
+
141    def commentPublish
+
+
+ +
+ +   + + +
+
142    #Todo
+
+
+ +
+ +   + + +
+
143    mission_id = params[:mission_id]
+
+
+ +
+ +   + + +
+
144    content = params[:content]
+
+
+ +
+ +   + + +
+
145    user_id = session[:user_id]
+
+
+ +
+ +   + + +
+
146    params = {content: content, mission_id: mission_id, user_id: user_id}
+
+
+ +
+ +   + + +
+
147    comment = Comment.new(params)
+
+
+ +
+ +   + + +
+
148    if comment.save
+
+
+ +
+ +   + + +
+
149        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
150    else
+
+
+ +
+ +   + + +
+
151        render json: mission.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
152    end
+
+
+ +
+ +   + + +
+
153    end
+
+
+ +
+ +   + + +
+
154end
+
+ +
+ + diff --git a/reports/metric_fu/output/49a7b37ff5a3322cd08801bd9db830.html b/reports/metric_fu/output/49a7b37ff5a3322cd08801bd9db830.html new file mode 100644 index 0000000..d5ca907 --- /dev/null +++ b/reports/metric_fu/output/49a7b37ff5a3322cd08801bd9db830.html @@ -0,0 +1,2486 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class ProjectsController < ApplicationController
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :index,
+
+
+ +
+ +   + + +
+
6        :create,
+
+
+ +
+ +   + + +
+
7        :addUsers,
+
+
+ +
+ +   + + +
+
8        :detail,
+
+
+ +
+ +   + + +
+
 9        :update,
+
+
+ +
+ +   + + +
+
10        :deleteUsers
+
+
+ +
+ +   + + +
+
11    ]
+
+
+ +
+ +   + + +
+
12    
+
+
+ +
+ +   + + +
+
13    #=============================================>user_idsession.
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • TooManyStatements - has approx 10 statements » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'i' » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'p' » reek
  • + +
+ +
+
+
14    def index
+
+
+ +
+ +   + + +
+
15    #Todo
+
+
+ +
+ +   + + +
+
16    uid = session[:user_id]
+
+
+ +
+ +   + + +
+
17    data=[]
+
+
+ +
+ +   + + +
+
18    Projects_user.where(:user_id => uid).each do |i|
+
+
+ +
+ +   + + +
+
19        pid=i.project_id
+
+
+ +
+ +   + + +
+
20        p=Project.find_by(id:pid)
+
+
+ +
+ +   + + +
+
21        mc = Mission.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
22        uc = Projects_user.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
23        sc = Share.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
24        data+=[{
+
+
+ +
+ +   + + +
+
25            :id => pid,
+
+
+ +
+ +   + + +
+
26            :name => p.name,
+
+
+ +
+ +   + + +
+
27            :content => p.content,
+
+
+ +
+ +   + + +
+
28            :mission_count => mc,
+
+
+ +
+ +   + + +
+
29            :users_count => uc,
+
+
+ +
+ +   + + +
+
30            :shares_count => sc
+
+
+ +
+ +   + + +
+
31        }]
+
+
+ +
+ +   + + +
+
32    end
+
+
+ +
+ +   + + +
+
33    render :json => {
+
+
+ +
+ +   + + +
+
34        :code => 0,
+
+
+ +
+ +   + + +
+
35        :data => data
+
+
+ +
+ +   + + +
+
36    }
+
+
+ +
+ +   + + +
+
37    end
+
+
+ +
+ +   + + +
+
38    
+
+
+ +
+ +   + + +
+
39    #=============================================>
+
+
+ +
+ +   + + +
+
40    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
41    def create
+
+
+ +
+ +   + + +
+
42        uid = session[:user_id]
+
+
+ +
+ +   + + +
+
43        project = Project.new(project_params)
+
+
+ +
+ +   + + +
+
44        if project.save
+
+
+ +
+ +   + + +
+
45            Projects_user.create(project_id:project.id,user_id:uid)
+
+
+ +
+ +   + + +
+
46            render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
47        else
+
+
+ +
+ +   + + +
+
48            render json: project.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
49        end
+
+
+ +
+ +   + + +
+
50     end
+
+
+ +
+ +   + + +
+
51    
+
+
+ +
+ +   + + +
+
52    
+
+
+ +
+ +   + + +
+
53    #=============================================>
+
+
+ +
+ +   + + +
+
54    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method name "addUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • TooManyStatements - has approx 14 statements » reek
  • + +
  • UncommunicativeMethodName - has the name 'addUsers' » reek
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
55    def addUsers
+
+
+ +
+ +   + + +
+
56        uid = User.find_by(email:params[:email]).id# 
+
+
+ +
+ +   + + +
+
57        register = session[:user_id]# 
+
+
+ +
+ +   + + +
+
58        pid = params[:project_id]
+
+
+ +
+ +   + + +
+
59        # 
+
+
+ +
+ +   + + +
+
60        pu_exist=Projects_user.find_by(project_id:pid,user_id:uid)
+
+
+ +
+ +   + + +
+
61        if pu_exist.nil?# 
+
+
+ +
+ +   + + +
+
62            params_pu = {project_id: pid,user_id: uid}
+
+
+ +
+ +   + + +
+
63            pu = Projects_user.new(params_pu)
+
+
+ +
+ +   + + +
+
64            pu.save
+
+
+ +
+ +   + + +
+
65            
+
+
+ +
+ +   + + +
+
66            content = "<a>"+User.find_by(id: register).name + "</a>  <a>" + Project.find_by(id: pid).name+"</a>"
+
+
+ +
+ +   + + +
+
67            puts content
+
+
+ +
+ +   + + +
+
68            params_note = {user_id: uid,content: content,category: 2,project_id: pid}
+
+
+ +
+ +   + + +
+
69            note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
70            note.save!
+
+
+ +
+ +   + + +
+
71            render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
72        else# 
+
+
+ +
+ +   + + +
+
73            render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
74        end
+
+
+ +
+ +   + + +
+
75    end
+
+
+ +
+ +   + + +
+
76    
+
+
+ +
+ +   + + +
+
77    #=============================================>
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method name "deleteUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • TooManyStatements - has approx 14 statements » reek
  • + +
  • UncommunicativeMethodName - has the name 'deleteUsers' » reek
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
78    def deleteUsers
+
+
+ +
+ +   + + +
+
79        uid = params[:user_id]# 
+
+
+ +
+ +   + + +
+
80        register = session[:user_id]# 
+
+
+ +
+ +   + + +
+
81        pid = params[:project_id]
+
+
+ +
+ +   + + +
+
82        # 
+
+
+ +
+ +   + + +
+
83        projects_user=Projects_user.find_by(project_id:pid,user_id:uid)
+
+
+ +
+ +   + + +
+
84        if projects_user.nil?# 
+
+
+ +
+ +   + + +
+
85            render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
86        end
+
+
+ +
+ +   + + +
+
87        # 
+
+
+ +
+ +   + + +
+
88        puts projects_user.user_id
+
+
+ +
+ +   + + +
+
89        puts projects_user.project_id
+
+
+ +
+ +   + + +
+
90        Projects_user.where(project_id:pid,user_id:uid).delete_all
+
+
+ +
+ +   + + +
+
91            
+
+
+ +
+ +   + + +
+
92        content ="<a>"+ User.find_by(id: register).name + "</a>  <a>" + Project.find_by(id: pid).name+"</a> "
+
+
+ +
+ +   + + +
+
93        puts content
+
+
+ +
+ +   + + +
+
94        params_note = {user_id: uid,content: content,category: 2,project_id: pid}
+
+
+ +
+ +   + + +
+
95        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
96        note.save!
+
+
+ +
+ +   + + +
+
97            
+
+
+ +
+ +   + + +
+
98        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
 99    end
+
+
+ +
+ +   + + +
+
100    
+
+
+ +
+ +   + + +
+
101    #=============================================>
+
+
+ +
+ +   + + +
+
102    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method "detail" has 23 lines. It should have 20 or less. » roodi
  • + +
  • TooManyStatements - has approx 9 statements » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'i' » reek
  • + +
+ +
+
+
103    def detail
+
+
+ +
+ +   + + +
+
104        #Todo    
+
+
+ +
+ +   + + +
+
105        pid = params[:id]
+
+
+ +
+ +   + + +
+
106        project = Project.find_by(id: pid)
+
+
+ +
+ +   + + +
+
107        #uid = Projects_user.where(:project_id => pid)
+
+
+ +
+ +   + + +
+
108        users = []
+
+
+ +
+ +   + + +
+
109        projects_users = Projects_user.where("project_id = ?",pid).all
+
+
+ +
+ +   + + +
+
110        
+
+
+ +
+ +   + + +
+
111        projects_users.each do |projects_user|
+
+
+ +
+ +   + + +
+
112            uid = projects_user.user_id
+
+
+ +
+ +   + + +
+
113            i = User.find_by(id: uid)
+
+
+ +
+ +   + + +
+
114            users += [{
+
+
+ +
+ +   + + +
+
115                :name => i.name,
+
+
+ +
+ +   + + +
+
116                :id => i.id
+
+
+ +
+ +   + + +
+
117            }]
+
+
+ +
+ +   + + +
+
118        end
+
+
+ +
+ +   + + +
+
119        #puts users.inspect 
+
+
+ +
+ +   + + +
+
120        # Users.find(uid).each do |i|
+
+
+ +
+ +   + + +
+
121        #     users += [{
+
+
+ +
+ +   + + +
+
122        #         :nickname => i.name,
+
+
+ +
+ +   + + +
+
123        #         :id => i.id
+
+
+ +
+ +   + + +
+
124        #     }]
+
+
+ +
+ +   + + +
+
125        # end
+
+
+ +
+ +   + + +
+
126        render :json => {
+
+
+ +
+ +   + + +
+
127            :code => 0,
+
+
+ +
+ +   + + +
+
128            :data => {
+
+
+ +
+ +   + + +
+
129                :name => project.name,
+
+
+ +
+ +   + + +
+
130                :content => project.content,
+
+
+ +
+ +   + + +
+
131                :users => users
+
+
+ +
+ +   + + +
+
132            }
+
+
+ +
+ +   + + +
+
133        }
+
+
+ +
+ +   + + +
+
134    end
+
+
+ +
+ +   + + +
+
135    
+
+
+ +
+ +   + + +
+
136    #=============================================>
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
137    def update
+
+
+ +
+ +   + + +
+
138        project = Project.find_by(:id => params[:project][:id])
+
+
+ +
+ +   + + +
+
139        if project.update(project_params)
+
+
+ +
+ +   + + +
+
140            render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
141        else
+
+
+ +
+ +   + + +
+
142          render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
143        end
+
+
+ +
+ +   + + +
+
144    end
+
+
+ +
+ +   + + +
+
145    
+
+
+ +
+ +   + + +
+
146    private
+
+
+ +
+ +
    + +
  • Complexity 1 » saikuro
  • + +
+ +
+
+
147        def project_params
+
+
+ +
+ +   + + +
+
148          params.require(:project).permit(:name,:content,:id)
+
+
+ +
+ +   + + +
+
149        end
+
+
+ +
+ +   + + +
+
150end
+
+ +
+ + diff --git a/reports/metric_fu/output/4a4e4e8e815ed295b3675d506899fa.html b/reports/metric_fu/output/4a4e4e8e815ed295b3675d506899fa.html new file mode 100644 index 0000000..672b00a --- /dev/null +++ b/reports/metric_fu/output/4a4e4e8e815ed295b3675d506899fa.html @@ -0,0 +1,627 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1require File.expand_path('../boot', __FILE__)
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3require 'rails/all'
+
+
+ +
+ +   + + +
+
4
+
+
+ +
+ +   + + +
+
5# Require the gems listed in Gemfile, including any gems
+
+
+ +
+ +   + + +
+
6# you've limited to :test, :development, or :production.
+
+
+ +
+ +   + + +
+
7Bundler.require(*Rails.groups)
+
+
+ +
+ +   + + +
+
8
+
+
+ +
+ +   + + +
+
 9module Workspace
+
+
+ +
+ +   + + +
+
10  class Application < Rails::Application
+
+
+ +
+ +   + + +
+
11    # Settings in config/environments/* take precedence over those specified here.
+
+
+ +
+ +   + + +
+
12    # Application configuration should go into files in config/initializers
+
+
+ +
+ +   + + +
+
13    # -- all .rb files in that directory are automatically loaded.
+
+
+ +
+ +   + + +
+
14
+
+
+ +
+ +   + + +
+
15    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
+
+
+ +
+ +   + + +
+
16    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
+
+
+ +
+ +   + + +
+
17    # config.i18n.default_locale = :de
+
+
+ +
+ +   + + +
+
18
+
+
+ +
+ +   + + +
+
19    # Do not swallow errors in after_commit/after_rollback callbacks.
+
+
+ +
+ +   + + +
+
20    config.active_record.raise_in_transactional_callbacks = true
+
+
+ +
+ +   + + +
+
21
+
+
+ +
+ +   + + +
+
22    # 
+
+
+ +
+ +   + + +
+
23    config.time_zone = 'Beijing'
+
+
+ +
+ +   + + +
+
24    config.active_record.default_timezone = :local
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
25    
+
+
+ +
+ +   + + +
+
26    config.generators do |g|
+
+
+ +
+ +   + + +
+
27        g.test_framework :rspec,
+
+
+ +
+ +   + + +
+
28            fixtures: true,         #
+
+
+ +
+ +   + + +
+
29            view_specs: false,      #
+
+
+ +
+ +   + + +
+
30            helper_specs: false,    #
+
+
+ +
+ +   + + +
+
31            routing_specs: false,   # config/routes.rb 
+
+
+ +
+ +   + + +
+
32            controller_specs: true, #controller
+
+
+ +
+ +   + + +
+
33            request_specs: false
+
+
+ +
+ +   + + +
+
34        g.fixture_replacement :factory_girl, dir: "spec/factories"
+
+
+ +
+ +   + + +
+
35    end
+
+
+ +
+ +   + + +
+
36  end
+
+
+ +
+ +   + + +
+
37end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/4ed0c03b53dbc8320da88e78874655.html b/reports/metric_fu/output/4ed0c03b53dbc8320da88e78874655.html new file mode 100644 index 0000000..db82daf --- /dev/null +++ b/reports/metric_fu/output/4ed0c03b53dbc8320da88e78874655.html @@ -0,0 +1,271 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class User < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2  has_and_belongs_to_many :projects
+
+
+ +
+ +   + + +
+
3  has_and_belongs_to_many :missions
+
+
+ +
+ +   + + +
+
4
+
+
+ +
+ +   + + +
+
5  has_many :notes
+
+
+ +
+ +   + + +
+
6
+
+
+ +
+ +   + + +
+
7  has_secure_password  # password_confirmpasswordpassword
+
+
+ +
+ +   + + +
+
8
+
+
+ +
+ +   + + +
+
 9  validates :name, presence: true, length: { maximum: 30 }
+
+
+ +
+ +   + + +
+
10  validates :email, presence: true, uniqueness: true, length: { maximum: 50},
+
+
+ +
+ +   + + +
+
11           format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i }
+
+
+ +
+ +   + + +
+
12  validates :password, length: { minimum: 6 },on:create
+
+
+ +
+ +   + + +
+
13  validates :phone, presence: true, format: { with: /\A[0-9]{11,11}\Z/i },
+
+
+ +
+ +   + + +
+
14      multiline: false
+
+
+ +
+ +   + + +
+
15end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/586fb7c4e1add2d4d24e27566ed706.html b/reports/metric_fu/output/586fb7c4e1add2d4d24e27566ed706.html new file mode 100644 index 0000000..aacf77d --- /dev/null +++ b/reports/metric_fu/output/586fb7c4e1add2d4d24e27566ed706.html @@ -0,0 +1,648 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class NotesController < ApplicationController
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    #
+
+
+ +
+ +   + + +
+
6    
+
+
+ +
+ +
    + +
  • Complexity 4 » saikuro
  • + +
  • Method "getNotesList" has 24 lines. It should have 20 or less. » roodi
  • + +
  • Method name "getNotesList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • DuplicateMethodCall - calls n.created_at 2 times » reek
  • + +
  • DuplicateMethodCall - calls n.created_at.to_s 2 times » reek
  • + +
  • TooManyStatements - has approx 13 statements » reek
  • + +
  • UncommunicativeMethodName - has the name 'getNotesList' » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'h' » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'k' » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'n' » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'v' » reek
  • + +
  • FeatureEnvy - refers to n more than self » reek
  • + +
+ +
+
+
7    def getNotesList
+
+
+ +
+ +   + + +
+
8    #Todo
+
+
+ +
+ +   + + +
+
 9    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
10    uid = session[:user_id]
+
+
+ +
+ +   + + +
+
11    notes = Note.where("user_id = ? AND project_id = ? ",uid,pid).order("created_at desc").all
+
+
+ +
+ +   + + +
+
12    note = Hash.new do |h,k|
+
+
+ +
+ +   + + +
+
13            h[k] = []
+
+
+ +
+ +   + + +
+
14    end
+
+
+ +
+ +   + + +
+
15    notes.each do |n|
+
+
+ +
+ +   + + +
+
16        date =  n.created_at.to_s[/([\d\-]*)\s(.*)/,1]
+
+
+ +
+ +   + + +
+
17        time =  n.created_at.to_s[/(.*)\s([\d\:]*)/,2]
+
+
+ +
+ +   + + +
+
18        note[date] << {
+
+
+ +
+ +   + + +
+
19            :content => n.content,
+
+
+ +
+ +   + + +
+
20            :time => time,
+
+
+ +
+ +   + + +
+
21            :type => n.category
+
+
+ +
+ +   + + +
+
22        }
+
+
+ +
+ +   + + +
+
23    end
+
+
+ +
+ +   + + +
+
24    data = []
+
+
+ +
+ +   + + +
+
25    note.each do |k,v|
+
+
+ +
+ +   + + +
+
26        data += [{
+
+
+ +
+ +   + + +
+
27            :time => k,
+
+
+ +
+ +   + + +
+
28            :notes => v
+
+
+ +
+ +   + + +
+
29        }]
+
+
+ +
+ +   + + +
+
30    end
+
+
+ +
+ +   + + +
+
31    render :json => {
+
+
+ +
+ +   + + +
+
32        :code => 0,
+
+
+ +
+ +   + + +
+
33        :data => data
+
+
+ +
+ +   + + +
+
34    }
+
+
+ +
+ +   + + +
+
35    end
+
+
+ +
+ +   + + +
+
36    
+
+
+ +
+ +   + + +
+
37end
+
+ +
+ + diff --git a/reports/metric_fu/output/59459d8ae6eb34ed02b9dd3b6d4020.html b/reports/metric_fu/output/59459d8ae6eb34ed02b9dd3b6d4020.html new file mode 100644 index 0000000..5b879a1 --- /dev/null +++ b/reports/metric_fu/output/59459d8ae6eb34ed02b9dd3b6d4020.html @@ -0,0 +1,63 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + +
+ +   + + +
+
1module SessionsHelper
+
+
+ +
+ +   + + +
+
2end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/5af42da2f5d83e170fdde3782f6933.html b/reports/metric_fu/output/5af42da2f5d83e170fdde3782f6933.html new file mode 100644 index 0000000..1e8be51 --- /dev/null +++ b/reports/metric_fu/output/5af42da2f5d83e170fdde3782f6933.html @@ -0,0 +1,67 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + +
+ +
    + +
  • remove empty helpers » rails_best_practices
  • + +
+ +
+
+
1module UsersHelper
+
+
+ +
+ +   + + +
+
2end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/62e9dd18e626544eade9ed0b20dc35.html b/reports/metric_fu/output/62e9dd18e626544eade9ed0b20dc35.html new file mode 100644 index 0000000..6a0e14b --- /dev/null +++ b/reports/metric_fu/output/62e9dd18e626544eade9ed0b20dc35.html @@ -0,0 +1,834 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Note < ActiveRecord:: Base
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2    
+
+
+ +
+ +   + + +
+
3    belongs_to :user
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :content, presence: true
+
+
+ +
+ +   + + +
+
6    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
7    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
8    validates :category, presence: true
+
+
+ +
+ +   + + +
+
 9    
+
+
+ +
+ +   + + +
+
10    validate :note_has_atleast_one_character
+
+
+ +
+ +   + + +
+
11    validate :note_category_should_among_valid_values
+
+
+ +
+ +   + + +
+
12    validate :user_exist, on: :create
+
+
+ +
+ +   + + +
+
13    validate :project_exist, on: :create
+
+
+ +
+ +   + + +
+
14    
+
+
+ +
+ +   + + +
+
15    
+
+
+ +
+ +   + + +
+
16    private 
+
+
+ +
+ +   + + +
+
17        def note_has_atleast_one_character
+
+
+ +
+ +   + + +
+
18            tmp = content.strip
+
+
+ +
+ +   + + +
+
19            if tmp.length < 1
+
+
+ +
+ +   + + +
+
20                errors[:content] = "note content should has at least one character"
+
+
+ +
+ +   + + +
+
21            end
+
+
+ +
+ +   + + +
+
22        end
+
+
+ +
+ +   + + +
+
23        
+
+
+ +
+ +   + + +
+
24        def note_category_should_among_valid_values
+
+
+ +
+ +   + + +
+
25            
+
+
+ +
+ +   + + +
+
26            if category != 1 and category != 2 and category !=3
+
+
+ +
+ +   + + +
+
27                errors[:category] = "note category is not among valid values"
+
+
+ +
+ +   + + +
+
28            end
+
+
+ +
+ +   + + +
+
29            
+
+
+ +
+ +   + + +
+
30        end
+
+
+ +
+ +   + + +
+
31        
+
+
+ +
+ +   + + +
+
32        def user_exist
+
+
+ +
+ +   + + +
+
33        
+
+
+ +
+ +   + + +
+
34            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
35            if user == nil
+
+
+ +
+ +   + + +
+
36                errors[:user] = "user belong to Note is not exist"
+
+
+ +
+ +   + + +
+
37            end
+
+
+ +
+ +   + + +
+
38            
+
+
+ +
+ +   + + +
+
39        end
+
+
+ +
+ +   + + +
+
40        
+
+
+ +
+ +   + + +
+
41        def project_exist
+
+
+ +
+ +   + + +
+
42            
+
+
+ +
+ +   + + +
+
43            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
44            if project == nil
+
+
+ +
+ +   + + +
+
45                errors[:project] = "project should be exist"
+
+
+ +
+ +   + + +
+
46            end
+
+
+ +
+ +   + + +
+
47             
+
+
+ +
+ +   + + +
+
48        end
+
+
+ +
+ +   + + +
+
49    
+
+
+ +
+ +   + + +
+
50end
+
+ +
+ + diff --git a/reports/metric_fu/output/6a75ab7bf4bb23129765c49ac82b22.html b/reports/metric_fu/output/6a75ab7bf4bb23129765c49ac82b22.html new file mode 100644 index 0000000..1e2bcc5 --- /dev/null +++ b/reports/metric_fu/output/6a75ab7bf4bb23129765c49ac82b22.html @@ -0,0 +1,1379 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1Rails.application.routes.draw do
+
+
+ +
+ +   + + +
+
2  # The priority is based upon order of creation: first created -> highest priority.
+
+
+ +
+ +   + + +
+
3  # See how all your routes lay out with "rake routes".
+
+
+ +
+ +   + + +
+
4
+
+
+ +
+ +   + + +
+
5  # You can have the root of your site routed with "root"
+
+
+ +
+ +   + + +
+
6  # root 'welcome#index'
+
+
+ +
+ +   + + +
+
7
+
+
+ +
+ +   + + +
+
8  # Example of regular route:
+
+
+ +
+ +   + + +
+
 9  #   get 'products/:id' => 'catalog#view'
+
+
+ +
+ +   + + +
+
10
+
+
+ +
+ +   + + +
+
11  # Example of named route that can be invoked with purchase_url(id: product.id)
+
+
+ +
+ +   + + +
+
12  #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase
+
+
+ +
+ +   + + +
+
13
+
+
+ +
+ +   + + +
+
14  # Example resource route (maps HTTP verbs to controller actions automatically):
+
+
+ +
+ +   + + +
+
15  #   resources :products
+
+
+ +
+ +   + + +
+
16
+
+
+ +
+ +   + + +
+
17  # Example resource route with options:
+
+
+ +
+ +   + + +
+
18  #   resources :products do
+
+
+ +
+ +   + + +
+
19  #     member do
+
+
+ +
+ +   + + +
+
20  #       get 'short'
+
+
+ +
+ +   + + +
+
21  #       post 'toggle'
+
+
+ +
+ +   + + +
+
22  #     end
+
+
+ +
+ +   + + +
+
23  #
+
+
+ +
+ +   + + +
+
24  #     collection do
+
+
+ +
+ +   + + +
+
25  #       get 'sold'
+
+
+ +
+ +   + + +
+
26  #     end
+
+
+ +
+ +   + + +
+
27  #   end
+
+
+ +
+ +   + + +
+
28
+
+
+ +
+ +   + + +
+
29  # Example resource route with sub-resources:
+
+
+ +
+ +   + + +
+
30  #   resources :products do
+
+
+ +
+ +   + + +
+
31  #     resources :comments, :sales
+
+
+ +
+ +   + + +
+
32  #     resource :seller
+
+
+ +
+ +   + + +
+
33  #   end
+
+
+ +
+ +   + + +
+
34
+
+
+ +
+ +   + + +
+
35  # Example resource route with more complex sub-resources:
+
+
+ +
+ +   + + +
+
36  #   resources :products do
+
+
+ +
+ +   + + +
+
37  #     resources :comments
+
+
+ +
+ +   + + +
+
38  #     resources :sales do
+
+
+ +
+ +   + + +
+
39  #       get 'recent', on: :collection
+
+
+ +
+ +   + + +
+
40  #     end
+
+
+ +
+ +   + + +
+
41  #   end
+
+
+ +
+ +   + + +
+
42
+
+
+ +
+ +   + + +
+
43  # Example resource route with concerns:
+
+
+ +
+ +   + + +
+
44  #   concern :toggleable do
+
+
+ +
+ +   + + +
+
45  #     post 'toggle'
+
+
+ +
+ +   + + +
+
46  #   end
+
+
+ +
+ +   + + +
+
47  #   resources :posts, concerns: :toggleable
+
+
+ +
+ +   + + +
+
48  #   resources :photos, concerns: :toggleable
+
+
+ +
+ +   + + +
+
49
+
+
+ +
+ +   + + +
+
50  # Example resource route within a namespace:
+
+
+ +
+ +   + + +
+
51  #   namespace :admin do
+
+
+ +
+ +   + + +
+
52  #     # Directs /admin/products/* to Admin::ProductsController
+
+
+ +
+ +   + + +
+
53  #     # (app/controllers/admin/products_controller.rb)
+
+
+ +
+ +   + + +
+
54  #     resources :products
+
+
+ +
+ +   + + +
+
55  #   end
+
+
+ +
+ +   + + +
+
56
+
+
+ +
+ +   + + +
+
57  get 'users/emailExist' => 'users#emailExist'
+
+
+ +
+ +   + + +
+
58  get 'users/usernameExist' => 'users#usernameExist'
+
+
+ +
+ +   + + +
+
59  post 'users' => 'users#create'
+
+
+ +
+ +   + + +
+
60  patch 'user/current' => 'users#update'
+
+
+ +
+ +   + + +
+
61
+
+
+ +
+ +   + + +
+
62  post 'sessions' => 'sessions#create'
+
+
+ +
+ +   + + +
+
63  delete 'session' => 'sessions#destroy'
+
+
+ +
+ +   + + +
+
64  get 'session' => 'sessions#show'
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
65  
+
+
+ +
+ +   + + +
+
66  post 'shares' => 'shares#create'
+
+
+ +
+ +   + + +
+
67  get 'shares' => 'shares#getShareList'
+
+
+ +
+ +   + + +
+
68  
+
+
+ +
+ +   + + +
+
69  get 'projects' => 'projects#index'
+
+
+ +
+ +   + + +
+
70  post 'projects' => 'projects#create'
+
+
+ +
+ +   + + +
+
71  patch 'projects' => 'projects#update'
+
+
+ +
+ +   + + +
+
72  post 'projects/users' => 'projects#addUsers'
+
+
+ +
+ +   + + +
+
73  delete 'projects/users' => 'projects#deleteUsers'
+
+
+ +
+ +   + + +
+
74  get 'projects/detail' => 'projects#detail'
+
+
+ +
+ +   + + +
+
75  
+
+
+ +
+ +   + + +
+
76  get 'notes/list' => 'notes#getNotesList'
+
+
+ +
+ +   + + +
+
77  
+
+
+ +
+ +   + + +
+
78  get 'missions' => 'missions#getlist'
+
+
+ +
+ +   + + +
+
79  get 'missions/detail' => 'missions#detail'
+
+
+ +
+ +   + + +
+
80  post 'missions/comments' => 'missions#commentPublish'
+
+
+ +
+ +   + + +
+
81  post 'missions' => 'missions#create'
+
+
+ +
+ +   + + +
+
82  patch 'missions/detail' => 'missions#update'
+
+
+ +
+ +   + + +
+
83 
+
+
+ +
+ +   + + +
+
84end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/6da1532795e88ec4f5566b4ae0fbb2.html b/reports/metric_fu/output/6da1532795e88ec4f5566b4ae0fbb2.html new file mode 100644 index 0000000..06c9f2a --- /dev/null +++ b/reports/metric_fu/output/6da1532795e88ec4f5566b4ae0fbb2.html @@ -0,0 +1,526 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • Class name "Missions_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/ » roodi
  • + +
+ +
+
+
1class Missions_user <ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2  
+
+
+ +
+ +   + + +
+
3    validates :mission_id, presence: true
+
+
+ +
+ +   + + +
+
4    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validate :mission_exist, on: :create
+
+
+ +
+ +   + + +
+
7    validate :user_exist, on: :create
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    private 
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
10        def mission_exist
+
+
+ +
+ +   + + +
+
11            
+
+
+ +
+ +   + + +
+
12            mission = Mission.find_by(id: mission_id)
+
+
+ +
+ +   + + +
+
13            if mission == nil
+
+
+ +
+ +   + + +
+
14                errors[:mission] = "mission belong to Missions_user is not exist"
+
+
+ +
+ +   + + +
+
15            end
+
+
+ +
+ +   + + +
+
16        
+
+
+ +
+ +   + + +
+
17        
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
20        def user_exist
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user =  User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to Missions_user is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        
+
+
+ +
+ +   + + +
+
29    
+
+
+ +
+ +   + + +
+
30end
+
+ +
+ + diff --git a/reports/metric_fu/output/7dc0dd94f601e507e2a20bad6adcf1.html b/reports/metric_fu/output/7dc0dd94f601e507e2a20bad6adcf1.html new file mode 100644 index 0000000..0bf08ed --- /dev/null +++ b/reports/metric_fu/output/7dc0dd94f601e507e2a20bad6adcf1.html @@ -0,0 +1,297 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class ApplicationController < ActionController::Base
+
+
+ +
+ +   + + +
+
2  # Prevent CSRF attacks by raising an exception.
+
+
+ +
+ +   + + +
+
3  # For APIs, you may want to use :null_session instead.
+
+
+ +
+ +   + + +
+
4  protect_from_forgery with: :exception
+
+
+ +
+ +   + + +
+
5
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
6  def authenticate
+
+
+ +
+ +   + + +
+
7    render status: :unauthorized, nothing: true unless session['user_id']
+
+
+ +
+ +   + + +
+
8  end
+
+
+ +
+ +   + + +
+
 9
+
+
+ +
+ +   + + +
+
10  private
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • DuplicateMethodCall - calls session[:user_id] 2 times » reek
  • + +
+ +
+
+
11    def current_user
+
+
+ +
+ +   + + +
+
12      @current_user ||= User.find(session[:user_id]) if session[:user_id]
+
+
+ +
+ +   + + +
+
13    end
+
+
+ +
+ +   + + +
+
14
+
+
+ +
+ +   + + +
+
15  helper_method :current_user
+
+
+ +
+ +   + + +
+
16end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/8072e824009715d8b89c1b35b6b34a.html b/reports/metric_fu/output/8072e824009715d8b89c1b35b6b34a.html new file mode 100644 index 0000000..cf090e9 --- /dev/null +++ b/reports/metric_fu/output/8072e824009715d8b89c1b35b6b34a.html @@ -0,0 +1,510 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
    + +
  • Class name "Projects_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/ » roodi
  • + +
+ +
+
+
1class Projects_user < ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
4    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validate :user_exists , on: :create
+
+
+ +
+ +   + + +
+
7    validate :project_exists, on: :create
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    private
+
+
+ +
+ +   + + +
+
10        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
11        def project_exists
+
+
+ +
+ +   + + +
+
12            
+
+
+ +
+ +   + + +
+
13            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
14            if project == nil
+
+
+ +
+ +   + + +
+
15                errors[:project] = "project belong to projects_user is not exist"
+
+
+ +
+ +   + + +
+
16            end
+
+
+ +
+ +   + + +
+
17        
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
20        def user_exists
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to projects_user is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28    
+
+
+ +
+ +   + + +
+
29end
+
+ +
+ + diff --git a/reports/metric_fu/output/82f5d4f89a95414eac71b95d163c05.html b/reports/metric_fu/output/82f5d4f89a95414eac71b95d163c05.html new file mode 100644 index 0000000..810f4f1 --- /dev/null +++ b/reports/metric_fu/output/82f5d4f89a95414eac71b95d163c05.html @@ -0,0 +1,850 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Note < ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    belongs_to :user
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :content, presence: true
+
+
+ +
+ +   + + +
+
6    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
7    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
8    validates :category, presence: true
+
+
+ +
+ +   + + +
+
 9    
+
+
+ +
+ +   + + +
+
10    validate :note_has_atleast_one_character
+
+
+ +
+ +   + + +
+
11    validate :note_category_should_among_valid_values
+
+
+ +
+ +   + + +
+
12    validate :user_exist, on: :create
+
+
+ +
+ +   + + +
+
13    validate :project_exist, on: :create
+
+
+ +
+ +   + + +
+
14    
+
+
+ +
+ +   + + +
+
15    
+
+
+ +
+ +   + + +
+
16    private 
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
17        def note_has_atleast_one_character
+
+
+ +
+ +   + + +
+
18            tmp = content.strip
+
+
+ +
+ +   + + +
+
19            if tmp.length < 1
+
+
+ +
+ +   + + +
+
20                errors[:content] = "note content should has at least one character"
+
+
+ +
+ +   + + +
+
21            end
+
+
+ +
+ +   + + +
+
22        end
+
+
+ +
+ +   + + +
+
23        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
24        def note_category_should_among_valid_values
+
+
+ +
+ +   + + +
+
25            
+
+
+ +
+ +   + + +
+
26            if category != 1 and category != 2 and category !=3
+
+
+ +
+ +   + + +
+
27                errors[:category] = "note category is not among valid values"
+
+
+ +
+ +   + + +
+
28            end
+
+
+ +
+ +   + + +
+
29            
+
+
+ +
+ +   + + +
+
30        end
+
+
+ +
+ +   + + +
+
31        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
32        def user_exist
+
+
+ +
+ +   + + +
+
33        
+
+
+ +
+ +   + + +
+
34            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
35            if user == nil
+
+
+ +
+ +   + + +
+
36                errors[:user] = "user belong to Note is not exist"
+
+
+ +
+ +   + + +
+
37            end
+
+
+ +
+ +   + + +
+
38            
+
+
+ +
+ +   + + +
+
39        end
+
+
+ +
+ +   + + +
+
40        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
41        def project_exist
+
+
+ +
+ +   + + +
+
42            
+
+
+ +
+ +   + + +
+
43            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
44            if project == nil
+
+
+ +
+ +   + + +
+
45                errors[:project] = "project should be exist"
+
+
+ +
+ +   + + +
+
46            end
+
+
+ +
+ +   + + +
+
47             
+
+
+ +
+ +   + + +
+
48        end
+
+
+ +
+ +   + + +
+
49    
+
+
+ +
+ +   + + +
+
50end
+
+ +
+ + diff --git a/reports/metric_fu/output/848e5d85436bd98a9ff164a8c102f8.html b/reports/metric_fu/output/848e5d85436bd98a9ff164a8c102f8.html new file mode 100644 index 0000000..2dde9e1 --- /dev/null +++ b/reports/metric_fu/output/848e5d85436bd98a9ff164a8c102f8.html @@ -0,0 +1,626 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class NotesController < ApplicationController
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    #
+
+
+ +
+ +   + + +
+
6    
+
+
+ +
+ +   + + +
+
7    def getNotesList
+
+
+ +
+ +   + + +
+
8    #Todo
+
+
+ +
+ +   + + +
+
 9    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
10    uid = session[:user_id]
+
+
+ +
+ +   + + +
+
11    notes = Note.where("user_id = ? AND project_id = ? ",uid,pid).order("created_at desc").all
+
+
+ +
+ +   + + +
+
12    note = Hash.new do |h,k|
+
+
+ +
+ +   + + +
+
13            h[k] = []
+
+
+ +
+ +   + + +
+
14    end
+
+
+ +
+ +   + + +
+
15    notes.each do |n|
+
+
+ +
+ +   + + +
+
16        date =  n.created_at.to_s[/([\d\-]*)\s(.*)/,1]
+
+
+ +
+ +   + + +
+
17        time =  n.created_at.to_s[/(.*)\s([\d\:]*)/,2]
+
+
+ +
+ +   + + +
+
18        note[date] << {
+
+
+ +
+ +   + + +
+
19            :content => n.content,
+
+
+ +
+ +   + + +
+
20            :time => time,
+
+
+ +
+ +   + + +
+
21            :type => n.category
+
+
+ +
+ +   + + +
+
22        }
+
+
+ +
+ +   + + +
+
23    end
+
+
+ +
+ +   + + +
+
24    data = []
+
+
+ +
+ +   + + +
+
25    note.each do |k,v|
+
+
+ +
+ +   + + +
+
26        data += [{
+
+
+ +
+ +   + + +
+
27            :time => k,
+
+
+ +
+ +   + + +
+
28            :notes => v
+
+
+ +
+ +   + + +
+
29        }]
+
+
+ +
+ +   + + +
+
30    end
+
+
+ +
+ +   + + +
+
31    render :json => {
+
+
+ +
+ +   + + +
+
32        :code => 0,
+
+
+ +
+ +   + + +
+
33        :data => data
+
+
+ +
+ +   + + +
+
34    }
+
+
+ +
+ +   + + +
+
35    end
+
+
+ +
+ +   + + +
+
36    
+
+
+ +
+ +   + + +
+
37end
+
+ +
+ + diff --git a/reports/metric_fu/output/867b0d6900a9fdc8387912df121530.html b/reports/metric_fu/output/867b0d6900a9fdc8387912df121530.html new file mode 100644 index 0000000..d35925b --- /dev/null +++ b/reports/metric_fu/output/867b0d6900a9fdc8387912df121530.html @@ -0,0 +1,2494 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class MissionsController < ApplicationController
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :create,
+
+
+ +
+ +   + + +
+
6        :getlist,
+
+
+ +
+ +   + + +
+
7        :detail,
+
+
+ +
+ +   + + +
+
8        :update,
+
+
+ +
+ +   + + +
+
 9        :commentPublish
+
+
+ +
+ +   + + +
+
10    ]
+
+
+ +
+ +   + + +
+
11    #======================================>
+
+
+ +
+ +   + + +
+
12    
+
+
+ +
+ +   + + +
+
13    def getlist
+
+
+ +
+ +   + + +
+
14    #Todo
+
+
+ +
+ +   + + +
+
15    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
16    stu = params[:status_type]
+
+
+ +
+ +   + + +
+
17    #missions = []
+
+
+ +
+ +   + + +
+
18    details = []
+
+
+ +
+ +   + + +
+
19    missions = Mission.where("project_id = ? AND status = ?",pid,stu).all
+
+
+ +
+ +   + + +
+
20    
+
+
+ +
+ +   + + +
+
21    missions.each do |mission|
+
+
+ +
+ +   + + +
+
22        
+
+
+ +
+ +   + + +
+
23        #puts mission.inspect
+
+
+ +
+ +   + + +
+
24        
+
+
+ +
+ +   + + +
+
25        details += [{
+
+
+ +
+ +   + + +
+
26            :id => mission.id,
+
+
+ +
+ +   + + +
+
27            :name => mission.name,
+
+
+ +
+ +   + + +
+
28            :content => mission.content
+
+
+ +
+ +   + + +
+
29        }]
+
+
+ +
+ +   + + +
+
30        
+
+
+ +
+ +   + + +
+
31    end
+
+
+ +
+ +   + + +
+
32    
+
+
+ +
+ +   + + +
+
33    # Mission.where(:project_id => pid).where(:status => stu) do |i|
+
+
+ +
+ +   + + +
+
34    #     missions += [{
+
+
+ +
+ +   + + +
+
35    #         :id => i.id,
+
+
+ +
+ +   + + +
+
36    #         :name => i.name,
+
+
+ +
+ +   + + +
+
37    #         :content => i.content
+
+
+ +
+ +   + + +
+
38    #     }]
+
+
+ +
+ +   + + +
+
39    # end
+
+
+ +
+ +   + + +
+
40    render :json => {
+
+
+ +
+ +   + + +
+
41        :code => 0,
+
+
+ +
+ +   + + +
+
42        :data => missions
+
+
+ +
+ +   + + +
+
43    }
+
+
+ +
+ +   + + +
+
44    end
+
+
+ +
+ +   + + +
+
45    
+
+
+ +
+ +   + + +
+
46    #======================================>
+
+
+ +
+ +   + + +
+
47    
+
+
+ +
+ +   + + +
+
48    def detail
+
+
+ +
+ +   + + +
+
49    #Todo
+
+
+ +
+ +   + + +
+
50    username = []
+
+
+ +
+ +   + + +
+
51    comments_s = []
+
+
+ +
+ +   + + +
+
52    mission_id = params[:id]
+
+
+ +
+ +   + + +
+
53    mission = Mission.find_by(id: mission_id)
+
+
+ +
+ +   + + +
+
54    m_us = Missions_user.where("mission_id = ?",mission_id).all
+
+
+ +
+ +   + + +
+
55    #puts m_us.inspect
+
+
+ +
+ +   + + +
+
56    m_us.each do |m_u|
+
+
+ +
+ +   + + +
+
57        user_id = m_u.user_id
+
+
+ +
+ +   + + +
+
58        user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
59        #puts user.inspect
+
+
+ +
+ +   + + +
+
60        username << user.name
+
+
+ +
+ +   + + +
+
61    end
+
+
+ +
+ +   + + +
+
62    comments = Comment.where("mission_id = ?",mission_id).all
+
+
+ +
+ +   + + +
+
63    comments.each do |c|
+
+
+ +
+ +   + + +
+
64        uname = User.find_by(id: c.user_id).name
+
+
+ +
+ +   + + +
+
65        comments_s += [{
+
+
+ +
+ +   + + +
+
66            :nickname => uname,
+
+
+ +
+ +   + + +
+
67            :content => c.content,
+
+
+ +
+ +   + + +
+
68            :time => c.created_at
+
+
+ +
+ +   + + +
+
69        }]
+
+
+ +
+ +   + + +
+
70    end
+
+
+ +
+ +   + + +
+
71    #puts comments_s.inspect
+
+
+ +
+ +   + + +
+
72    render :json => {
+
+
+ +
+ +   + + +
+
73        :code => 0,
+
+
+ +
+ +   + + +
+
74        :data => {
+
+
+ +
+ +   + + +
+
75            :name => mission.name,
+
+
+ +
+ +   + + +
+
76            :content => mission.content,
+
+
+ +
+ +   + + +
+
77            :priority => mission.priority,
+
+
+ +
+ +   + + +
+
78            :status => mission.status,
+
+
+ +
+ +   + + +
+
79            :deadline => mission.deadline,
+
+
+ +
+ +   + + +
+
80            :users => username,
+
+
+ +
+ +   + + +
+
81            :comments => comments_s
+
+
+ +
+ +   + + +
+
82        }
+
+
+ +
+ +   + + +
+
83    }
+
+
+ +
+ +   + + +
+
84    end
+
+
+ +
+ +   + + +
+
85     #======================================>
+
+
+ +
+ +   + + +
+
86    
+
+
+ +
+ +   + + +
+
87    def create
+
+
+ +
+ +   + + +
+
88    #Todo
+
+
+ +
+ +   + + +
+
89    params_mission = {name: params[:name],project_id: params[:project_id],content: params[:content],deadline: params[:deadline],priority: params[:priority],status: params[:status]}
+
+
+ +
+ +   + + +
+
90    mission = Mission.new(params_mission)
+
+
+ +
+ +   + + +
+
91    if mission.save
+
+
+ +
+ +   + + +
+
92        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
93    else
+
+
+ +
+ +   + + +
+
94        render json: mission.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
95    end
+
+
+ +
+ +   + + +
+
96    userids = params[:users]
+
+
+ +
+ +   + + +
+
97    userids.each do |id|
+
+
+ +
+ +   + + +
+
98        user_enties = User.find_by(id: id)
+
+
+ +
+ +   + + +
+
 99        #puts user_enties.inspect
+
+
+ +
+ +   + + +
+
100        params_mu = {mission_id: mission.id,user_id: user_enties.id}
+
+
+ +
+ +   + + +
+
101        missions_user = Missions_user.new(params_mu)
+
+
+ +
+ +   + + +
+
102        missions_user.save
+
+
+ +
+ +   + + +
+
103        content = " <a>"+mission.name+"</a>"
+
+
+ +
+ +   + + +
+
104        
+
+
+ +
+ +   + + +
+
105        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
+
+
+ +
+ +   + + +
+
106        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
107        note.save
+
+
+ +
+ +   + + +
+
108    end
+
+
+ +
+ +   + + +
+
109    end
+
+
+ +
+ +   + + +
+
110    
+
+
+ +
+ +   + + +
+
111    #======================================>
+
+
+ +
+ +   + + +
+
112    
+
+
+ +
+ +   + + +
+
113    def update
+
+
+ +
+ +   + + +
+
114    #Todo
+
+
+ +
+ +   + + +
+
115    
+
+
+ +
+ +   + + +
+
116    id = params[:id]
+
+
+ +
+ +   + + +
+
117    #now = Datetime.now
+
+
+ +
+ +   + + +
+
118    mission = Mission.find_by(id: id)
+
+
+ +
+ +   + + +
+
119    params_mission = {name: params[:name],content: params[:content],deadline: params[:deadline],priority: params[:priority]}
+
+
+ +
+ +   + + +
+
120    #puts params_mission
+
+
+ +
+ +   + + +
+
121    mission.update(params_mission)
+
+
+ +
+ +   + + +
+
122    mission.save
+
+
+ +
+ +   + + +
+
123    Missions_user.delete_all(["mission_id = ?",id])
+
+
+ +
+ +   + + +
+
124    userids = params[:users]
+
+
+ +
+ +   + + +
+
125    userids.each do |name|
+
+
+ +
+ +   + + +
+
126        user_enties = User.find_by(id: id)
+
+
+ +
+ +   + + +
+
127        params = {mission_id: id,user_id: user_enties.id}
+
+
+ +
+ +   + + +
+
128        missions_user = Missions_user.new(params)
+
+
+ +
+ +   + + +
+
129        missions_user.save
+
+
+ +
+ +   + + +
+
130        content = "<a>"+mission.name + "</a> "
+
+
+ +
+ +   + + +
+
131        
+
+
+ +
+ +   + + +
+
132        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
+
+
+ +
+ +   + + +
+
133        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
134        note.save
+
+
+ +
+ +   + + +
+
135    end
+
+
+ +
+ +   + + +
+
136    render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
137    end
+
+
+ +
+ +   + + +
+
138    
+
+
+ +
+ +   + + +
+
139    #======================================>
+
+
+ +
+ +   + + +
+
140    
+
+
+ +
+ +   + + +
+
141    def commentPublish
+
+
+ +
+ +   + + +
+
142    #Todo
+
+
+ +
+ +   + + +
+
143    mission_id = params[:mission_id]
+
+
+ +
+ +   + + +
+
144    content = params[:content]
+
+
+ +
+ +   + + +
+
145    user_id = session[:user_id]
+
+
+ +
+ +   + + +
+
146    params = {content: content, mission_id: mission_id, user_id: user_id}
+
+
+ +
+ +   + + +
+
147    comment = Comment.new(params)
+
+
+ +
+ +   + + +
+
148    if comment.save
+
+
+ +
+ +   + + +
+
149        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
150    else
+
+
+ +
+ +   + + +
+
151        render json: mission.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
152    end
+
+
+ +
+ +   + + +
+
153    end
+
+
+ +
+ +   + + +
+
154end
+
+ +
+ + diff --git a/reports/metric_fu/output/8c039b786f7387f47d72c2d87dfe82.html b/reports/metric_fu/output/8c039b786f7387f47d72c2d87dfe82.html new file mode 100644 index 0000000..02d1fb9 --- /dev/null +++ b/reports/metric_fu/output/8c039b786f7387f47d72c2d87dfe82.html @@ -0,0 +1,622 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class NotesController < ApplicationController
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    #
+
+
+ +
+ +   + + +
+
6    
+
+
+ +
+ +   + + +
+
7    def getNotesList
+
+
+ +
+ +   + + +
+
8    #Todo
+
+
+ +
+ +   + + +
+
 9    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
10    uid = session[:user_id]
+
+
+ +
+ +   + + +
+
11    notes = Note.where("user_id = ? AND project_id = ? ",uid,pid).order("created_at desc").all
+
+
+ +
+ +   + + +
+
12    note = Hash.new do |h,k|
+
+
+ +
+ +   + + +
+
13            h[k] = []
+
+
+ +
+ +   + + +
+
14    end
+
+
+ +
+ +   + + +
+
15    notes.each do |n|
+
+
+ +
+ +   + + +
+
16        date =  n.created_at.to_s[/([\d\-]*)\s(.*)/,1]
+
+
+ +
+ +   + + +
+
17        time =  n.created_at.to_s[/(.*)\s([\d\:]*)/,2]
+
+
+ +
+ +   + + +
+
18        note[date] << {
+
+
+ +
+ +   + + +
+
19            :content => n.content,
+
+
+ +
+ +   + + +
+
20            :time => time,
+
+
+ +
+ +   + + +
+
21            :type => n.category
+
+
+ +
+ +   + + +
+
22        }
+
+
+ +
+ +   + + +
+
23    end
+
+
+ +
+ +   + + +
+
24    data = []
+
+
+ +
+ +   + + +
+
25    note.each do |k,v|
+
+
+ +
+ +   + + +
+
26        data += [{
+
+
+ +
+ +   + + +
+
27            :time => k,
+
+
+ +
+ +   + + +
+
28            :notes => v
+
+
+ +
+ +   + + +
+
29        }]
+
+
+ +
+ +   + + +
+
30    end
+
+
+ +
+ +   + + +
+
31    render :json => {
+
+
+ +
+ +   + + +
+
32        :code => 0,
+
+
+ +
+ +   + + +
+
33        :data => data
+
+
+ +
+ +   + + +
+
34    }
+
+
+ +
+ +   + + +
+
35    end
+
+
+ +
+ +   + + +
+
36    
+
+
+ +
+ +   + + +
+
37end
+
+ +
+ + diff --git a/reports/metric_fu/output/982d8070d769dd9745ad39d380ddc4.html b/reports/metric_fu/output/982d8070d769dd9745ad39d380ddc4.html new file mode 100644 index 0000000..ce1c9c8 --- /dev/null +++ b/reports/metric_fu/output/982d8070d769dd9745ad39d380ddc4.html @@ -0,0 +1,498 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Projects_user < ActiveRecord:: Base
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2    
+
+
+ +
+ +   + + +
+
3    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
4    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validate :user_exists , on: :create
+
+
+ +
+ +   + + +
+
7    validate :project_exists, on: :create
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    private
+
+
+ +
+ +   + + +
+
10        
+
+
+ +
+ +   + + +
+
11        def project_exists
+
+
+ +
+ +   + + +
+
12            
+
+
+ +
+ +   + + +
+
13            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
14            if project == nil
+
+
+ +
+ +   + + +
+
15                errors[:project] = "project belong to projects_user is not exist"
+
+
+ +
+ +   + + +
+
16            end
+
+
+ +
+ +   + + +
+
17        
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +   + + +
+
20        def user_exists
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to projects_user is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28    
+
+
+ +
+ +   + + +
+
29end
+
+ +
+ + diff --git a/reports/metric_fu/output/9b10b709acd94e71dd3a7d2d2eafc8.html b/reports/metric_fu/output/9b10b709acd94e71dd3a7d2d2eafc8.html new file mode 100644 index 0000000..19e3c3e --- /dev/null +++ b/reports/metric_fu/output/9b10b709acd94e71dd3a7d2d2eafc8.html @@ -0,0 +1,797 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Mission < ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3    has_many :comments
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validates :name, presence: true
+
+
+ +
+ +   + + +
+
7    validates :deadline, presence: true
+
+
+ +
+ +   + + +
+
8    validates :priority, presence: true
+
+
+ +
+ +   + + +
+
 9    validates :status, presence: true
+
+
+ +
+ +   + + +
+
10    validates :content, presence: true
+
+
+ +
+ +   + + +
+
11    
+
+
+ +
+ +   + + +
+
12    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
13    
+
+
+ +
+ +   + + +
+
14    
+
+
+ +
+ +   + + +
+
15    validate :priority_is_among_valid_values
+
+
+ +
+ +   + + +
+
16    validate :status_is_among_valid_values
+
+
+ +
+ +   + + +
+
17    
+
+
+ +
+ +   + + +
+
18    validate :project_exists, on: :create
+
+
+ +
+ +   + + +
+
19    
+
+
+ +
+ +   + + +
+
20    private 
+
+
+ +
+ +   + + +
+
21    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
22        def priority_is_among_valid_values
+
+
+ +
+ +   + + +
+
23            
+
+
+ +
+ +   + + +
+
24            if priority != 1 and  priority != 2 and priority != 3
+
+
+ +
+ +   + + +
+
25                errors[:priority] = "priority is not among valid values"
+
+
+ +
+ +   + + +
+
26            end
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
29        def status_is_among_valid_values
+
+
+ +
+ +   + + +
+
30            
+
+
+ +
+ +   + + +
+
31            if  status != 1 and  status != 2 and status != 3 and status != 4
+
+
+ +
+ +   + + +
+
32                errors[:status] = "status is not among valid values"
+
+
+ +
+ +   + + +
+
33            end
+
+
+ +
+ +   + + +
+
34        end
+
+
+ +
+ +   + + +
+
35        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
36        def project_exists
+
+
+ +
+ +   + + +
+
37            #puts project_id
+
+
+ +
+ +   + + +
+
38            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
39            #puts project.inspect
+
+
+ +
+ +   + + +
+
40            if project == nil
+
+
+ +
+ +   + + +
+
41                errors[:project_id] = "project_id is not exist"
+
+
+ +
+ +   + + +
+
42            end
+
+
+ +
+ +   + + +
+
43            
+
+
+ +
+ +   + + +
+
44        end
+
+
+ +
+ +   + + +
+
45    
+
+
+ +
+ +   + + +
+
46    
+
+
+ +
+ +   + + +
+
47end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/a6b6b6ea6c02af1e0847c02ef3d27b.html b/reports/metric_fu/output/a6b6b6ea6c02af1e0847c02ef3d27b.html new file mode 100644 index 0000000..21e6c39 --- /dev/null +++ b/reports/metric_fu/output/a6b6b6ea6c02af1e0847c02ef3d27b.html @@ -0,0 +1,639 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Share < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    validates :content, presence: true
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
6    
+
+
+ +
+ +   + + +
+
7    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    validate :share_has_atleast_one_character 
+
+
+ +
+ +   + + +
+
10    validate :user_exists,on: :create
+
+
+ +
+ +   + + +
+
11    validate :project_exists,on: :create
+
+
+ +
+ +   + + +
+
12    private 
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
13        def share_has_atleast_one_character
+
+
+ +
+ +   + + +
+
14            tmp = content.strip
+
+
+ +
+ +   + + +
+
15            if tmp.length < 1
+
+
+ +
+ +   + + +
+
16                errors[:content] = "share content should has at least one character"
+
+
+ +
+ +   + + +
+
17            end
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
20        def user_exists
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to Share is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • NilCheck - performs a nil-check » reek
  • + +
+ +
+
+
28        def project_exists
+
+
+ +
+ +   + + +
+
29            
+
+
+ +
+ +   + + +
+
30            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
31            if project == nil
+
+
+ +
+ +   + + +
+
32                errors[:project] = "user belong to Share is not exist"
+
+
+ +
+ +   + + +
+
33            end
+
+
+ +
+ +   + + +
+
34        
+
+
+ +
+ +   + + +
+
35        end    
+
+
+ +
+ +   + + +
+
36    
+
+
+ +
+ +   + + +
+
37end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/a7c8e5306369685dc160701bbafa8a.html b/reports/metric_fu/output/a7c8e5306369685dc160701bbafa8a.html new file mode 100644 index 0000000..afa6316 --- /dev/null +++ b/reports/metric_fu/output/a7c8e5306369685dc160701bbafa8a.html @@ -0,0 +1,507 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class SessionsController < ApplicationController
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3  # 
+
+
+ +
+ +   + + +
+
4  before_action :authenticate, except: [ :create ]
+
+
+ +
+ +   + + +
+
5  skip_before_action :verify_authenticity_token, :only => [:create,:destroy,:show]
+
+
+ +
+ +   + + +
+
6
+
+
+ +
+ +   + + +
+
7  
+
+
+ +
+ +   + + +
+
8  # 
+
+
+ +
+ +   + + +
+
 9  
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
10  def create
+
+
+ +
+ +   + + +
+
11    user = User.find_by(email: params[:email])
+
+
+ +
+ +   + + +
+
12    if user && user.authenticate(params[:password])
+
+
+ +
+ +   + + +
+
13      session[:user_id] = user.id
+
+
+ +
+ +   + + +
+
14      render status: :ok, text: 'ok'
+
+
+ +
+ +   + + +
+
15    else
+
+
+ +
+ +   + + +
+
16      render status: :unauthorized, text: 'account or password is not correct'
+
+
+ +
+ +   + + +
+
17    end
+
+
+ +
+ +   + + +
+
18  end
+
+
+ +
+ +   + + +
+
19
+
+
+ +
+ +
    + +
  • Complexity 1 » saikuro
  • + +
+ +
+
+
20  def destroy
+
+
+ +
+ +   + + +
+
21    session.delete :user_id
+
+
+ +
+ +   + + +
+
22    @current_user &&= nil
+
+
+ +
+ +   + + +
+
23    render status: :ok, nothing: true
+
+
+ +
+ +   + + +
+
24  end
+
+
+ +
+ +   + + +
+
25
+
+
+ +
+ +
    + +
  • Complexity 1 » saikuro
  • + +
+ +
+
+
26  def show
+
+
+ +
+ +   + + +
+
27    render 'show'
+
+
+ +
+ +   + + +
+
28  end
+
+
+ +
+ +   + + +
+
29end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/a865d6cd53557a9dc1ee1be9f54f9c.html b/reports/metric_fu/output/a865d6cd53557a9dc1ee1be9f54f9c.html new file mode 100644 index 0000000..0330d63 --- /dev/null +++ b/reports/metric_fu/output/a865d6cd53557a9dc1ee1be9f54f9c.html @@ -0,0 +1,830 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Note < ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    belongs_to :user
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :content, presence: true
+
+
+ +
+ +   + + +
+
6    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
7    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
8    validates :category, presence: true
+
+
+ +
+ +   + + +
+
 9    
+
+
+ +
+ +   + + +
+
10    validate :note_has_atleast_one_character
+
+
+ +
+ +   + + +
+
11    validate :note_category_should_among_valid_values
+
+
+ +
+ +   + + +
+
12    validate :user_exist, on: :create
+
+
+ +
+ +   + + +
+
13    validate :project_exist, on: :create
+
+
+ +
+ +   + + +
+
14    
+
+
+ +
+ +   + + +
+
15    
+
+
+ +
+ +   + + +
+
16    private 
+
+
+ +
+ +   + + +
+
17        def note_has_atleast_one_character
+
+
+ +
+ +   + + +
+
18            tmp = content.strip
+
+
+ +
+ +   + + +
+
19            if tmp.length < 1
+
+
+ +
+ +   + + +
+
20                errors[:content] = "note content should has at least one character"
+
+
+ +
+ +   + + +
+
21            end
+
+
+ +
+ +   + + +
+
22        end
+
+
+ +
+ +   + + +
+
23        
+
+
+ +
+ +   + + +
+
24        def note_category_should_among_valid_values
+
+
+ +
+ +   + + +
+
25            
+
+
+ +
+ +   + + +
+
26            if category != 1 and category != 2 and category !=3
+
+
+ +
+ +   + + +
+
27                errors[:category] = "note category is not among valid values"
+
+
+ +
+ +   + + +
+
28            end
+
+
+ +
+ +   + + +
+
29            
+
+
+ +
+ +   + + +
+
30        end
+
+
+ +
+ +   + + +
+
31        
+
+
+ +
+ +   + + +
+
32        def user_exist
+
+
+ +
+ +   + + +
+
33        
+
+
+ +
+ +   + + +
+
34            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
35            if user == nil
+
+
+ +
+ +   + + +
+
36                errors[:user] = "user belong to Note is not exist"
+
+
+ +
+ +   + + +
+
37            end
+
+
+ +
+ +   + + +
+
38            
+
+
+ +
+ +   + + +
+
39        end
+
+
+ +
+ +   + + +
+
40        
+
+
+ +
+ +   + + +
+
41        def project_exist
+
+
+ +
+ +   + + +
+
42            
+
+
+ +
+ +   + + +
+
43            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
44            if project == nil
+
+
+ +
+ +   + + +
+
45                errors[:project] = "project should be exist"
+
+
+ +
+ +   + + +
+
46            end
+
+
+ +
+ +   + + +
+
47             
+
+
+ +
+ +   + + +
+
48        end
+
+
+ +
+ +   + + +
+
49    
+
+
+ +
+ +   + + +
+
50end
+
+ +
+ + diff --git a/reports/metric_fu/output/ad557ebe130d80c883f00b97d8b633.html b/reports/metric_fu/output/ad557ebe130d80c883f00b97d8b633.html new file mode 100644 index 0000000..fecef9b --- /dev/null +++ b/reports/metric_fu/output/ad557ebe130d80c883f00b97d8b633.html @@ -0,0 +1,1123 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1source 'https://rubygems.org'
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
+
+
+ +
+ +   + + +
+
4gem 'rails', '4.2.5'
+
+
+ +
+ +   + + +
+
5# Use sqlite3 as the database for Active Record
+
+
+ +
+ +   + + +
+
6gem 'sqlite3'
+
+
+ +
+ +   + + +
+
7# Use SCSS for stylesheets
+
+
+ +
+ +   + + +
+
8gem 'sass-rails', '~> 5.0'
+
+
+ +
+ +   + + +
+
 9# Use Uglifier as compressor for JavaScript assets
+
+
+ +
+ +   + + +
+
10gem 'uglifier', '>= 1.3.0'
+
+
+ +
+ +   + + +
+
11# Use CoffeeScript for .coffee assets and views
+
+
+ +
+ +   + + +
+
12gem 'coffee-rails', '~> 4.1.0'
+
+
+ +
+ +   + + +
+
13# See https://github.com/rails/execjs#readme for more supported runtimes
+
+
+ +
+ +   + + +
+
14gem 'therubyracer', platforms: :ruby
+
+
+ +
+ +   + + +
+
15
+
+
+ +
+ +   + + +
+
16# Use jquery as the JavaScript library
+
+
+ +
+ +   + + +
+
17gem 'jquery-rails'
+
+
+ +
+ +   + + +
+
18# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
+
+
+ +
+ +   + + +
+
19gem 'turbolinks'
+
+
+ +
+ +   + + +
+
20# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
+
+
+ +
+ +   + + +
+
21gem 'jbuilder', '~> 2.0'
+
+
+ +
+ +   + + +
+
22# bundle exec rake doc:rails generates the API under doc/api.
+
+
+ +
+ +   + + +
+
23gem 'sdoc', '~> 0.4.0', group: :doc
+
+
+ +
+ +   + + +
+
24
+
+
+ +
+ +   + + +
+
25# Use ActiveModel has_secure_password
+
+
+ +
+ +   + + +
+
26gem 'bcrypt', '~> 3.1.7'
+
+
+ +
+ +   + + +
+
27
+
+
+ +
+ +   + + +
+
28# Use Unicorn as the app server
+
+
+ +
+ +   + + +
+
29# gem 'unicorn'
+
+
+ +
+ +   + + +
+
30
+
+
+ +
+ +   + + +
+
31# Use Capistrano for deployment
+
+
+ +
+ +   + + +
+
32# gem 'capistrano-rails', group: :development
+
+
+ +
+ +   + + +
+
33
+
+
+ +
+ +   + + +
+
34group :development, :test do
+
+
+ +
+ +   + + +
+
35  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
+
+
+ +
+ +   + + +
+
36  gem 'byebug'
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
37  
+
+
+ +
+ +   + + +
+
38  # RSpec 
+
+
+ +
+ +   + + +
+
39  gem 'rspec-rails', '~> 3.5.2' 
+
+
+ +
+ +   + + +
+
40  # Rails 
+
+
+ +
+ +   + + +
+
41  gem 'factory_girl_rails','~> 4.7.0'
+
+
+ +
+ +   + + +
+
42
+
+
+ +
+ +   + + +
+
43  # metrics
+
+
+ +
+ +   + + +
+
44  gem 'simplecov'
+
+
+ +
+ +   + + +
+
45  gem 'simplecov-rcov-text'
+
+
+ +
+ +   + + +
+
46  gem 'metric_fu'
+
+
+ +
+ +   + + +
+
47end
+
+
+ +
+ +   + + +
+
48
+
+
+ +
+ +   + + +
+
49group :development do
+
+
+ +
+ +   + + +
+
50  # Access an IRB console on exception pages or by using <%= console %> in views
+
+
+ +
+ +   + + +
+
51  gem 'web-console', '~> 2.0'
+
+
+ +
+ +   + + +
+
52
+
+
+ +
+ +   + + +
+
53  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
+
+
+ +
+ +   + + +
+
54  gem 'spring'
+
+
+ +
+ +   + + +
+
55end
+
+
+ +
+ +   + + +
+
56
+
+
+ +
+ +   + + +
+
57group :test do
+
+
+ +
+ +   + + +
+
58  #
+
+
+ +
+ +   + + +
+
59  gem 'database_cleaner'
+
+
+ +
+ +   + + +
+
60  #Email 
+
+
+ +
+ +   + + +
+
61  gem 'faker'
+
+
+ +
+ +   + + +
+
62  #
+
+
+ +
+ +   + + +
+
63  gem 'capybara'
+
+
+ +
+ +   + + +
+
64  #,,
+
+
+ +
+ +   + + +
+
65  gem 'launchy'
+
+
+ +
+ +   + + +
+
66  # Capybara  JavaScript 
+
+
+ +
+ +   + + +
+
67  gem 'selenium-webdriver'
+
+
+ +
+ +   + + +
+
68end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/b16a6c9078bee9e4a21cdc3769d1f7.html b/reports/metric_fu/output/b16a6c9078bee9e4a21cdc3769d1f7.html new file mode 100644 index 0000000..e9b86b5 --- /dev/null +++ b/reports/metric_fu/output/b16a6c9078bee9e4a21cdc3769d1f7.html @@ -0,0 +1,163 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class ChangeNoteFieldTypeToCategory < ActiveRecord::Migration
+
+
+ +
+ +   + + +
+
2  def change
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
3    
+
+
+ +
+ +   + + +
+
4    remove_column :notes, :type, :integer
+
+
+ +
+ +   + + +
+
5    add_column :notes, :category, :integer
+
+
+ +
+ +   + + +
+
6    
+
+
+ +
+ +   + + +
+
7  end
+
+
+ +
+ +   + + +
+
8end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/b78ca6f60114b0a291eed6a60bb703.html b/reports/metric_fu/output/b78ca6f60114b0a291eed6a60bb703.html new file mode 100644 index 0000000..b00c2b3 --- /dev/null +++ b/reports/metric_fu/output/b78ca6f60114b0a291eed6a60bb703.html @@ -0,0 +1,1373 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1# encoding: UTF-8
+
+
+ +
+ +   + + +
+
2# This file is auto-generated from the current state of the database. Instead
+
+
+ +
+ +   + + +
+
3# of editing this file, please use the migrations feature of Active Record to
+
+
+ +
+ +   + + +
+
4# incrementally modify your database, and then regenerate this schema definition.
+
+
+ +
+ +   + + +
+
5#
+
+
+ +
+ +   + + +
+
6# Note that this schema.rb definition is the authoritative source for your
+
+
+ +
+ +   + + +
+
7# database schema. If you need to create the application database on another
+
+
+ +
+ +   + + +
+
8# system, you should be using db:schema:load, not running all the migrations
+
+
+ +
+ +   + + +
+
 9# from scratch. The latter is a flawed and unsustainable approach (the more migrations
+
+
+ +
+ +   + + +
+
10# you'll amass, the slower it'll run and the greater likelihood for issues).
+
+
+ +
+ +   + + +
+
11#
+
+
+ +
+ +   + + +
+
12# It's strongly recommended that you check this file into your version control system.
+
+
+ +
+ +   + + +
+
13
+
+
+ +
+ +   + + +
+
14ActiveRecord::Schema.define(version: 20161229084919) do
+
+
+ +
+ +   + + +
+
15
+
+
+ +
+ +
    + +
  • always add db index (comments => [user_id]) » rails_best_practices
  • + +
+ +
+
+
16  create_table "comments", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
17    t.text     "content"
+
+
+ +
+ +   + + +
+
18    t.integer  "mission_id"
+
+
+ +
+ +   + + +
+
19    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
20    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
21    t.integer  "user_id"
+
+
+ +
+ +   + + +
+
22  end
+
+
+ +
+ +   + + +
+
23
+
+
+ +
+ +   + + +
+
24  add_index "comments", ["mission_id"], name: "index_comments_on_mission_id"
+
+
+ +
+ +   + + +
+
25
+
+
+ +
+ +
    + +
  • always add db index (missions => [project_id]) » rails_best_practices
  • + +
+ +
+
+
26  create_table "missions", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
27    t.string   "name"
+
+
+ +
+ +   + + +
+
28    t.datetime "deadline"
+
+
+ +
+ +   + + +
+
29    t.integer  "priority"
+
+
+ +
+ +   + + +
+
30    t.integer  "status"
+
+
+ +
+ +   + + +
+
31    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
32    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
33    t.string   "content"
+
+
+ +
+ +   + + +
+
34    t.integer  "project_id"
+
+
+ +
+ +   + + +
+
35  end
+
+
+ +
+ +   + + +
+
36
+
+
+ +
+ +
    + +
  • always add db index (missions_users => [mission_id]) » rails_best_practices
  • + +
  • always add db index (missions_users => [user_id]) » rails_best_practices
  • + +
+ +
+
+
37  create_table "missions_users", id: false, force: :cascade do |t|
+
+
+ +
+ +   + + +
+
38    t.integer "mission_id"
+
+
+ +
+ +   + + +
+
39    t.integer "user_id"
+
+
+ +
+ +   + + +
+
40  end
+
+
+ +
+ +   + + +
+
41
+
+
+ +
+ +
    + +
  • always add db index (notes => [project_id]) » rails_best_practices
  • + +
+ +
+
+
42  create_table "notes", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
43    t.string   "content"
+
+
+ +
+ +   + + +
+
44    t.integer  "user_id"
+
+
+ +
+ +   + + +
+
45    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
46    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
47    t.integer  "project_id"
+
+
+ +
+ +   + + +
+
48    t.integer  "category"
+
+
+ +
+ +   + + +
+
49  end
+
+
+ +
+ +   + + +
+
50
+
+
+ +
+ +   + + +
+
51  add_index "notes", ["user_id"], name: "index_notes_on_user_id"
+
+
+ +
+ +   + + +
+
52
+
+
+ +
+ +   + + +
+
53  create_table "projects", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
54    t.string   "name"
+
+
+ +
+ +   + + +
+
55    t.string   "content"
+
+
+ +
+ +   + + +
+
56    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
57    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
58  end
+
+
+ +
+ +   + + +
+
59
+
+
+ +
+ +
    + +
  • always add db index (projects_users => [project_id]) » rails_best_practices
  • + +
  • always add db index (projects_users => [user_id]) » rails_best_practices
  • + +
+ +
+
+
60  create_table "projects_users", id: false, force: :cascade do |t|
+
+
+ +
+ +   + + +
+
61    t.integer "project_id"
+
+
+ +
+ +   + + +
+
62    t.integer "user_id"
+
+
+ +
+ +   + + +
+
63  end
+
+
+ +
+ +   + + +
+
64
+
+
+ +
+ +
    + +
  • always add db index (shares => [project_id]) » rails_best_practices
  • + +
  • always add db index (shares => [user_id]) » rails_best_practices
  • + +
+ +
+
+
65  create_table "shares", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
66    t.string   "content"
+
+
+ +
+ +   + + +
+
67    t.datetime "created_at", null: false
+
+
+ +
+ +   + + +
+
68    t.datetime "updated_at", null: false
+
+
+ +
+ +   + + +
+
69    t.integer  "project_id"
+
+
+ +
+ +   + + +
+
70    t.integer  "user_id"
+
+
+ +
+ +   + + +
+
71  end
+
+
+ +
+ +   + + +
+
72
+
+
+ +
+ +   + + +
+
73  create_table "users", force: :cascade do |t|
+
+
+ +
+ +   + + +
+
74    t.string   "name"
+
+
+ +
+ +   + + +
+
75    t.string   "password_digest"
+
+
+ +
+ +   + + +
+
76    t.string   "email"
+
+
+ +
+ +   + + +
+
77    t.datetime "created_at",      null: false
+
+
+ +
+ +   + + +
+
78    t.datetime "updated_at",      null: false
+
+
+ +
+ +   + + +
+
79    t.string   "phone"
+
+
+ +
+ +   + + +
+
80  end
+
+
+ +
+ +   + + +
+
81
+
+
+ +
+ +   + + +
+
82end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/bc1187795f0f6bc820baf63adb995e.html b/reports/metric_fu/output/bc1187795f0f6bc820baf63adb995e.html new file mode 100644 index 0000000..579857c --- /dev/null +++ b/reports/metric_fu/output/bc1187795f0f6bc820baf63adb995e.html @@ -0,0 +1,2542 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class MissionsController < ApplicationController
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :create,
+
+
+ +
+ +   + + +
+
6        :getlist,
+
+
+ +
+ +   + + +
+
7        :detail,
+
+
+ +
+ +   + + +
+
8        :update,
+
+
+ +
+ +   + + +
+
 9        :commentPublish
+
+
+ +
+ +   + + +
+
10    ]
+
+
+ +
+ +   + + +
+
11    #======================================>
+
+
+ +
+ +   + + +
+
12    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method "getlist" has 27 lines. It should have 20 or less. » roodi
  • + +
  • TooManyStatements - has approx 7 statements » reek
  • + +
+ +
+
+
13    def getlist
+
+
+ +
+ +   + + +
+
14    #Todo
+
+
+ +
+ +   + + +
+
15    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
16    stu = params[:status_type]
+
+
+ +
+ +   + + +
+
17    #missions = []
+
+
+ +
+ +   + + +
+
18    details = []
+
+
+ +
+ +   + + +
+
19    missions = Mission.where("project_id = ? AND status = ?",pid,stu).all
+
+
+ +
+ +   + + +
+
20    
+
+
+ +
+ +   + + +
+
21    missions.each do |mission|
+
+
+ +
+ +   + + +
+
22        
+
+
+ +
+ +   + + +
+
23        #puts mission.inspect
+
+
+ +
+ +   + + +
+
24        
+
+
+ +
+ +   + + +
+
25        details += [{
+
+
+ +
+ +   + + +
+
26            :id => mission.id,
+
+
+ +
+ +   + + +
+
27            :name => mission.name,
+
+
+ +
+ +   + + +
+
28            :content => mission.content
+
+
+ +
+ +   + + +
+
29        }]
+
+
+ +
+ +   + + +
+
30        
+
+
+ +
+ +   + + +
+
31    end
+
+
+ +
+ +   + + +
+
32    
+
+
+ +
+ +   + + +
+
33    # Mission.where(:project_id => pid).where(:status => stu) do |i|
+
+
+ +
+ +   + + +
+
34    #     missions += [{
+
+
+ +
+ +   + + +
+
35    #         :id => i.id,
+
+
+ +
+ +   + + +
+
36    #         :name => i.name,
+
+
+ +
+ +   + + +
+
37    #         :content => i.content
+
+
+ +
+ +   + + +
+
38    #     }]
+
+
+ +
+ +   + + +
+
39    # end
+
+
+ +
+ +   + + +
+
40    render :json => {
+
+
+ +
+ +   + + +
+
41        :code => 0,
+
+
+ +
+ +   + + +
+
42        :data => missions
+
+
+ +
+ +   + + +
+
43    }
+
+
+ +
+ +   + + +
+
44    end
+
+
+ +
+ +   + + +
+
45    
+
+
+ +
+ +   + + +
+
46    #======================================>
+
+
+ +
+ +   + + +
+
47    
+
+
+ +
+ +
    + +
  • Complexity 3 » saikuro
  • + +
  • Method "detail" has 24 lines. It should have 20 or less. » roodi
  • + +
  • TooManyStatements - has approx 14 statements » reek
  • + +
  • UncommunicativeVariableName - has the variable name 'c' » reek
  • + +
  • FeatureEnvy - refers to mission more than self » reek
  • + +
+ +
+
+
48    def detail
+
+
+ +
+ +   + + +
+
49    #Todo
+
+
+ +
+ +   + + +
+
50    username = []
+
+
+ +
+ +   + + +
+
51    comments_s = []
+
+
+ +
+ +   + + +
+
52    mission_id = params[:id]
+
+
+ +
+ +   + + +
+
53    mission = Mission.find_by(id: mission_id)
+
+
+ +
+ +   + + +
+
54    m_us = Missions_user.where("mission_id = ?",mission_id).all
+
+
+ +
+ +   + + +
+
55    #puts m_us.inspect
+
+
+ +
+ +   + + +
+
56    m_us.each do |m_u|
+
+
+ +
+ +   + + +
+
57        user_id = m_u.user_id
+
+
+ +
+ +   + + +
+
58        user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
59        #puts user.inspect
+
+
+ +
+ +   + + +
+
60        username << user.name
+
+
+ +
+ +   + + +
+
61    end
+
+
+ +
+ +   + + +
+
62    comments = Comment.where("mission_id = ?",mission_id).all
+
+
+ +
+ +   + + +
+
63    comments.each do |c|
+
+
+ +
+ +   + + +
+
64        uname = User.find_by(id: c.user_id).name
+
+
+ +
+ +   + + +
+
65        comments_s += [{
+
+
+ +
+ +   + + +
+
66            :nickname => uname,
+
+
+ +
+ +   + + +
+
67            :content => c.content,
+
+
+ +
+ +   + + +
+
68            :time => c.created_at
+
+
+ +
+ +   + + +
+
69        }]
+
+
+ +
+ +   + + +
+
70    end
+
+
+ +
+ +   + + +
+
71    #puts comments_s.inspect
+
+
+ +
+ +   + + +
+
72    render :json => {
+
+
+ +
+ +   + + +
+
73        :code => 0,
+
+
+ +
+ +   + + +
+
74        :data => {
+
+
+ +
+ +   + + +
+
75            :name => mission.name,
+
+
+ +
+ +   + + +
+
76            :content => mission.content,
+
+
+ +
+ +   + + +
+
77            :priority => mission.priority,
+
+
+ +
+ +   + + +
+
78            :status => mission.status,
+
+
+ +
+ +   + + +
+
79            :deadline => mission.deadline,
+
+
+ +
+ +   + + +
+
80            :users => username,
+
+
+ +
+ +   + + +
+
81            :comments => comments_s
+
+
+ +
+ +   + + +
+
82        }
+
+
+ +
+ +   + + +
+
83    }
+
+
+ +
+ +   + + +
+
84    end
+
+
+ +
+ +   + + +
+
85     #======================================>
+
+
+ +
+ +   + + +
+
86    
+
+
+ +
+ +
    + +
  • Complexity 3 » saikuro
  • + +
  • DuplicateMethodCall - calls user_enties.id 2 times » reek
  • + +
  • TooManyStatements - has approx 14 statements » reek
  • + +
+ +
+
+
87    def create
+
+
+ +
+ +   + + +
+
88    #Todo
+
+
+ +
+ +   + + +
+
89    params_mission = {name: params[:name],project_id: params[:project_id],content: params[:content],deadline: params[:deadline],priority: params[:priority],status: params[:status]}
+
+
+ +
+ +   + + +
+
90    mission = Mission.new(params_mission)
+
+
+ +
+ +   + + +
+
91    if mission.save
+
+
+ +
+ +   + + +
+
92        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
93    else
+
+
+ +
+ +   + + +
+
94        render json: mission.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
95    end
+
+
+ +
+ +   + + +
+
96    userids = params[:users]
+
+
+ +
+ +   + + +
+
97    userids.each do |id|
+
+
+ +
+ +   + + +
+
98        user_enties = User.find_by(id: id)
+
+
+ +
+ +   + + +
+
 99        #puts user_enties.inspect
+
+
+ +
+ +   + + +
+
100        params_mu = {mission_id: mission.id,user_id: user_enties.id}
+
+
+ +
+ +   + + +
+
101        missions_user = Missions_user.new(params_mu)
+
+
+ +
+ +   + + +
+
102        missions_user.save
+
+
+ +
+ +   + + +
+
103        content = " <a>"+mission.name+"</a>"
+
+
+ +
+ +   + + +
+
104        
+
+
+ +
+ +   + + +
+
105        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
+
+
+ +
+ +   + + +
+
106        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
107        note.save
+
+
+ +
+ +   + + +
+
108    end
+
+
+ +
+ +   + + +
+
109    end
+
+
+ +
+ +   + + +
+
110    
+
+
+ +
+ +   + + +
+
111    #======================================>
+
+
+ +
+ +   + + +
+
112    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method "update" has 23 lines. It should have 20 or less. » roodi
  • + +
  • DuplicateMethodCall - calls user_enties.id 2 times » reek
  • + +
  • TooManyStatements - has approx 17 statements » reek
  • + +
+ +
+
+
113    def update
+
+
+ +
+ +   + + +
+
114    #Todo
+
+
+ +
+ +   + + +
+
115    
+
+
+ +
+ +   + + +
+
116    id = params[:id]
+
+
+ +
+ +   + + +
+
117    #now = Datetime.now
+
+
+ +
+ +   + + +
+
118    mission = Mission.find_by(id: id)
+
+
+ +
+ +   + + +
+
119    params_mission = {name: params[:name],content: params[:content],deadline: params[:deadline],priority: params[:priority]}
+
+
+ +
+ +   + + +
+
120    #puts params_mission
+
+
+ +
+ +   + + +
+
121    mission.update(params_mission)
+
+
+ +
+ +   + + +
+
122    mission.save
+
+
+ +
+ +   + + +
+
123    Missions_user.delete_all(["mission_id = ?",id])
+
+
+ +
+ +   + + +
+
124    userids = params[:users]
+
+
+ +
+ +   + + +
+
125    userids.each do |name|
+
+
+ +
+ +   + + +
+
126        user_enties = User.find_by(id: id)
+
+
+ +
+ +   + + +
+
127        params = {mission_id: id,user_id: user_enties.id}
+
+
+ +
+ +   + + +
+
128        missions_user = Missions_user.new(params)
+
+
+ +
+ +   + + +
+
129        missions_user.save
+
+
+ +
+ +   + + +
+
130        content = "<a>"+mission.name + "</a> "
+
+
+ +
+ +   + + +
+
131        
+
+
+ +
+ +   + + +
+
132        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
+
+
+ +
+ +   + + +
+
133        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
134        note.save
+
+
+ +
+ +   + + +
+
135    end
+
+
+ +
+ +   + + +
+
136    render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
137    end
+
+
+ +
+ +   + + +
+
138    
+
+
+ +
+ +   + + +
+
139    #======================================>
+
+
+ +
+ +   + + +
+
140    
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
  • Method name "commentPublish" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ » roodi
  • + +
  • TooManyStatements - has approx 7 statements » reek
  • + +
  • UncommunicativeMethodName - has the name 'commentPublish' » reek
  • + +
+ +
+
+
141    def commentPublish
+
+
+ +
+ +   + + +
+
142    #Todo
+
+
+ +
+ +   + + +
+
143    mission_id = params[:mission_id]
+
+
+ +
+ +   + + +
+
144    content = params[:content]
+
+
+ +
+ +   + + +
+
145    user_id = session[:user_id]
+
+
+ +
+ +   + + +
+
146    params = {content: content, mission_id: mission_id, user_id: user_id}
+
+
+ +
+ +   + + +
+
147    comment = Comment.new(params)
+
+
+ +
+ +   + + +
+
148    if comment.save
+
+
+ +
+ +   + + +
+
149        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
150    else
+
+
+ +
+ +   + + +
+
151        render json: mission.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
152    end
+
+
+ +
+ +   + + +
+
153    end
+
+
+ +
+ +   + + +
+
154end
+
+ +
+ + diff --git a/reports/metric_fu/output/bd236a15491f27071ae7eff32d9569.html b/reports/metric_fu/output/bd236a15491f27071ae7eff32d9569.html new file mode 100644 index 0000000..82f6527 --- /dev/null +++ b/reports/metric_fu/output/bd236a15491f27071ae7eff32d9569.html @@ -0,0 +1,623 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Share < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    validates :content, presence: true
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
6    
+
+
+ +
+ +   + + +
+
7    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    validate :share_has_atleast_one_character 
+
+
+ +
+ +   + + +
+
10    validate :user_exists,on: :create
+
+
+ +
+ +   + + +
+
11    validate :project_exists,on: :create
+
+
+ +
+ +   + + +
+
12    private 
+
+
+ +
+ +   + + +
+
13        def share_has_atleast_one_character
+
+
+ +
+ +   + + +
+
14            tmp = content.strip
+
+
+ +
+ +   + + +
+
15            if tmp.length < 1
+
+
+ +
+ +   + + +
+
16                errors[:content] = "share content should has at least one character"
+
+
+ +
+ +   + + +
+
17            end
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +   + + +
+
20        def user_exists
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to Share is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        def project_exists
+
+
+ +
+ +   + + +
+
29            
+
+
+ +
+ +   + + +
+
30            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
31            if project == nil
+
+
+ +
+ +   + + +
+
32                errors[:project] = "user belong to Share is not exist"
+
+
+ +
+ +   + + +
+
33            end
+
+
+ +
+ +   + + +
+
34        
+
+
+ +
+ +   + + +
+
35        end    
+
+
+ +
+ +   + + +
+
36    
+
+
+ +
+ +   + + +
+
37end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/bee33d336c194b40053da6e55f73ab.html b/reports/metric_fu/output/bee33d336c194b40053da6e55f73ab.html new file mode 100644 index 0000000..90dcc17 --- /dev/null +++ b/reports/metric_fu/output/bee33d336c194b40053da6e55f73ab.html @@ -0,0 +1,738 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Comment < ActiveRecord::Base
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2    
+
+
+ +
+ +   + + +
+
3    belongs_to :mission
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :content, presence: true
+
+
+ +
+ +   + + +
+
6    validates :mission_id, presence: true
+
+
+ +
+ +   + + +
+
7    
+
+
+ +
+ +   + + +
+
8    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
 9    validate :comment_has_atleast_one_character, on: :create
+
+
+ +
+ +   + + +
+
10    validate :user_id_exist, on: :create
+
+
+ +
+ +   + + +
+
11    
+
+
+ +
+ +   + + +
+
12    private 
+
+
+ +
+ +   + + +
+
13    
+
+
+ +
+ +   + + +
+
14      
+
+
+ +
+ +   + + +
+
15        def comment_has_atleast_one_character
+
+
+ +
+ +   + + +
+
16            tmp = content.strip
+
+
+ +
+ +   + + +
+
17            if tmp.length < 1
+
+
+ +
+ +   + + +
+
18                errors[:content] = 'content should has at least one character'
+
+
+ +
+ +   + + +
+
19            end
+
+
+ +
+ +   + + +
+
20        end
+
+
+ +
+ +   + + +
+
21        
+
+
+ +
+ +   + + +
+
22        
+
+
+ +
+ +   + + +
+
23        def user_id_exist
+
+
+ +
+ +   + + +
+
24            
+
+
+ +
+ +   + + +
+
25            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
26            if user == nil
+
+
+ +
+ +   + + +
+
27                errors[:user] = "user is not exist"
+
+
+ +
+ +   + + +
+
28            end
+
+
+ +
+ +   + + +
+
29    
+
+
+ +
+ +   + + +
+
30        end
+
+
+ +
+ +   + + +
+
31        
+
+
+ +
+ +   + + +
+
32        
+
+
+ +
+ +   + + +
+
33        # mission controller
+
+
+ +
+ +   + + +
+
34        
+
+
+ +
+ +   + + +
+
35        # def mission_id_should_be_exist
+
+
+ +
+ +   + + +
+
36            
+
+
+ +
+ +   + + +
+
37        #     @mission = Mission.find(:mission_id)
+
+
+ +
+ +   + + +
+
38            
+
+
+ +
+ +   + + +
+
39        #     if @mission == nil
+
+
+ +
+ +   + + +
+
40        #         errors[:mission_id] = "mission is not exist"
+
+
+ +
+ +   + + +
+
41        #     end
+
+
+ +
+ +   + + +
+
42        # end    
+
+
+ +
+ +   + + +
+
43    
+
+
+ +
+ +   + + +
+
44end
+
+ +
+ + diff --git a/reports/metric_fu/output/bluff-min.js b/reports/metric_fu/output/bluff-min.js new file mode 100644 index 0000000..3a80df0 --- /dev/null +++ b/reports/metric_fu/output/bluff-min.js @@ -0,0 +1 @@ +Bluff={VERSION:'0.3.6',array:function(c){if(c.length===undefined)return[c];var d=[],f=c.length;while(f--)d[f]=c[f];return d},array_new:function(c,d){var f=[];while(c--)f.push(d);return f},each:function(c,d,f){for(var g=0,h=c.length;gthis._5)?g.length:this._5;Bluff.each(g,function(c,d){if(c===undefined)return;if(this.maximum_value===null&&this.minimum_value===null)this.maximum_value=this.minimum_value=c;this.maximum_value=this._1f(c)?c:this.maximum_value;if(this.maximum_value>=0)this._a=true;this.minimum_value=this._1A(c)?c:this.minimum_value;if(this.minimum_value<0)this._a=true},this)},draw:function(){if(this.stacked)this._1B();this._1C();this._u(function(){this._0.rectangle(this.left_margin,this.top_margin,this._d-this.right_margin,this._L-this.bottom_margin);this._0.rectangle(this._1,this._7,this._l,this._g)})},clear:function(){this._X()},_1C:function(){if(!this._a)return this._1D();this._13();this._1E();if(this.sort)this._1F();this._1G();this._M();this._1H();this._1I()},_13:function(g){if(this._9===null||g===true){this._9=[];if(!this._a)return;this._1g();Bluff.each(this._2,function(d){var f=[];Bluff.each(d[this.klass.DATA_VALUES_INDEX],function(c){if(c===null||c===undefined)f.push(null);else f.push((c-this.minimum_value)/this._i)},this);this._9.push([d[this.klass.DATA_LABEL_INDEX],f,d[this.klass.DATA_COLOR_INDEX]])},this)}},_1g:function(){this._i=this.maximum_value-this.minimum_value;this._i=this._i>0?this._i:1;this._1h=100/Math.pow(10,Math.round(Math.LOG10E*Math.log(this._i)))},_1E:function(){this._N=this.hide_line_markers?0:this._D(this.marker_font_size);this._1i=this.hide_title?0:this._D(this.title_font_size);this._1j=this.hide_legend?0:this._D(this.legend_font_size);var c,d,f,g,h,i,j;if(this.hide_line_markers){this._1=this.left_margin;this._14=this.right_margin;this._1k=this.bottom_margin}else{d=0;if(this.has_left_labels){c='';for(j in this.labels){c=c.length>this.labels[j].length?c:this.labels[j]}d=this._O(this.marker_font_size,c)*1.25}else{d=this._O(this.marker_font_size,this._15(this.maximum_value))}f=this.hide_line_numbers&&!this.has_left_labels?0.0:d+this.klass.LABEL_MARGIN*2;this._1=this.left_margin+f+(this.y_axis_label===null?0.0:this._N+this.klass.LABEL_MARGIN*2);g=-Infinity;for(j in this.labels)g=g>Number(j)?g:Number(j);g=Math.round(g);h=(g>=(this._5-1)&&this.center_labels_over_point)?this._O(this.marker_font_size,this.labels[g])/2:0;this._14=this.right_margin+h;this._1k=this.bottom_margin+this._N+this.klass.LABEL_MARGIN}this._l=this._d-this._14;this._6=this._d-this._1-this._14;this._7=this.top_margin+(this.hide_title?this.title_margin:this._1i+this.title_margin)+(this.hide_legend?this.legend_margin:this._1j+this.legend_margin);i=(this.x_axis_label===null)?0.0:this._N+this.klass.LABEL_MARGIN;this._g=this._L-this._1k-i;this._3=this._g-this._7},_1H:function(){if(this.x_axis_label){var c=this._g+this.klass.LABEL_MARGIN*2+this._N;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(this._d,1.0,0.0,c,this.x_axis_label,this._b);this._u(function(){this._0.line(0.0,c,this._d,c)})}},_M:function(){if(this.hide_line_markers)return;if(this.y_axis_increment===null){if(this.marker_count===null){Bluff.each([3,4,5,6,7],function(c){if(!this.marker_count&&this._i%c===0)this.marker_count=c},this);this.marker_count=this.marker_count||4}this._16=(this._i>0)?this._17(this._i/this.marker_count):1}else{this.maximum_value=Math.max(Math.ceil(this.maximum_value),this.y_axis_increment);this.minimum_value=Math.floor(this.minimum_value);this._1g();this._13(true);this.marker_count=Math.round(this._i/this.y_axis_increment);this._16=this.y_axis_increment}this._1J=this._3/(this._i/this._16);var d,f,g,h;for(d=0,f=this.marker_count;d<=f;d++){g=this._7+this._3-d*this._1J;this._0.stroke=this.marker_color;this._0.stroke_width=1;this._0.line(this._1,g,this._l,g);h=d*this._16+this.minimum_value;if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.font_weight='normal';this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(this._1-this.klass.LABEL_MARGIN,1.0,0.0,g,this._15(h),this._b)}}},_1l:function(c){return(this._d-c)/2},_1G:function(){if(this.hide_legend)return;this._P=Bluff.map(this._2,function(c){return c[this.klass.DATA_LABEL_INDEX]},this);var i=this.legend_box_size;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var j=[[]];Bluff.each(this._P,function(c){var d=j.length-1;var f=this._0.get_type_metrics(c);var g=f.width+i*2.7;j[d].push(g);if(Bluff.sum(j[d])>(this._d*0.9))j.push([j[d].pop()])},this);var k=this._1l(Bluff.sum(j[0]));var l=this.hide_title?this.top_margin+this.title_margin:this.top_margin+this.title_margin+this._1i;this._u(function(){this._0.stroke_width=1;this._0.line(0,l,this._d,l)});Bluff.each(this._P,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._d,1.0,k+(i*1.7),l,c,this._b);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(k,l-i/2.0,k+i,l+i/2.0);this._0.pointsize=this.legend_font_size;var f=this._0.get_type_metrics(c);var g=f.width+(i*2.7),h;j[0].shift();if(j[0].length==0){this._u(function(){this._0.line(0.0,l,this._d,l)});j.shift();if(j.length>0)k=this._1l(Bluff.sum(j[0]));h=Math.max(this._1j,i)+this.legend_margin;if(j.length>0){l+=h;this._7+=h;this._3=this._g-this._7}}else{k+=g}},this);this._m=0},_1I:function(){if(this.hide_title||!this.title)return;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.title_font_size);this._0.font_weight='bold';this._0.gravity='north';this._0.annotate_scaled(this._d,1.0,0,this.top_margin,this.title,this._b)},_c:function(c,d){if(this.hide_line_markers)return;var f;if(this.labels[d]&&!this._q[d]){f=this._g+this.klass.LABEL_MARGIN;this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='north';this._0.annotate_scaled(1.0,1.0,c,f,this.labels[d],this._b);this._q[d]=true;this._u(function(){this._0.stroke_width=1;this._0.line(0.0,f,this._d,f)})}},_E:function(c,d,f,g,h,i,j){if(!this.tooltips)return;this._0.tooltip(c,d,f,g,h,i,j)},_1D:function(){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(80);this._0.gravity='center';this._0.annotate_scaled(this._d,this._L/2,0,10,this.no_data_message,this._b)},_X:function(){var c=this._k.background_colors;switch(true){case c instanceof Array:this._1K.apply(this,c);break;case typeof c==='string':this._1L(c);break;default:this._1M(this._k.background_image);break}},_1L:function(c){this._0.render_solid_background(this._j,this._y,c)},_1K:function(c,d){this._0.render_gradiated_background(this._j,this._y,c,d)},_1M:function(c){},_1e:function(){this._m=0;this._q={};this._k={};this._0.scale(this._b,this._b)},_2a:function(c){return this._b*c},_e:function(c){var d=c*this._b;return d},_Q:function(c,d){return(c>d)?d:c},_1f:function(c,d){return c>this.maximum_value},_1A:function(c,d){return c100){c/=10;d*=10}return Math.floor(c)*d},_1F:function(){var f=this._1N,g=this.klass.DATA_VALUES_INDEX;this._9.sort(function(c,d){return f(d[g])-f(c[g])});this._2.sort(function(c,d){return f(d[g])-f(c[g])})},_1N:function(d){var f=0;Bluff.each(d,function(c){f+=(c||0)});return f},_1B:function(){var g=[],h=this._5;while(h--)g[h]=0;Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){g[d]+=c},this);f[this.klass.DATA_VALUES_INDEX]=Bluff.array(g)},this)},_u:function(c){if(this.klass.DEBUG){this._0.fill='transparent';this._0.stroke='turquoise';c.call(this)}},_1z:function(){if(this._m0&&k>0){i.push(f);i.push(g)}else{i.push(this._1);i.push(this._g-1);i.push(f);i.push(g)}this._c(f,d);j=f;k=g},this);i.push(this._l);i.push(this._g-1);i.push(this._1);i.push(this._g-1);this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(i)},this)}});Bluff.BarConversion=new JS.Class({mode:null,zero:null,graph_top:null,graph_height:null,minimum_value:null,spread:null,getLeftYRightYscaled:function(c,d){var f;switch(this.mode){case 1:d[0]=this.graph_top+this.graph_height*(1-c)+1;d[1]=this.graph_top+this.graph_height-1;break;case 2:d[0]=this.graph_top+1;d[1]=this.graph_top+this.graph_height*(1-c)-1;break;case 3:f=c-this.minimum_value/this.spread;if(c>=this.zero){d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}else{d[0]=this.graph_top+this.graph_height*(1-(f-this.zero))+1;d[1]=this.graph_top+this.graph_height*(1-this.zero)-1}break;default:d[0]=0.0;d[1]=0.0}}});Bluff.Bar=new JS.Class(Bluff.Base,{bar_spacing:0.9,draw:function(){this.center_labels_over_point=(Bluff.keys(this.labels).length>this._5);this.callSuper();if(!this._a)return;this._1O()},_1O:function(){this._8=this._6/(this._5*this._2.length);var n=(this._8*(1-this.bar_spacing))/2;this._0.stroke_opacity=0.0;var m=new Bluff.BarConversion();m.graph_height=this._3;m.graph_top=this._7;if(this.minimum_value>=0){m.mode=1}else{if(this.maximum_value<=0){m.mode=2}else{m.mode=3;m.spread=this._i;m.minimum_value=this.minimum_value;m.zero=-this.minimum_value/this._i}}Bluff.each(this._9,function(j,k){var l=this._2[k][this.klass.DATA_VALUES_INDEX];Bluff.each(j[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*(k+d+((this._2.length-1)*d)))+n;var g=f+this._8*this.bar_spacing;var h=[];m.getLeftYRightYscaled(c,h);this._0.fill=j[this.klass.DATA_COLOR_INDEX];this._0.rectangle(f,h[0],g,h[1]);this._E(f,h[0],g-f,h[1]-h[0],j[this.klass.DATA_LABEL_INDEX],j[this.klass.DATA_COLOR_INDEX],l[d]);var i=this._1+(this._2.length*this._8*d)+(this._2.length*this._8/2.0);this._c(i-(this.center_labels_over_point?this._8/2.0:0.0),d)},this)},this);if(this.center_labels_over_point)this._c(this._l,this._5)}});Bluff.Line=new JS.Class(Bluff.Base,{baseline_value:null,baseline_color:null,line_width:null,dot_radius:null,hide_dots:null,hide_lines:null,initialize:function(c){if(arguments.length>3)throw'Wrong number of arguments';if(arguments.length===1||(typeof arguments[1]!=='number'&&typeof arguments[1]!=='string'))this.callSuper(c,null);else this.callSuper();this.hide_dots=this.hide_lines=false;this.baseline_color='red';this.baseline_value=null},draw:function(){this.callSuper();if(!this._a)return;this.x_increment=(this._5>1)?(this._6/(this._5-1)):this._6;var m;if(this._S!==undefined){m=this._7+(this._3-this._S*this._3);this._0.push();this._0.stroke=this.baseline_color;this._0.fill_opacity=0.0;this._0.stroke_width=3.0;this._0.line(this._1,m,this._1+this._6,m);this._0.pop()}Bluff.each(this._9,function(i,j){var k=null,l=null;var n=this._2[j][this.klass.DATA_VALUES_INDEX];this._1P=this._1Q(i);Bluff.each(i[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this.x_increment*d);if(typeof c!=='number')return;this._c(f,d);var g=this._7+(this._3-c*this._3);this._0.stroke=i[this.klass.DATA_COLOR_INDEX];this._0.fill=i[this.klass.DATA_COLOR_INDEX];this._0.stroke_opacity=1.0;this._0.stroke_width=this.line_width||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*6),3.0);var h=this.dot_radius||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*2),7.0);if(!this.hide_lines&&k!==null&&l!==null){this._0.line(k,l,f,g)}else if(this._1P){this._0.circle(f,g,f-h,g)}if(!this.hide_dots)this._0.circle(f,g,f-h,g);this._E(f-h,g-h,2*h,2*h,i[this.klass.DATA_LABEL_INDEX],i[this.klass.DATA_COLOR_INDEX],n[d]);k=f;l=g},this)},this)},_13:function(){this.maximum_value=Math.max(this.maximum_value,this.baseline_value);this.callSuper();if(this.baseline_value!==null)this._S=this.baseline_value/this.maximum_value},_1Q:function(d){var f=0;Bluff.each(d[this.klass.DATA_VALUES_INDEX],function(c){if(c!==undefined)f+=1});return f===1}});Bluff.Dot=new JS.Class(Bluff.Base,{draw:function(){this.has_left_labels=true;this.callSuper();if(!this._a)return;var k=1.0;this._F=this._3/this._5;this._18=this._F*k/this._9.length;this._0.stroke_opacity=0.0;var l=Bluff.array_new(this._5,0),n=Bluff.array_new(this._5,this._1),m=(this._F*(1-k))/2;Bluff.each(this._9,function(i,j){Bluff.each(i[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(c*this._6)-Math.round(this._18/6.0);var g=this._7+(this._F*d)+m+Math.round(this._18/2.0);if(j===0){this._0.stroke=this.marker_color;this._0.stroke_width=1.0;this._0.opacity=0.1;this._0.line(this._1,g,this._1+this._6,g)}this._0.fill=i[this.klass.DATA_COLOR_INDEX];this._0.stroke='transparent';this._0.circle(f,g,f+Math.round(this._18/3.0),g);var h=this._7+(this._F*d+this._F/2)+m;this._c(h,d)},this)},this)},_M:function(){if(this.hide_line_markers)return;this._0.stroke_antialias=false;this._0.stroke_width=1;var c=5;var d=this._17(this.maximum_value/c);for(var f=0;f<=c;f++){var g=(this._l-this._1)/c,h=this._l-(g*f)-1,i=f-c,j=Math.abs(i)*d;this._0.stroke=this.marker_color;this._0.line(h,this._g,h,this._g+0.5*this.klass.LABEL_MARGIN);if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='center';this._0.annotate_scaled(0,0,h,this._g+(this.klass.LABEL_MARGIN*2.0),j,this._b)}this._0.stroke_antialias=true}},_c:function(c,d){if(this.labels[d]&&!this._q[d]){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(1,1,this._1-this.klass.LABEL_MARGIN*2.0,c,this.labels[d],this._b);this._q[d]=true}}});Bluff.Net=new JS.Class(Bluff.Base,{hide_dots:null,line_width:null,dot_radius:null,initialize:function(){this.callSuper();this.hide_dots=false;this.hide_line_numbers=true},draw:function(){this.callSuper();if(!this._a)return;this._v=this._3/2.0;this._w=this._1+(this._6/2.0);this._x=this._7+(this._3/2.0)-10;this._R=this._6/(this._5-1);var s=this.dot_radius||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*2.5),7.0);this._0.stroke_opacity=1.0;this._0.stroke_width=this.line_width||this._Q(this._j/(this._9[0][this.klass.DATA_VALUES_INDEX].length*4),3.0);var r;if(this._S!==undefined){r=this._7+(this._3-this._S*this._3);this._0.push();this._0.stroke_color=this.baseline_color;this._0.fill_opacity=0.0;this._0.stroke_width=5;this._0.line(this._1,r,this._1+this._6,r);this._0.pop()}Bluff.each(this._9,function(o){var p=null,q=null;Bluff.each(o[this.klass.DATA_VALUES_INDEX],function(c,d){if(c===undefined)return;var f=d*Math.PI*2/this._5,g=c*this._v,h=this._w+Math.sin(f)*g,i=this._x-Math.cos(f)*g,j=(d+10){this._0.fill=c[this.klass.DATA_COLOR_INDEX];var f=(c[this.klass.DATA_VALUES_INDEX][0]/o)*360;this._0.circle(n,m,n+k,m,p,p+f+0.5);var g=p+((p+f)-p)/2,h=Math.round((c[this.klass.DATA_VALUES_INDEX][0]/o)*100.0),i;if(h>=this.hide_labels_less_than){i=this._15(c[this.klass.DATA_VALUES_INDEX][0]);this._c(n,m,g,k+(k*this.klass.TEXT_OFFSET_PERCENTAGE),i)}p+=f}},this)},_c:function(c,d,f,g,h){var i=20.0,j=c,k=d,l=g+i,n=l*0.15,m=j+((l+n)*Math.cos(f*Math.PI/180)),o=k+(l*Math.sin(f*Math.PI/180));this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.marker_font_size);this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,m,o,h,this._b)},_1R:function(){var d=0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.SideBar=new JS.Class(Bluff.Base,{bar_spacing:0.9,draw:function(){this.has_left_labels=true;this.callSuper();if(!this._a)return;this._G=this._3/this._5;this._8=this._G*this.bar_spacing/this._9.length;this._0.stroke_opacity=0.0;var q=Bluff.array_new(this._5,0),s=Bluff.array_new(this._5,this._1),r=(this._G*(1-this.bar_spacing))/2;Bluff.each(this._9,function(m,o){var p=this._2[o][this.klass.DATA_VALUES_INDEX];Bluff.each(m[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-q[d]),g=this._1+this._6-q[d],h=g-f,i=s[d]-1,j=this._7+(this._G*d)+(this._8*o)+r,k=i+h,l=j+this._8;q[d]+=(c*this._6);this._0.stroke='transparent';this._0.fill=m[this.klass.DATA_COLOR_INDEX];this._0.rectangle(i,j,k,l);this._E(i,j,k-i,l-j,m[this.klass.DATA_LABEL_INDEX],m[this.klass.DATA_COLOR_INDEX],p[d]);var n=this._7+(this._G*d+this._G/2);this._c(n,d)},this)},this)},_M:function(){if(this.hide_line_markers)return;this._0.stroke_antialias=false;this._0.stroke_width=1;var c=5;var d=this._17(this.maximum_value/c),f,g,h,i;for(var j=0;j<=c;j++){f=(this._l-this._1)/c;g=this._l-(f*j)-1;h=j-c;i=Math.abs(h)*d;this._0.stroke=this.marker_color;this._0.line(g,this._g,g,this._7);if(!this.hide_line_numbers){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='center';this._0.annotate_scaled(0,0,g,this._g+(this.klass.LABEL_MARGIN*2.0),i,this._b)}}},_c:function(c,d){if(this.labels[d]&&!this._q[d]){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.stroke='transparent';this._0.font_weight='normal';this._0.pointsize=this._e(this.marker_font_size);this._0.gravity='east';this._0.annotate_scaled(1,1,this._1-this.klass.LABEL_MARGIN*2.0,c,this.labels[d],this._b);this._q[d]=true}}});Bluff.Spider=new JS.Class(Bluff.Base,{hide_text:null,hide_axes:null,transparent_background:null,initialize:function(c,d,f){this.callSuper(c,f);this._1S=d;this.hide_legend=true},draw:function(){this.hide_line_markers=true;this.callSuper();if(!this._a)return;var c=this._3,d=this._3/2.0,f=this._1+(this._6-c)/2.0,g=this._1+(this._6/2.0),h=this._7+(this._3/2.0)-25;this._1T=d/this._1S;var i=this._1U(),j=0.0,k=(2*Math.PI)/this._2.length,l=0.0;if(!this.hide_axes)this._1V(g,h,d,k);this._1W(g,h,k)},_1n:function(c){return c*this._1T},_c:function(c,d,f,g,h){var i=50,j=c,k=d+0,l=j+((g+i)*Math.cos(f)),n=k+((g+i)*Math.sin(f));this._0.fill=this.marker_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='bold';this._0.gravity='center';this._0.annotate_scaled(0,0,l,n,h,this._b)},_1V:function(g,h,i,j,k){if(this.hide_axes)return;var l=0.0;Bluff.each(this._2,function(c){this._0.stroke=k||c[this.klass.DATA_COLOR_INDEX];this._0.stroke_width=5.0;var d=i*Math.cos(l);var f=i*Math.sin(l);this._0.line(g,h,g+d,h+f);if(!this.hide_text)this._c(g,h,l,i,c[this.klass.DATA_LABEL_INDEX]);l+=j},this)},_1W:function(d,f,g,h){var i=[],j=0.0;Bluff.each(this._2,function(c){i.push(d+this._1n(c[this.klass.DATA_VALUES_INDEX][0])*Math.cos(j));i.push(f+this._1n(c[this.klass.DATA_VALUES_INDEX][0])*Math.sin(j));j+=g},this);this._0.stroke_width=1.0;this._0.stroke=h||this.marker_color;this._0.fill=h||this.marker_color;this._0.fill_opacity=0.4;this._0.polyline(i)},_1U:function(){var d=0.0;Bluff.each(this._2,function(c){d+=c[this.klass.DATA_VALUES_INDEX][0]},this);return d}});Bluff.Base.StackedMixin=new JS.Module({_19:function(){var g={};Bluff.each(this._2,function(f){Bluff.each(f[this.klass.DATA_VALUES_INDEX],function(c,d){if(!g[d])g[d]=0.0;g[d]+=c},this)},this);for(var h in g){if(g[h]>this.maximum_value)this.maximum_value=g[h]}this.minimum_value=0}});Bluff.StackedArea=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,last_series_goes_on_bottom:null,draw:function(){this._19();this.callSuper();if(!this._a)return;this._R=this._6/(this._5-1);this._0.stroke='transparent';var n=Bluff.array_new(this._5,0);var m=null;var o=this.last_series_goes_on_bottom?'reverse_each':'each';Bluff[o](this._9,function(h){var i=m;m=[];Bluff.each(h[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._R*d);var g=this._7+(this._3-c*this._3-n[d]);n[d]+=(c*this._3);m.push(f);m.push(g);this._c(f,d)},this);var j,k,l;if(i){j=Bluff.array(m);for(k=i.length/2-1;k>=0;k--){j.push(i[2*k]);j.push(i[2*k+1])}j.push(m[0]);j.push(m[1])}else{j=Bluff.array(m);j.push(this._l);j.push(this._g-1);j.push(this._1);j.push(this._g-1);j.push(m[0]);j.push(m[1])}this._0.fill=h[this.klass.DATA_COLOR_INDEX];this._0.polyline(j)},this)}});Bluff.StackedBar=new JS.Class(Bluff.Base,{include:Bluff.Base.StackedMixin,bar_spacing:0.9,draw:function(){this._19();this.callSuper();if(!this._a)return;this._8=this._6/this._5;var m=(this._8*(1-this.bar_spacing))/2;this._0.stroke_opacity=0.0;var o=Bluff.array_new(this._5,0);Bluff.each(this._9,function(k,l){var n=this._2[l][this.klass.DATA_VALUES_INDEX];Bluff.each(k[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._8*d)+(this._8*this.bar_spacing/2.0);this._c(f,d);if(c==0)return;var g=this._1+(this._8*d)+m;var h=this._7+(this._3-c*this._3-o[d])+1;var i=g+this._8*this.bar_spacing;var j=this._7+this._3-o[d]-1;o[d]+=(c*this._3);this._0.fill=k[this.klass.DATA_COLOR_INDEX];this._0.rectangle(g,h,i,j);this._E(g,h,i-g,j-h,k[this.klass.DATA_LABEL_INDEX],k[this.klass.DATA_COLOR_INDEX],n[d])},this)},this)}});Bluff.AccumulatorBar=new JS.Class(Bluff.StackedBar,{draw:function(){if(this._2.length!==1)throw'Incorrect number of datasets';var g=[],h=0,i=[];Bluff.each(this._2[0][this.klass.DATA_VALUES_INDEX],function(d){var f=-Infinity;Bluff.each(i,function(c){f=Math.max(f,c)});i.push((h>0)?(d+f):d);g.push(i[h]-d);h+=1},this);this.data("Accumulator",g);this.callSuper()}});Bluff.SideStackedBar=new JS.Class(Bluff.SideBar,{include:Bluff.Base.StackedMixin,bar_spacing:0.9,draw:function(){this.has_left_labels=true;this._19();this.callSuper();if(!this._a)return;this._8=this._3/this._5;var q=Bluff.array_new(this._5,0),s=Bluff.array_new(this._5,this._1),r=(this._8*(1-this.bar_spacing))/2;Bluff.each(this._9,function(m,o){this._0.fill=m[this.klass.DATA_COLOR_INDEX];var p=this._2[o][this.klass.DATA_VALUES_INDEX];Bluff.each(m[this.klass.DATA_VALUES_INDEX],function(c,d){var f=this._1+(this._6-c*this._6-q[d])+1;var g=this._1+this._6-q[d]-1;var h=g-f;var i=s[d],j=this._7+(this._8*d)+r,k=i+h,l=j+this._8*this.bar_spacing;s[d]+=h;q[d]+=(c*this._6-2);this._0.rectangle(i,j,k,l);this._E(i,j,k-i,l-j,m[this.klass.DATA_LABEL_INDEX],m[this.klass.DATA_COLOR_INDEX],p[d]);var n=this._7+(this._8*d)+(this._8*this.bar_spacing/2.0);this._c(n,d)},this)},this)},_1f:function(c,d){d=d||0;return this._1m(c,d)>this.maximum_value},_1m:function(d,f){var g=0;Bluff.each(this._2,function(c){g+=c[this.klass.DATA_VALUES_INDEX][f]},this);return g}});Bluff.Mini.Legend=new JS.Module({hide_mini_legend:false,_1a:function(){if(this.hide_mini_legend)return;this._1X=this._L;this._y+=this._2.length*this._D(this._e(this.legend_font_size))*1.7;this._X()},_1b:function(){if(this.hide_mini_legend)return;this._P=Bluff.map(this._2,function(c){return c[this.klass.DATA_LABEL_INDEX]},this);var f=40.0,g=10.0,h=100.0,i=40.0;if(this.font)this._0.font=this.font;this._0.pointsize=this.legend_font_size;var j=h,k=this._1X+i;this._u(function(){this._0.line(0.0,k,this._d,k)});Bluff.each(this._P,function(c,d){this._0.fill=this.font_color;if(this.font)this._0.font=this.font;this._0.pointsize=this._e(this.legend_font_size);this._0.stroke='transparent';this._0.font_weight='normal';this._0.gravity='west';this._0.annotate_scaled(this._d,1.0,j+(f*1.7),k,this._1Y(c),this._b);this._0.stroke='transparent';this._0.fill=this._2[d][this.klass.DATA_COLOR_INDEX];this._0.rectangle(j,k-f/2.0,j+f,k+f/2.0);k+=this._D(this.legend_font_size)*1.7},this);this._m=0},_1Y:function(c){var d=String(c);while(this._O(this._e(this.legend_font_size),d)>(this._j-this.legend_left_margin-this.right_margin)&&(d.length>1))d=d.substr(0,d.length-1);return d+(d.length=1?(c*i):1;var k=(d*i)>=1?(d*i):1;var h=this._T(this.pointsize,h);h.style.color=this.fill;h.style.fontWeight=this.font_weight;h.style.textAlign='center';h.style.left=(this._f*f+this._1Z(h,j))+'px';h.style.top=(this._h*g+this._20(h,k))+'px'},tooltip:function(d,f,g,h,i,j,k){if(g<0)d+=g;if(h<0)f+=h;var l=this._n.parentNode,n=document.createElement('div');n.className=this.klass.TARGET_CLASS;n.style.position='absolute';n.style.left=(this._f*d-3)+'px';n.style.top=(this._h*f-3)+'px';n.style.width=(this._f*Math.abs(g)+5)+'px';n.style.height=(this._h*Math.abs(h)+5)+'px';n.style.fontSize=0;n.style.overflow='hidden';Bluff.Event.observe(n,'mouseover',function(c){Bluff.Tooltip.show(i,j,k)});Bluff.Event.observe(n,'mouseout',function(c){Bluff.Tooltip.hide()});l.appendChild(n)},circle:function(c,d,f,g,h,i){var j=Math.sqrt(Math.pow(f-c,2)+Math.pow(g-d,2));this._4.fillStyle=this.fill;this._4.beginPath();var k=(h||0)*Math.PI/180;var l=(i||360)*Math.PI/180;if(h!==undefined&&i!==undefined){this._4.moveTo(this._f*(c+j*Math.cos(l)),this._h*(d+j*Math.sin(l)));this._4.lineTo(this._f*c,this._h*d);this._4.lineTo(this._f*(c+j*Math.cos(k)),this._h*(d+j*Math.sin(k)))}this._4.arc(this._f*c,this._h*d,this._f*j,k,l,false);this._4.fill()},line:function(c,d,f,g){this._4.strokeStyle=this.stroke;this._4.lineWidth=this.stroke_width;this._4.beginPath();this._4.moveTo(this._f*c,this._h*d);this._4.lineTo(this._f*f,this._h*g);this._4.stroke()},polyline:function(c){this._4.fillStyle=this.fill;this._4.globalAlpha=this.fill_opacity||1;try{this._4.strokeStyle=this.stroke}catch(e){}var d=c.shift(),f=c.shift();this._4.beginPath();this._4.moveTo(this._f*d,this._h*f);while(c.length>0){d=c.shift();f=c.shift();this._4.lineTo(this._f*d,this._h*f)}this._4.fill()},rectangle:function(c,d,f,g){var h;if(c>f){h=c;c=f;f=h}if(d>g){h=d;d=g;g=h}try{this._4.fillStyle=this.fill;this._4.fillRect(this._f*c,this._h*d,this._f*(f-c),this._h*(g-d))}catch(e){}try{this._4.strokeStyle=this.stroke;if(this.stroke!=='transparent')this._4.strokeRect(this._f*c,this._h*d,this._f*(f-c),this._h*(g-d))}catch(e){}},_1Z:function(c,d){var f=this._H(c).width;switch(this.gravity){case'west':return 0;case'east':return d-f;case'north':case'south':case'center':return(d-f)/2}},_20:function(c,d){var f=this._H(c).height;switch(this.gravity){case'north':return 0;case'south':return d-f;case'west':case'east':case'center':return(d-f)/2}},_1o:function(){var c=this._n.parentNode;if(c.className===this.klass.WRAPPER_CLASS)return c;c=document.createElement('div');c.className=this.klass.WRAPPER_CLASS;c.style.position='relative';c.style.border='none';c.style.padding='0 0 0 0';this._n.parentNode.insertBefore(c,this._n);c.appendChild(this._n);return c},_T:function(c,d){var f=this._21(d);f.style.fontFamily=this.font;f.style.fontSize=(typeof c==='number')?c+'px':c;return f},_21:function(c){var d=document.createElement('div');d.className=this.klass.TEXT_CLASS;d.style.position='absolute';d.appendChild(document.createTextNode(c));this._1o().appendChild(d);return d},_U:function(c){c.parentNode.removeChild(c);if(c.className===this.klass.TARGET_CLASS)Bluff.Event.stopObserving(c)},_H:function(c){var d=c.style.display;return(d&&d!=='none')?{width:c.offsetWidth,height:c.offsetHeight}:{width:c.clientWidth,height:c.clientHeight}}});Bluff.Event={_V:[],_1p:(window.attachEvent&&navigator.userAgent.indexOf('Opera')===-1),observe:function(d,f,g,h){var i=Bluff.map(this._1q(d,f),function(c){return c._22});if(Bluff.index(i,g)!==-1)return;var j=function(c){g.call(h||null,d,Bluff.Event._23(c))};this._V.push({_W:d,_1c:f,_22:g,_1r:j});if(d.addEventListener)d.addEventListener(f,j,false);else d.attachEvent('on'+f,j)},stopObserving:function(d){var f=d?this._1q(d):this._V;Bluff.each(f,function(c){if(c._W.removeEventListener)c._W.removeEventListener(c._1c,c._1r,false);else c._W.detachEvent('on'+c._1c,c._1r)})},_1q:function(d,f){var g=[];Bluff.each(this._V,function(c){if(d&&c._W!==d)return;if(f&&c._1c!==f)return;g.push(c)});return g},_23:function(c){if(!this._1p)return c;if(!c)return false;if(c._24)return c;c._24=true;var d=this._25(c);c.target=c.srcElement;c.pageX=d.x;c.pageY=d.y;return c},_25:function(c){var d=document.documentElement,f=document.body||{scrollLeft:0,scrollTop:0};return{x:c.pageX||(c.clientX+(d.scrollLeft||f.scrollLeft)-(d.clientLeft||0)),y:c.pageY||(c.clientY+(d.scrollTop||f.scrollTop)-(d.clientTop||0))}}};if(Bluff.Event._1p)window.attachEvent('onunload',function(){Bluff.Event.stopObserving();Bluff.Event._V=null});if(navigator.userAgent.indexOf('AppleWebKit/')>-1)window.addEventListener('unload',function(){},false);Bluff.Tooltip=new JS.Singleton({LEFT_OFFSET:20,TOP_OFFSET:-6,DATA_LENGTH:8,CLASS_NAME:'bluff-tooltip',setup:function(){this._o=document.createElement('div');this._o.className=this.CLASS_NAME;this._o.style.position='absolute';this.hide();document.body.appendChild(this._o);Bluff.Event.observe(document.body,'mousemove',function(c,d){this._o.style.left=(d.pageX+this.LEFT_OFFSET)+'px';this._o.style.top=(d.pageY+this.TOP_OFFSET)+'px'},this)},show:function(c,d,f){f=Number(String(f).substr(0,this.DATA_LENGTH));this._o.innerHTML='  '+c+' '+f+'';this._o.style.display=''},hide:function(){this._o.style.display='none'}});Bluff.Event.observe(window,'load',Bluff.Tooltip.method('setup'));Bluff.TableReader=new JS.Class({NUMBER_FORMAT:/\-?(0|[1-9]\d*)(\.\d+)?(e[\+\-]?\d+)?/i,initialize:function(c,d){this._26=(typeof c==='string')?document.getElementById(c):c;this._1s=!!d},get_data:function(){if(!this._2)this._1t();return this._2},get_labels:function(){if(!this._1d)this._1t();return this._1d},get_title:function(){return this._27},get_series:function(c){if(this._2[c])return this._2[c];return this._2[c]={points:[]}},_1t:function(){this._I=this._p=0;this._J=this._K=0;this._2=[];this._1d={};this._s=[];this._t=[];this._1u(this._26);if((this._s.length>1&&this._t.length===1)||this._s.length]+>/gi,'')},extend:{Mixin:new JS.Module({data_from_table:function(d,f){var g=new Bluff.TableReader(d,f),h=g.get_data();Bluff.each(h,function(c){this.data(c.name,c.points)},this);this.labels=g.get_labels();this.title=g.get_title()||this.title}})}});Bluff.Base.include(Bluff.TableReader.Mixin); \ No newline at end of file diff --git a/reports/metric_fu/output/bluff_graph.js b/reports/metric_fu/output/bluff_graph.js new file mode 100644 index 0000000..098ffdd --- /dev/null +++ b/reports/metric_fu/output/bluff_graph.js @@ -0,0 +1,15 @@ +createGraphElement("canvas"); + +var chart = new Bluff.Line("graph", "1000x600"); +chart.theme_37signals(); +chart.tooltips = true; +chart.title_font_size = "24px"; +chart.legend_font_size = "12px"; +chart.marker_font_size = "10px"; +chart.title = graph_title; +for(var i = 0; i < graph_series.length; i++) { + var serie = graph_series[i]; + chart.data(serie.name, serie.data); +} +chart.labels = graph_labels; +chart.draw(); diff --git a/reports/metric_fu/output/c555c2a7405663c6de0bf97fda1795.html b/reports/metric_fu/output/c555c2a7405663c6de0bf97fda1795.html new file mode 100644 index 0000000..175ea24 --- /dev/null +++ b/reports/metric_fu/output/c555c2a7405663c6de0bf97fda1795.html @@ -0,0 +1,499 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class SessionsController < ApplicationController
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3  # 
+
+
+ +
+ +   + + +
+
4  before_action :authenticate, except: [ :create ]
+
+
+ +
+ +   + + +
+
5  skip_before_action :verify_authenticity_token, :only => [:create,:destroy,:show]
+
+
+ +
+ +   + + +
+
6
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
7  
+
+
+ +
+ +   + + +
+
8  # 
+
+
+ +
+ +   + + +
+
 9  
+
+
+ +
+ +   + + +
+
10  def create
+
+
+ +
+ +   + + +
+
11    user = User.find_by(email: params[:email])
+
+
+ +
+ +   + + +
+
12    if user && user.authenticate(params[:password])
+
+
+ +
+ +   + + +
+
13      session[:user_id] = user.id
+
+
+ +
+ +   + + +
+
14      render status: :ok, text: 'ok'
+
+
+ +
+ +   + + +
+
15    else
+
+
+ +
+ +   + + +
+
16      render status: :unauthorized, text: 'account or password is not correct'
+
+
+ +
+ +   + + +
+
17    end
+
+
+ +
+ +   + + +
+
18  end
+
+
+ +
+ +   + + +
+
19
+
+
+ +
+ +   + + +
+
20  def destroy
+
+
+ +
+ +   + + +
+
21    session.delete :user_id
+
+
+ +
+ +   + + +
+
22    @current_user &&= nil
+
+
+ +
+ +   + + +
+
23    render status: :ok, nothing: true
+
+
+ +
+ +   + + +
+
24  end
+
+
+ +
+ +   + + +
+
25
+
+
+ +
+ +   + + +
+
26  def show
+
+
+ +
+ +   + + +
+
27    render 'show'
+
+
+ +
+ +   + + +
+
28  end
+
+
+ +
+ +   + + +
+
29end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/c68b2223ecc316803aa9a1fac8d026.html b/reports/metric_fu/output/c68b2223ecc316803aa9a1fac8d026.html new file mode 100644 index 0000000..bc0d681 --- /dev/null +++ b/reports/metric_fu/output/c68b2223ecc316803aa9a1fac8d026.html @@ -0,0 +1,514 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Missions_user <ActiveRecord:: Base
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2  
+
+
+ +
+ +   + + +
+
3    validates :mission_id, presence: true
+
+
+ +
+ +   + + +
+
4    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validate :mission_exist, on: :create
+
+
+ +
+ +   + + +
+
7    validate :user_exist, on: :create
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    private 
+
+
+ +
+ +   + + +
+
10        def mission_exist
+
+
+ +
+ +   + + +
+
11            
+
+
+ +
+ +   + + +
+
12            mission = Mission.find_by(id: mission_id)
+
+
+ +
+ +   + + +
+
13            if mission == nil
+
+
+ +
+ +   + + +
+
14                errors[:mission] = "mission belong to Missions_user is not exist"
+
+
+ +
+ +   + + +
+
15            end
+
+
+ +
+ +   + + +
+
16        
+
+
+ +
+ +   + + +
+
17        
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +   + + +
+
20        def user_exist
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user =  User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to Missions_user is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        
+
+
+ +
+ +   + + +
+
29    
+
+
+ +
+ +   + + +
+
30end
+
+ +
+ + diff --git a/reports/metric_fu/output/churn.html b/reports/metric_fu/output/churn.html new file mode 100644 index 0000000..cd15827 --- /dev/null +++ b/reports/metric_fu/output/churn.html @@ -0,0 +1,602 @@ + + + + + + metrics + + + + + + + + + + + +
+

Source Control Churn Results

+

Files that change a lot in your project may be bad a sign. + This task uses your source control log to identify those files. +

+ + + + + + + + + + + + + + + + + + + + + +
File PathTimes Changed
app/controllers/projects_controller.rb16
db/schema.rb12
+ + +

Classes that change a lot in your project may be bad a sign.

+ + + + + + + + + + + + + +
File PathTimes Changed
app/controllers/missions_controller.rb MissionsController1
+ + + +

Methods that change a lot in your project may be bad a sign.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File PathTimes Changed
app/controllers/missions_controller.rb MissionsController#detail1
app/controllers/missions_controller.rb MissionsController#create1
app/controllers/missions_controller.rb MissionsController#update1
app/controllers/missions_controller.rb MissionsController#commentPublish1
+ + +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/d4817edd52d8fed318c8093c134d0f.html b/reports/metric_fu/output/d4817edd52d8fed318c8093c134d0f.html new file mode 100644 index 0000000..9479569 --- /dev/null +++ b/reports/metric_fu/output/d4817edd52d8fed318c8093c134d0f.html @@ -0,0 +1,271 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Project < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2  has_and_belongs_to_many :users
+
+
+ +
+ +   + + +
+
3
+
+
+ +
+ +   + + +
+
4  validate :require_at_least_on_user,on: :update # 
+
+
+ +
+ +   + + +
+
5  
+
+
+ +
+ +   + + +
+
6  validates :name, presence: true, length: { minimum: 1, maximum: 50 }, uniqueness: true
+
+
+ +
+ +   + + +
+
7
+
+
+ +
+ +   + + +
+
8  private
+
+
+ +
+ +   + + +
+
 9
+
+
+ +
+ +   + + +
+
10    def  require_at_least_on_user
+
+
+ +
+ +   + + +
+
11      if !users || users.size == 0  # size
+
+
+ +
+ +   + + +
+
12        errors[:users] = 'at least one user in the project'
+
+
+ +
+ +   + + +
+
13      end
+
+
+ +
+ +   + + +
+
14    end
+
+
+ +
+ +   + + +
+
15end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/d5661a80f29613c4639194a4590030.html b/reports/metric_fu/output/d5661a80f29613c4639194a4590030.html new file mode 100644 index 0000000..e390f83 --- /dev/null +++ b/reports/metric_fu/output/d5661a80f29613c4639194a4590030.html @@ -0,0 +1,2430 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class ProjectsController < ApplicationController
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :index,
+
+
+ +
+ +   + + +
+
6        :create,
+
+
+ +
+ +   + + +
+
7        :addUsers,
+
+
+ +
+ +   + + +
+
8        :detail,
+
+
+ +
+ +   + + +
+
 9        :update,
+
+
+ +
+ +   + + +
+
10        :deleteUsers
+
+
+ +
+ +   + + +
+
11    ]
+
+
+ +
+ +   + + +
+
12    
+
+
+ +
+ +   + + +
+
13    #=============================================>user_idsession.
+
+
+ +
+ +   + + +
+
14    def index
+
+
+ +
+ +   + + +
+
15    #Todo
+
+
+ +
+ +   + + +
+
16    uid = session[:user_id]
+
+
+ +
+ +   + + +
+
17    data=[]
+
+
+ +
+ +   + + +
+
18    Projects_user.where(:user_id => uid).each do |i|
+
+
+ +
+ +   + + +
+
19        pid=i.project_id
+
+
+ +
+ +   + + +
+
20        p=Project.find_by(id:pid)
+
+
+ +
+ +   + + +
+
21        mc = Mission.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
22        uc = Projects_user.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
23        sc = Share.where(:project_id => pid).size
+
+
+ +
+ +   + + +
+
24        data+=[{
+
+
+ +
+ +   + + +
+
25            :id => pid,
+
+
+ +
+ +   + + +
+
26            :name => p.name,
+
+
+ +
+ +   + + +
+
27            :content => p.content,
+
+
+ +
+ +   + + +
+
28            :mission_count => mc,
+
+
+ +
+ +   + + +
+
29            :users_count => uc,
+
+
+ +
+ +   + + +
+
30            :shares_count => sc
+
+
+ +
+ +   + + +
+
31        }]
+
+
+ +
+ +   + + +
+
32    end
+
+
+ +
+ +   + + +
+
33    render :json => {
+
+
+ +
+ +   + + +
+
34        :code => 0,
+
+
+ +
+ +   + + +
+
35        :data => data
+
+
+ +
+ +   + + +
+
36    }
+
+
+ +
+ +   + + +
+
37    end
+
+
+ +
+ +   + + +
+
38    
+
+
+ +
+ +   + + +
+
39    #=============================================>
+
+
+ +
+ +   + + +
+
40    
+
+
+ +
+ +   + + +
+
41    def create
+
+
+ +
+ +   + + +
+
42        uid = session[:user_id]
+
+
+ +
+ +   + + +
+
43        project = Project.new(project_params)
+
+
+ +
+ +   + + +
+
44        if project.save
+
+
+ +
+ +   + + +
+
45            Projects_user.create(project_id:project.id,user_id:uid)
+
+
+ +
+ +   + + +
+
46            render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
47        else
+
+
+ +
+ +   + + +
+
48            render json: project.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
49        end
+
+
+ +
+ +   + + +
+
50     end
+
+
+ +
+ +   + + +
+
51    
+
+
+ +
+ +   + + +
+
52    
+
+
+ +
+ +   + + +
+
53    #=============================================>
+
+
+ +
+ +   + + +
+
54    
+
+
+ +
+ +   + + +
+
55    def addUsers
+
+
+ +
+ +   + + +
+
56        uid = User.find_by(email:params[:email]).id# 
+
+
+ +
+ +   + + +
+
57        register = session[:user_id]# 
+
+
+ +
+ +   + + +
+
58        pid = params[:project_id]
+
+
+ +
+ +   + + +
+
59        # 
+
+
+ +
+ +   + + +
+
60        pu_exist=Projects_user.find_by(project_id:pid,user_id:uid)
+
+
+ +
+ +   + + +
+
61        if pu_exist.nil?# 
+
+
+ +
+ +   + + +
+
62            params_pu = {project_id: pid,user_id: uid}
+
+
+ +
+ +   + + +
+
63            pu = Projects_user.new(params_pu)
+
+
+ +
+ +   + + +
+
64            pu.save
+
+
+ +
+ +   + + +
+
65            
+
+
+ +
+ +   + + +
+
66            content = "<a>"+User.find_by(id: register).name + "</a>  <a>" + Project.find_by(id: pid).name+"</a>"
+
+
+ +
+ +   + + +
+
67            puts content
+
+
+ +
+ +   + + +
+
68            params_note = {user_id: uid,content: content,category: 2,project_id: pid}
+
+
+ +
+ +   + + +
+
69            note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
70            note.save!
+
+
+ +
+ +   + + +
+
71            render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
72        else# 
+
+
+ +
+ +   + + +
+
73            render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
74        end
+
+
+ +
+ +   + + +
+
75    end
+
+
+ +
+ +   + + +
+
76    
+
+
+ +
+ +   + + +
+
77    #=============================================>
+
+
+ +
+ +   + + +
+
78    def deleteUsers
+
+
+ +
+ +   + + +
+
79        uid = params[:user_id]# 
+
+
+ +
+ +   + + +
+
80        register = session[:user_id]# 
+
+
+ +
+ +   + + +
+
81        pid = params[:project_id]
+
+
+ +
+ +   + + +
+
82        # 
+
+
+ +
+ +   + + +
+
83        projects_user=Projects_user.find_by(project_id:pid,user_id:uid)
+
+
+ +
+ +   + + +
+
84        if projects_user.nil?# 
+
+
+ +
+ +   + + +
+
85            render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
86        end
+
+
+ +
+ +   + + +
+
87        # 
+
+
+ +
+ +   + + +
+
88        puts projects_user.user_id
+
+
+ +
+ +   + + +
+
89        puts projects_user.project_id
+
+
+ +
+ +   + + +
+
90        Projects_user.where(project_id:pid,user_id:uid).delete_all
+
+
+ +
+ +   + + +
+
91            
+
+
+ +
+ +   + + +
+
92        content ="<a>"+ User.find_by(id: register).name + "</a>  <a>" + Project.find_by(id: pid).name+"</a> "
+
+
+ +
+ +   + + +
+
93        puts content
+
+
+ +
+ +   + + +
+
94        params_note = {user_id: uid,content: content,category: 2,project_id: pid}
+
+
+ +
+ +   + + +
+
95        note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
96        note.save!
+
+
+ +
+ +   + + +
+
97            
+
+
+ +
+ +   + + +
+
98        render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
 99    end
+
+
+ +
+ +   + + +
+
100    
+
+
+ +
+ +   + + +
+
101    #=============================================>
+
+
+ +
+ +   + + +
+
102    
+
+
+ +
+ +   + + +
+
103    def detail
+
+
+ +
+ +   + + +
+
104        #Todo    
+
+
+ +
+ +   + + +
+
105        pid = params[:id]
+
+
+ +
+ +   + + +
+
106        project = Project.find_by(id: pid)
+
+
+ +
+ +   + + +
+
107        #uid = Projects_user.where(:project_id => pid)
+
+
+ +
+ +   + + +
+
108        users = []
+
+
+ +
+ +   + + +
+
109        projects_users = Projects_user.where("project_id = ?",pid).all
+
+
+ +
+ +   + + +
+
110        
+
+
+ +
+ +   + + +
+
111        projects_users.each do |projects_user|
+
+
+ +
+ +   + + +
+
112            uid = projects_user.user_id
+
+
+ +
+ +   + + +
+
113            i = User.find_by(id: uid)
+
+
+ +
+ +   + + +
+
114            users += [{
+
+
+ +
+ +   + + +
+
115                :name => i.name,
+
+
+ +
+ +   + + +
+
116                :id => i.id
+
+
+ +
+ +   + + +
+
117            }]
+
+
+ +
+ +   + + +
+
118        end
+
+
+ +
+ +   + + +
+
119        #puts users.inspect 
+
+
+ +
+ +   + + +
+
120        # Users.find(uid).each do |i|
+
+
+ +
+ +   + + +
+
121        #     users += [{
+
+
+ +
+ +   + + +
+
122        #         :nickname => i.name,
+
+
+ +
+ +   + + +
+
123        #         :id => i.id
+
+
+ +
+ +   + + +
+
124        #     }]
+
+
+ +
+ +   + + +
+
125        # end
+
+
+ +
+ +   + + +
+
126        render :json => {
+
+
+ +
+ +   + + +
+
127            :code => 0,
+
+
+ +
+ +   + + +
+
128            :data => {
+
+
+ +
+ +   + + +
+
129                :name => project.name,
+
+
+ +
+ +   + + +
+
130                :content => project.content,
+
+
+ +
+ +   + + +
+
131                :users => users
+
+
+ +
+ +   + + +
+
132            }
+
+
+ +
+ +   + + +
+
133        }
+
+
+ +
+ +   + + +
+
134    end
+
+
+ +
+ +   + + +
+
135    
+
+
+ +
+ +   + + +
+
136    #=============================================>
+
+
+ +
+ +   + + +
+
137    def update
+
+
+ +
+ +   + + +
+
138        project = Project.find_by(:id => params[:project][:id])
+
+
+ +
+ +   + + +
+
139        if project.update(project_params)
+
+
+ +
+ +   + + +
+
140            render :json => {:code => 0}
+
+
+ +
+ +   + + +
+
141        else
+
+
+ +
+ +   + + +
+
142          render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
143        end
+
+
+ +
+ +   + + +
+
144    end
+
+
+ +
+ +   + + +
+
145    
+
+
+ +
+ +   + + +
+
146    private
+
+
+ +
+ +   + + +
+
147        def project_params
+
+
+ +
+ +   + + +
+
148          params.require(:project).permit(:name,:content,:id)
+
+
+ +
+ +   + + +
+
149        end
+
+
+ +
+ +   + + +
+
150end
+
+ +
+ + diff --git a/reports/metric_fu/output/d77bcf2e32d9b5be36cec41f45385e.html b/reports/metric_fu/output/d77bcf2e32d9b5be36cec41f45385e.html new file mode 100644 index 0000000..791f0e1 --- /dev/null +++ b/reports/metric_fu/output/d77bcf2e32d9b5be36cec41f45385e.html @@ -0,0 +1,275 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Project < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2  has_and_belongs_to_many :users
+
+
+ +
+ +   + + +
+
3
+
+
+ +
+ +   + + +
+
4  validate :require_at_least_on_user,on: :update # 
+
+
+ +
+ +   + + +
+
5  
+
+
+ +
+ +   + + +
+
6  validates :name, presence: true, length: { minimum: 1, maximum: 50 }, uniqueness: true
+
+
+ +
+ +   + + +
+
7
+
+
+ +
+ +   + + +
+
8  private
+
+
+ +
+ +   + + +
+
 9
+
+
+ +
+ +
    + +
  • Complexity 2 » saikuro
  • + +
+ +
+
+
10    def  require_at_least_on_user
+
+
+ +
+ +   + + +
+
11      if !users || users.size == 0  # size
+
+
+ +
+ +   + + +
+
12        errors[:users] = 'at least one user in the project'
+
+
+ +
+ +   + + +
+
13      end
+
+
+ +
+ +   + + +
+
14    end
+
+
+ +
+ +   + + +
+
15end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/db1473ea3bf22cb068987f76accffa.html b/reports/metric_fu/output/db1473ea3bf22cb068987f76accffa.html new file mode 100644 index 0000000..efe3a30 --- /dev/null +++ b/reports/metric_fu/output/db1473ea3bf22cb068987f76accffa.html @@ -0,0 +1,783 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Mission < ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3    has_many :comments
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validates :name, presence: true
+
+
+ +
+ +   + + +
+
7    validates :deadline, presence: true
+
+
+ +
+ +   + + +
+
8    validates :priority, presence: true
+
+
+ +
+ +   + + +
+
 9    validates :status, presence: true
+
+
+ +
+ +   + + +
+
10    validates :content, presence: true
+
+
+ +
+ +   + + +
+
11    
+
+
+ +
+ +   + + +
+
12    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
13    
+
+
+ +
+ +   + + +
+
14    
+
+
+ +
+ +   + + +
+
15    validate :priority_is_among_valid_values
+
+
+ +
+ +   + + +
+
16    validate :status_is_among_valid_values
+
+
+ +
+ +   + + +
+
17    
+
+
+ +
+ +   + + +
+
18    validate :project_exists, on: :create
+
+
+ +
+ +   + + +
+
19    
+
+
+ +
+ +   + + +
+
20    private 
+
+
+ +
+ +   + + +
+
21    
+
+
+ +
+ +   + + +
+
22        def priority_is_among_valid_values
+
+
+ +
+ +   + + +
+
23            
+
+
+ +
+ +   + + +
+
24            if priority != 1 and  priority != 2 and priority != 3
+
+
+ +
+ +   + + +
+
25                errors[:priority] = "priority is not among valid values"
+
+
+ +
+ +   + + +
+
26            end
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        
+
+
+ +
+ +   + + +
+
29        def status_is_among_valid_values
+
+
+ +
+ +   + + +
+
30            
+
+
+ +
+ +   + + +
+
31            if  status != 1 and  status != 2 and status != 3 and status != 4
+
+
+ +
+ +   + + +
+
32                errors[:status] = "status is not among valid values"
+
+
+ +
+ +   + + +
+
33            end
+
+
+ +
+ +   + + +
+
34        end
+
+
+ +
+ +   + + +
+
35        
+
+
+ +
+ +   + + +
+
36        def project_exists
+
+
+ +
+ +   + + +
+
37            #puts project_id
+
+
+ +
+ +   + + +
+
38            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
39            #puts project.inspect
+
+
+ +
+ +   + + +
+
40            if project == nil
+
+
+ +
+ +   + + +
+
41                errors[:project_id] = "project_id is not exist"
+
+
+ +
+ +   + + +
+
42            end
+
+
+ +
+ +   + + +
+
43            
+
+
+ +
+ +   + + +
+
44        end
+
+
+ +
+ +   + + +
+
45    
+
+
+ +
+ +   + + +
+
46    
+
+
+ +
+ +   + + +
+
47end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/de882ff77d4a5d5fc32876cf4a3162.html b/reports/metric_fu/output/de882ff77d4a5d5fc32876cf4a3162.html new file mode 100644 index 0000000..dc4863a --- /dev/null +++ b/reports/metric_fu/output/de882ff77d4a5d5fc32876cf4a3162.html @@ -0,0 +1,734 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Comment < ActiveRecord::Base
+
+
+ +
+ +   + + +
+
2    
+
+
+ +
+ +   + + +
+
3    belongs_to :mission
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :content, presence: true
+
+
+ +
+ +   + + +
+
6    validates :mission_id, presence: true
+
+
+ +
+ +   + + +
+
7    
+
+
+ +
+ +   + + +
+
8    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
 9    validate :comment_has_atleast_one_character, on: :create
+
+
+ +
+ +   + + +
+
10    validate :user_id_exist, on: :create
+
+
+ +
+ +   + + +
+
11    
+
+
+ +
+ +   + + +
+
12    private 
+
+
+ +
+ +   + + +
+
13    
+
+
+ +
+ +   + + +
+
14      
+
+
+ +
+ +   + + +
+
15        def comment_has_atleast_one_character
+
+
+ +
+ +   + + +
+
16            tmp = content.strip
+
+
+ +
+ +   + + +
+
17            if tmp.length < 1
+
+
+ +
+ +   + + +
+
18                errors[:content] = 'content should has at least one character'
+
+
+ +
+ +   + + +
+
19            end
+
+
+ +
+ +   + + +
+
20        end
+
+
+ +
+ +   + + +
+
21        
+
+
+ +
+ +   + + +
+
22        
+
+
+ +
+ +   + + +
+
23        def user_id_exist
+
+
+ +
+ +   + + +
+
24            
+
+
+ +
+ +   + + +
+
25            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
26            if user == nil
+
+
+ +
+ +   + + +
+
27                errors[:user] = "user is not exist"
+
+
+ +
+ +   + + +
+
28            end
+
+
+ +
+ +   + + +
+
29    
+
+
+ +
+ +   + + +
+
30        end
+
+
+ +
+ +   + + +
+
31        
+
+
+ +
+ +   + + +
+
32        
+
+
+ +
+ +   + + +
+
33        # mission controller
+
+
+ +
+ +   + + +
+
34        
+
+
+ +
+ +   + + +
+
35        # def mission_id_should_be_exist
+
+
+ +
+ +   + + +
+
36            
+
+
+ +
+ +   + + +
+
37        #     @mission = Mission.find(:mission_id)
+
+
+ +
+ +   + + +
+
38            
+
+
+ +
+ +   + + +
+
39        #     if @mission == nil
+
+
+ +
+ +   + + +
+
40        #         errors[:mission_id] = "mission is not exist"
+
+
+ +
+ +   + + +
+
41        #     end
+
+
+ +
+ +   + + +
+
42        # end    
+
+
+ +
+ +   + + +
+
43    
+
+
+ +
+ +   + + +
+
44end
+
+ +
+ + diff --git a/reports/metric_fu/output/e7659e4d60673db32cf627de6ccc8d.html b/reports/metric_fu/output/e7659e4d60673db32cf627de6ccc8d.html new file mode 100644 index 0000000..9c43a54 --- /dev/null +++ b/reports/metric_fu/output/e7659e4d60673db32cf627de6ccc8d.html @@ -0,0 +1,287 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class ApplicationController < ActionController::Base
+
+
+ +
+ +   + + +
+
2  # Prevent CSRF attacks by raising an exception.
+
+
+ +
+ +   + + +
+
3  # For APIs, you may want to use :null_session instead.
+
+
+ +
+ +   + + +
+
4  protect_from_forgery with: :exception
+
+
+ +
+ +   + + +
+
5
+
+
+ +
+ +   + + +
+
6  def authenticate
+
+
+ +
+ +   + + +
+
7    render status: :unauthorized, nothing: true unless session['user_id']
+
+
+ +
+ +   + + +
+
8  end
+
+
+ +
+ +   + + +
+
 9
+
+
+ +
+ +   + + +
+
10  private
+
+
+ +
+ +   + + +
+
11    def current_user
+
+
+ +
+ +   + + +
+
12      @current_user ||= User.find(session[:user_id]) if session[:user_id]
+
+
+ +
+ +   + + +
+
13    end
+
+
+ +
+ +   + + +
+
14
+
+
+ +
+ +   + + +
+
15  helper_method :current_user
+
+
+ +
+ +   + + +
+
16end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/e782303906061f982438021be1eaff.html b/reports/metric_fu/output/e782303906061f982438021be1eaff.html new file mode 100644 index 0000000..4609839 --- /dev/null +++ b/reports/metric_fu/output/e782303906061f982438021be1eaff.html @@ -0,0 +1,627 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Share < ActiveRecord::Base
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2    
+
+
+ +
+ +   + + +
+
3    validates :content, presence: true
+
+
+ +
+ +   + + +
+
4    
+
+
+ +
+ +   + + +
+
5    validates :project_id, presence: true
+
+
+ +
+ +   + + +
+
6    
+
+
+ +
+ +   + + +
+
7    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    validate :share_has_atleast_one_character 
+
+
+ +
+ +   + + +
+
10    validate :user_exists,on: :create
+
+
+ +
+ +   + + +
+
11    validate :project_exists,on: :create
+
+
+ +
+ +   + + +
+
12    private 
+
+
+ +
+ +   + + +
+
13        def share_has_atleast_one_character
+
+
+ +
+ +   + + +
+
14            tmp = content.strip
+
+
+ +
+ +   + + +
+
15            if tmp.length < 1
+
+
+ +
+ +   + + +
+
16                errors[:content] = "share content should has at least one character"
+
+
+ +
+ +   + + +
+
17            end
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +   + + +
+
20        def user_exists
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user = User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to Share is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        def project_exists
+
+
+ +
+ +   + + +
+
29            
+
+
+ +
+ +   + + +
+
30            project = Project.find_by(id: project_id)
+
+
+ +
+ +   + + +
+
31            if project == nil
+
+
+ +
+ +   + + +
+
32                errors[:project] = "user belong to Share is not exist"
+
+
+ +
+ +   + + +
+
33            end
+
+
+ +
+ +   + + +
+
34        
+
+
+ +
+ +   + + +
+
35        end    
+
+
+ +
+ +   + + +
+
36    
+
+
+ +
+ +   + + +
+
37end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/e9733564f675453b1f324b65b93eaf.html b/reports/metric_fu/output/e9733564f675453b1f324b65b93eaf.html new file mode 100644 index 0000000..d9dbec8 --- /dev/null +++ b/reports/metric_fu/output/e9733564f675453b1f324b65b93eaf.html @@ -0,0 +1,918 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class SharesController < ApplicationController
+
+
+ +
+ +
    + +
  • remove trailing whitespace » rails_best_practices
  • + +
+ +
+
+
2   
+
+
+ +
+ +   + + +
+
3    before_action :authenticate
+
+
+ +
+ +   + + +
+
4    skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5        :create,
+
+
+ +
+ +   + + +
+
6        :getShareList
+
+
+ +
+ +   + + +
+
7    ]
+
+
+ +
+ +   + + +
+
8    #
+
+
+ +
+ +   + + +
+
 9   
+
+
+ +
+ +
    + +
  • use model association (for share) » rails_best_practices
  • + +
+ +
+
+
10    def create
+
+
+ +
+ +   + + +
+
11        uid = session[:user_id].to_i
+
+
+ +
+ +   + + +
+
12        share=Share.new(share_params)
+
+
+ +
+ +   + + +
+
13        share.user_id=uid
+
+
+ +
+ +   + + +
+
14        if share.save
+
+
+ +
+ +   + + +
+
15            content = "<a>"+User.find(uid).name + "</a> "
+
+
+ +
+ +   + + +
+
16            pid=share.project_id
+
+
+ +
+ +   + + +
+
17            
+
+
+ +
+ +   + + +
+
18            Projects_user.where(:project_id => pid).each do |i|
+
+
+ +
+ +   + + +
+
19                params_note = {user_id: i.user_id,content: content,category: 1,project_id: pid}
+
+
+ +
+ +   + + +
+
20                note = Note.new(params_note)
+
+
+ +
+ +   + + +
+
21                note.save!
+
+
+ +
+ +   + + +
+
22            end
+
+
+ +
+ +   + + +
+
23            render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
24        else
+
+
+ +
+ +   + + +
+
25            render json: project.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
26        end
+
+
+ +
+ +   + + +
+
27    end
+
+
+ +
+ +   + + +
+
28    
+
+
+ +
+ +   + + +
+
29    #
+
+
+ +
+ +   + + +
+
30    
+
+
+ +
+ +   + + +
+
31    def getShareList
+
+
+ +
+ +   + + +
+
32    #Todo
+
+
+ +
+ +   + + +
+
33    pid = params[:project_id]
+
+
+ +
+ +   + + +
+
34    
+
+
+ +
+ +   + + +
+
35    data = []
+
+
+ +
+ +   + + +
+
36    Share.where(:project_id => pid).order("created_at desc").each do |i|
+
+
+ +
+ +   + + +
+
37        puts i.content
+
+
+ +
+ +   + + +
+
38        name = User.find(i.user_id).name
+
+
+ +
+ +   + + +
+
39        data += [{
+
+
+ +
+ +   + + +
+
40            :name => name,
+
+
+ +
+ +   + + +
+
41            :time => i.created_at,
+
+
+ +
+ +   + + +
+
42            :content => i.content
+
+
+ +
+ +   + + +
+
43        }]
+
+
+ +
+ +   + + +
+
44    end
+
+
+ +
+ +   + + +
+
45    render :json => {
+
+
+ +
+ +   + + +
+
46        :code => 0,
+
+
+ +
+ +   + + +
+
47        :data => data
+
+
+ +
+ +   + + +
+
48    }
+
+
+ +
+ +   + + +
+
49    end
+
+
+ +
+ +   + + +
+
50
+
+
+ +
+ +   + + +
+
51    private
+
+
+ +
+ +   + + +
+
52        def share_params
+
+
+ +
+ +   + + +
+
53          params.require(:share).permit(:project_id,:content)
+
+
+ +
+ +   + + +
+
54        end
+
+
+ +
+ +   + + +
+
55end
+
+ +
+ + diff --git a/reports/metric_fu/output/eea85b20f9cc91cfbd0d5109cd9100.html b/reports/metric_fu/output/eea85b20f9cc91cfbd0d5109cd9100.html new file mode 100644 index 0000000..39d9401 --- /dev/null +++ b/reports/metric_fu/output/eea85b20f9cc91cfbd0d5109cd9100.html @@ -0,0 +1,63 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + +
+ +   + + +
+
1module UsersHelper
+
+
+ +
+ +   + + +
+
2end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/excanvas.js b/reports/metric_fu/output/excanvas.js new file mode 100644 index 0000000..19163fe --- /dev/null +++ b/reports/metric_fu/output/excanvas.js @@ -0,0 +1,35 @@ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_|| +b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d','","");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("g.x)g.x=e.x;if(h.y==null||e.yg.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_), +z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l')}else a.push('');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("')}a.push("");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(), +this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a, +0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager= +M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})(); \ No newline at end of file diff --git a/reports/metric_fu/output/f0ac75ef65c83c69099f12437e6ff1.html b/reports/metric_fu/output/f0ac75ef65c83c69099f12437e6ff1.html new file mode 100644 index 0000000..9c9312f --- /dev/null +++ b/reports/metric_fu/output/f0ac75ef65c83c69099f12437e6ff1.html @@ -0,0 +1,879 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class UsersController < ApplicationController
+
+
+ +
+ +   + + +
+
2
+
+
+ +
+ +   + + +
+
3  before_action :authenticate, except: [ :emailExist, :usernameExist, :create ]
+
+
+ +
+ +   + + +
+
4  skip_before_action :verify_authenticity_token, :only => [
+
+
+ +
+ +   + + +
+
5    :emailExist,
+
+
+ +
+ +   + + +
+
6    :usernameExist,
+
+
+ +
+ +   + + +
+
7    :create,
+
+
+ +
+ +   + + +
+
8    :update
+
+
+ +
+ +   + + +
+
 9  ]
+
+
+ +
+ +   + + +
+
10
+
+
+ +
+ +   + + +
+
11  def emailExist
+
+
+ +
+ +   + + +
+
12    if checkExist?(:email, params[:email])
+
+
+ +
+ +   + + +
+
13      render :text => '1'
+
+
+ +
+ +   + + +
+
14    else
+
+
+ +
+ +   + + +
+
15      render :text => '0'
+
+
+ +
+ +   + + +
+
16    end
+
+
+ +
+ +   + + +
+
17  end
+
+
+ +
+ +   + + +
+
18
+
+
+ +
+ +   + + +
+
19  def usernameExist
+
+
+ +
+ +   + + +
+
20    if checkExist?(:name, params[:username])
+
+
+ +
+ +   + + +
+
21      render :text => 'exist'
+
+
+ +
+ +   + + +
+
22    else
+
+
+ +
+ +   + + +
+
23      render :text => 'not exist'
+
+
+ +
+ +   + + +
+
24    end
+
+
+ +
+ +   + + +
+
25  end
+
+
+ +
+ +   + + +
+
26
+
+
+ +
+ +   + + +
+
27  def create
+
+
+ +
+ +   + + +
+
28    @user = User.new(user_params)
+
+
+ +
+ +   + + +
+
29    if @user.save
+
+
+ +
+ +   + + +
+
30      render status: :created, nothing: true
+
+
+ +
+ +   + + +
+
31    else
+
+
+ +
+ +   + + +
+
32      render json: @user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
33    end
+
+
+ +
+ +   + + +
+
34  end
+
+
+ +
+ +   + + +
+
35
+
+
+ +
+ +   + + +
+
36  def update
+
+
+ +
+ +   + + +
+
37    @user = current_user
+
+
+ +
+ +   + + +
+
38    if @user.update(user_params)
+
+
+ +
+ +   + + +
+
39      render 'show'
+
+
+ +
+ +   + + +
+
40    else
+
+
+ +
+ +   + + +
+
41      render json:current_user.errors, status: :unprocessable_entity
+
+
+ +
+ +   + + +
+
42    end
+
+
+ +
+ +   + + +
+
43  end
+
+
+ +
+ +   + + +
+
44
+
+
+ +
+ +   + + +
+
45  private
+
+
+ +
+ +   + + +
+
46    def checkExist?(field_name, value)
+
+
+ +
+ +   + + +
+
47      User.exists?(field_name => value)
+
+
+ +
+ +   + + +
+
48    end
+
+
+ +
+ +   + + +
+
49
+
+
+ +
+ +   + + +
+
50    def user_params
+
+
+ +
+ +   + + +
+
51      params.require(:user).permit(:name,:password, :password_confirmation, :email, :phone)
+
+
+ +
+ +   + + +
+
52    end
+
+
+ +
+ +   + + +
+
53end
+
+
+ +
+ + diff --git a/reports/metric_fu/output/f4e09c0c86f17297887b6b687bc49b.html b/reports/metric_fu/output/f4e09c0c86f17297887b6b687bc49b.html new file mode 100644 index 0000000..753065e --- /dev/null +++ b/reports/metric_fu/output/f4e09c0c86f17297887b6b687bc49b.html @@ -0,0 +1,510 @@ + + + + Analyzed File Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +   + + +
+
1class Missions_user <ActiveRecord:: Base
+
+
+ +
+ +   + + +
+
2  
+
+
+ +
+ +   + + +
+
3    validates :mission_id, presence: true
+
+
+ +
+ +   + + +
+
4    validates :user_id, presence: true
+
+
+ +
+ +   + + +
+
5    
+
+
+ +
+ +   + + +
+
6    validate :mission_exist, on: :create
+
+
+ +
+ +   + + +
+
7    validate :user_exist, on: :create
+
+
+ +
+ +   + + +
+
8    
+
+
+ +
+ +   + + +
+
 9    private 
+
+
+ +
+ +   + + +
+
10        def mission_exist
+
+
+ +
+ +   + + +
+
11            
+
+
+ +
+ +   + + +
+
12            mission = Mission.find_by(id: mission_id)
+
+
+ +
+ +   + + +
+
13            if mission == nil
+
+
+ +
+ +   + + +
+
14                errors[:mission] = "mission belong to Missions_user is not exist"
+
+
+ +
+ +   + + +
+
15            end
+
+
+ +
+ +   + + +
+
16        
+
+
+ +
+ +   + + +
+
17        
+
+
+ +
+ +   + + +
+
18        end
+
+
+ +
+ +   + + +
+
19        
+
+
+ +
+ +   + + +
+
20        def user_exist
+
+
+ +
+ +   + + +
+
21            
+
+
+ +
+ +   + + +
+
22            user =  User.find_by(id: user_id)
+
+
+ +
+ +   + + +
+
23            if user == nil
+
+
+ +
+ +   + + +
+
24                errors[:user] = "user belong to Missions_user is not exist"
+
+
+ +
+ +   + + +
+
25            end
+
+
+ +
+ +   + + +
+
26        
+
+
+ +
+ +   + + +
+
27        end
+
+
+ +
+ +   + + +
+
28        
+
+
+ +
+ +   + + +
+
29    
+
+
+ +
+ +   + + +
+
30end
+
+ +
+ + diff --git a/reports/metric_fu/output/flay.html b/reports/metric_fu/output/flay.html new file mode 100644 index 0000000..95451aa --- /dev/null +++ b/reports/metric_fu/output/flay.html @@ -0,0 +1,604 @@ + + + + + + metrics + + + + + + + + + + + +
+

Flay Results

+ +

Flay analyzes ruby code for structural similarities.

+ +
+ + +

Total Score (lower is better): 268

+
Scores less than are not shown or part of the total
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FilesMatches
+ + app/models/comment.rb:23
+ + app/models/mission.rb:36
+ + app/models/missions_user.rb:10
+ + app/models/missions_user.rb:20
+ + app/models/note.rb:32
+ + app/models/note.rb:41
+ + app/models/projects_user.rb:11
+ + app/models/projects_user.rb:20
+ + app/models/share.rb:20
+ + app/models/share.rb:28
+ +
1) Similar code found in :defn (mass = 160)
+ + app/controllers/projects_controller.rb:66
+ + app/controllers/projects_controller.rb:92
+ +
2) Similar code found in :lasgn (mass = 40)
+ + app/models/mission.rb:22
+ + app/models/note.rb:24
+ +
3) Similar code found in :defn (mass = 36)
+ + app/controllers/users_controller.rb:11
+ + app/controllers/users_controller.rb:19
+ +
4) Similar code found in :defn (mass = 32)
+ +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/flay.js b/reports/metric_fu/output/flay.js new file mode 100644 index 0000000..1a7a5ce --- /dev/null +++ b/reports/metric_fu/output/flay.js @@ -0,0 +1,3 @@ + var graph_title = 'Flay: duplication'; + var graph_series = [{name: 'flay', data: [268]}]; + var graph_labels = {"0":"1/3"}; diff --git a/reports/metric_fu/output/highcharts.js b/reports/metric_fu/output/highcharts.js new file mode 100644 index 0000000..31565d0 --- /dev/null +++ b/reports/metric_fu/output/highcharts.js @@ -0,0 +1,294 @@ +/* + Highcharts JS v3.0.9 (2014-01-15) + + (c) 2009-2014 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+M(a-c).toFixed(f).slice(2):"")}function Ea(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Va(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this, +a)}}function Fa(a,b){for(var c="{",d=!1,e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h-1?h.thousandsSep:"")):e=ab(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function mb(a){return P.pow(10,N(P.log(a)/P.LN10))}function nb(a,b,c,d){var e,c=n(c, +1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;dc&&(c= +a[b]);return c}function Ma(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Na(a){bb||(bb=T(Ga));a&&bb.appendChild(a);bb.innerHTML=""}function ka(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else C.console&&console.log(c)}function aa(a){return parseFloat(a.toPrecision(14))}function Oa(a,b){oa=n(a,b.animation)}function Bb(){var a=G.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";Pa=(a&&G.global.timezoneOffset||0)*6E4;cb=a? +Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,n(c,1),n(g,0),n(h,0),n(i,0))).getTime()};pb=b+"Minutes";qb=b+"Hours";rb=b+"Day";Wa=b+"Date";db=b+"Month";eb=b+"FullYear";Cb=c+"Minutes";Db=c+"Hours";sb=c+"Date";Eb=c+"Month";Fb=c+"FullYear"}function pa(){}function Qa(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function qa(){this.init.apply(this,arguments)}function Gb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d; +this.total=null;this.points={};this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:n(b.y,g?4:c?14:-6),x:n(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function tb(){this.init.apply(this,arguments)}function fb(){this.init.apply(this,arguments)}var u,y=document,C=window,P=Math,w=P.round,N=P.floor,Ha=P.ceil,s=P.max,I=P.min,M=P.abs,U=P.cos,ba=P.sin,Aa=P.PI,Ba= +Aa*2/360,ra=navigator.userAgent,Hb=C.opera,ya=/msie/i.test(ra)&&!Hb,gb=y.documentMode===8,hb=/AppleWebKit/.test(ra),Xa=/Firefox/.test(ra),Ib=/(Mobile|Android|Windows Phone)/.test(ra),Ca="http://www.w3.org/2000/svg",V=!!y.createElementNS&&!!y.createElementNS(Ca,"svg").createSVGRect,Nb=Xa&&parseInt(ra.split("Firefox/")[1],10)<4,da=!V&&!ya&&!!y.createElement("canvas").getContext,Ya,ib=y.documentElement.ontouchstart!==u,Jb={},ub=0,bb,G,ab,oa,vb,E,la=function(){},Ia=[],Ga="div",Q="none",Ob=/^[0-9]+$/, +Kb="rgba(192,192,192,"+(V?1.0E-4:0.002)+")",Lb="stroke-width",cb,Pa,pb,qb,rb,Wa,db,eb,Cb,Db,sb,Eb,Fb,L={};C.Highcharts=C.Highcharts?ka(16,!0):{};ab=function(a,b,c){if(!t(b)||isNaN(b))return"Invalid date";var a=n(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b-Pa),e,f=d[qb](),g=d[rb](),h=d[Wa](),i=d[db](),j=d[eb](),k=G.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Ea(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Ea(i+1),y:j.toString().substr(2,2),Y:j,H:Ea(f),I:Ea(f%12||12),l:f%12||12,M:Ea(d[pb]()),p:f<12?"AM": +"PM",P:f<12?"am":"pm",S:Ea(d.getSeconds()),L:Ea(w(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};Ab.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};E=function(){for(var a=0,b=arguments,c=b.length,d={};a-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length{point.key}
', +pointFormat:'{series.name}: {point.y}
',shadow:!0,snap:Ib?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var Y=G.plotOptions,W=Y.line;Bb();var Sb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/, +Tb=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,Ub=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,ta=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Ra(a.stops,function(a){return ta(a[1])}):(c=Sb.exec(a))?b=[z(c[1]),z(c[2]),z(c[3]),parseFloat(c[4],10)]:(c=Tb.exec(a))?b=[z(c[1],16),z(c[2],16),z(c[3],16),1]:(c=Ub.exec(a))&&(b=[z(c[1]),z(c[2]),z(c[3]),1])})(a);return{get:function(c){var f;d?(f=x(a),f.stops=[].concat(f.stops),p(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})): +f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)p(d,function(b){b.brighten(a)});else if(wa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=z(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};pa.prototype={init:function(a,b){this.element=b==="span"?T(b):y.createElementNS(Ca,b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=n(b,oa,!0); +Za(this);if(b){b=x(b);if(c)b.complete=c;kb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,q,o=this;fa(a)&&t(b)&&(c=a,a={},a[c]=b);if(fa(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),o=v(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&c!=="fill"&&(o=parseFloat(o));else{for(c in a)if(j=!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==u&&(d=e);if(c==="d")d&& +d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text")for(e=0;e1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,b=this.translateY|| +0,c=this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(this.x||0)+" "+(this.y||0)+")");(t(c)||t(d))&&a.push("scale("+n(c,1)+" "+n(d,1)+")");a.length&&v(this.element,"transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions= +a,this.alignByTranslate=b,!c||fa(c))this.alignTo=d=c||"renderer",ha(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=n(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=w(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=w(g);this[this.placed?"animate":"attr"](h);this.placed= +!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d,e=this.rotation;c=this.element;var f=this.styles,g=e*Ba;d=this.textStr;var h;if(d===""||Ob.test(d))h=d.length+"|"+f.fontSize+"|"+f.fontFamily,a=b.cache[h];if(!a){if(c.namespaceURI===Ca||b.forExport){try{a=c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(i){}if(!a||a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){c=a.width;d=a.height;if(ya&&f&&f.fontSize==="11px"&& +d.toPrecision(3)==="16.9")a.height=d=14;if(e)a.width=M(d*ba(g))+M(c*U(g)),a.height=M(d*U(g))+M(c*ba(g))}this.bBox=a;h&&(b.cache[h]=a)}return a},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b=this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=v(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted= +a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=z(g);if(c.handleZ)for(c=0;cg||!t(g)&&t(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;A(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point= +null;Za(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f/g,'').replace(/<(i|em)>/g,'').replace(//g,"").split(//g),f=b.childNodes,g=/style="([^"]+)"/,h=/href="(http[^"]+)"/,i=v(b,"x"),j=a.styles,k=a.textWidth,l=j&&j.lineHeight,m=f.length,q=function(a){return l?z(l): +c.fontMetrics(/px$/.test(a&&a.style.fontSize)?a.style.fontSize:j.fontSize||11).h};m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===""&&e.pop();p(e,function(e,f){var l,m=0,e=e.replace(//g,"|||");l=e.split("|||");p(l,function(e){if(e!==""||l.length===1){var o={},n=y.createElementNS(Ca,"tspan"),p;g.test(e)&&(p=e.match(g)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),v(n,"style",p));h.test(e)&&!d&&(v(n,"onclick",'location.href="'+ +e.match(h)[1]+'"'),D(n,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");if(e!==" "&&(n.appendChild(y.createTextNode(e)),m?o.dx=0:o.x=i,v(n,o),!m&&f&&(!V&&d&&D(n,{display:"block"}),v(n,"dy",q(n),hb&&n.offsetHeight)),b.appendChild(n),m++,k))for(var e=e.replace(/([^\^])-/g,"$1- ").split(" "),o=e.length>1&&j.whiteSpace!=="nowrap",t,s,w=a._clipHeight,u=[],r=q(),$=1;o&&(e.length||u.length);)delete a.bBox,t=a.getBBox(),s=t.width,!V&&c.forExport&&(s=c.measureSpanWidth(n.firstChild.data, +a.styles)),t=s>k,!t||e.length===1?(e=u,u=[],e.length&&($++,w&&$*r>w?(e=["..."],a.attr("title",a.textStr)):(n=y.createElementNS(Ca,"tspan"),v(n,{dy:r,x:i}),p&&v(n,"style",p),b.appendChild(n),s>k&&(k=s)))):(n.removeChild(n.firstChild),u.unshift(e.pop())),e.length&&n.appendChild(y.createTextNode(e.join(" ").replace(/- /g,"-")))}})})},button:function(a,b,c,d,e,f,g,h,i){var j=this.label(a,b,c,i,null,null,null,null,"button"),k=0,l,m,q,o,n,p,a={x1:0,y1:0,x2:0,y2:1},e=x({"stroke-width":1,stroke:"#CCCCCC", +fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);q=e.style;delete e.style;f=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);o=f.style;delete f.style;g=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);n=g.style;delete g.style;h=x(e,{style:{color:"#CCC"}},h);p=h.style;delete h.style;F(j.element,ya?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(o)});F(j.element,ya?"mouseout":"mouseleave", +function(){k!==3&&(l=[e,f,g][k],m=[q,o,n][k],j.attr(l).css(m))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(n):a===3&&j.attr(h).css(p):j.attr(e).css(q)};return j.on("click",function(){k!==3&&d.call(j)}).attr(e).css(r({cursor:"default"},q))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=w(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=w(a[2])+b%2/2);return a},path:function(a){var b={fill:Q};Ka(a)?b.d=a:S(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=S(a)?a:{x:a, +y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(S(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=S(a)?a.r:e;e=this.createElement("rect").attr({rx:e,ry:e,fill:Q});return e.attr(S(a)?a:e.crisp(f,a,b,s(c,0),s(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[n(c,!0)?"animate":"attr"]({width:a, +height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return t(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:Q};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(w(b),w(c),d,e,f),i=/^url\((.*?)\)$/, +j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(w((d-b[0])/2),w((e-b[1])/2)))},j=a.match(i)[1],a=Jb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),T("img",{onload:function(){k(g,Jb[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/ +2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=U(f),j=ba(f),k=U(g),g=ba(g),e=e.end-fl&&/[ \-]/.test(b.textContent||b.innerText))D(b,{width:l+"px",display:"block",whiteSpace:"normal"}),i=l;this.getSpanCorrection(i,k,h,j,g)}D(b,{left:e+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(hb)k=b.offsetHeight;this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,c){var d={},e=ya?"-ms-transform":hb?"-webkit-transform":Xa?"MozTransform":Hb?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)";d[e+(Xa?"Origin":"-origin")]=b*100+"% "+ +c+"px";D(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});r(ua.prototype,{html:function(a,b,c){var d=G.chart.style,e=this.createElement("span"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=f.rotation=function(a,b){b==="align"&&(b="textAlign");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:w(b),y:w(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:d.fontFamily, +fontSize:d.fontSize});e.css=e.htmlCss;if(h.isSVG)e.add=function(a){var b,c=h.box.parentNode,d=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;p(d.reverse(),function(a){var d;b=a.div=a.div||T(Ga,{className:v(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+"px"},translateY:function(a){d.top=a+"px"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g); +e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e};return e}});var R;if(!V&&!da){Highcharts.VMLElement=R={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ga;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=T(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer, +c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();A(this,"add");return this},updateTransform:pa.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=U(a*Ba),c=ba(a*Ba);D(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""):Q})},getSpanCorrection:function(a, +b,c,d,e){var f=d?U(d*Ba):1,g=d?ba(d*Ba):0,h=n(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!=="left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),D(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(wa(a[b]))c[b]=w(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]? +1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,q=this.attrSetters,o=this;fa(a)&&t(b)&&(c=a,a={},a[c]=b);if(fa(a))c=a,o=c==="strokeWidth"||c==="stroke-width"?this.strokeweight:this[c];else for(c in a)if(d=a[c],m=!1,e=q[c]&&q[c].call(this,d,c),e!==!1&&d!==null){e!==u&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k|| +(this.symbolAttr(a),k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");f.path=d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,gb||(g[c]=d?"visible":"hidden"),c="top");g[c]=d;m=!0}else if(c==="zIndex")d&&(g[c]=d),m=!0;else if(sa(c,["x","y","width","height"])!==-1)this[c]=d,c==="x"||c==="y"?c={x:"left",y:"top"}[c]:d=s(0,d),this.updateClipping? +(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c==="class"&&h==="DIV")f.className=d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,wa(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||T(i.prepVML([""]),null,null,f))[c]=d||"solid",this.dashstyle=d,m=!0;else if(c==="fill")if(h==="SPAN")g.color=d;else{if(h!=="IMG")f.filled=d!==Q?!0:!1,d=i.color(d,f,c,this),c="fillcolor"}else if(c=== +"opacity")m=!0;else if(h==="shape"&&c==="rotation")this[c]=f.style[c]=d,f.style.left=-w(ba(d*Ba)+1)+"px",f.style.top=w(U(d*Ba))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;m||(gb?f[c]=d:v(f,c,d))}return o},clip:function(a){var b=this,c;a?(c=a.members,ha(c,b),c.push(b),b.destroyClip=function(){ha(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:gb?"inherit":"rect(auto)"});return b.css(a)},css:pa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&& +Na(a)},destroy:function(){this.destroyClip&&this.destroyClip();return pa.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=C.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=z(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,q,o;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){q=n(a.width,3);o=(a.opacity|| +0.15)/q;for(e=1;e<=3;e++){l=q*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=[''];h=T(g.prepVML(j),null,{left:z(i.left)+n(a.offsetX,1),top:z(i.top)+n(a.offsetY,1)});if(c)h.cutOff=l+1;j=[''];T(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};R=ia(pa,R); +var xb={Element:R,isIE8:ra.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ga);e=d.element;e.style.position="relative";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.cache={};this.setSize(b,c,!1);if(!y.namespaces.hcv){y.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{y.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){y.styleSheets[0].cssText+= +"hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=S(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+w(a?e:d)+"px,"+w(a?f: +b)+"px,"+w(a?b:f)+"px,"+w(a?d:e)+"px)"};!a&&gb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){p(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=Q;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,q,o,n,H,s,t="",a=a.stops,u,w=[],r=function(){h=['']; +T(e.prepVML(h),null,null,b)};q=a[0];u=a[a.length-1];q[0]>0&&a.unshift([0,q[1]]);u[0]<1&&a.push([1,u[1]]);p(a,function(a,b){g.test(a[1])?(f=ta(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);w.push(a[0]*100+"% "+k);b?(n=l,H=k):(o=l,s=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,q=m.x2||m[2]||0,m=m.y2||m[3]||0,t='angle="'+(90-P.atan((m-a)/(q-c))*180/Aa)+'"',r();else{var j=m.r,Sa=j*2,Ta=j*2,v=m.cx,B=m.cy,x=b.radialReference,$,j=function(){x&&($=d.getBBox(),v+=(x[0]-$.x)/$.width- +0.5,B+=(x[1]-$.y)/$.height-0.5,Sa*=x[2]/$.width,Ta*=x[2]/$.height);t='src="'+G.global.VMLRadialGradientURL+'" size="'+Sa+","+Ta+'" origin="0.5,0.5" position="'+v+","+B+'" color2="'+s+'" ';r()};d.added?j():F(d,"add",j);j=H}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ta(a),h=["<",c,' opacity="',f.get("a"),'"/>'],T(this.prepVML(h),null,null,b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join(""); +b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol("rect");g.r=S(a)?a.r:e;return g.attr(S(a)?a:g.crisp(f,a,b,s(c,0),s(d,0)))},invertChild:function(a,b){var c=b.style;D(a,{flip:"x",left:z(c.width)-1,top:z(c.height)-1,rotation:-90})}, +symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=U(f),i=ba(f),j=U(g),k=ba(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!t(e)||!e.r?f=ua.prototype.symbols.square.apply(0, +arguments):(h=I(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};Highcharts.VMLRenderer=R=function(){this.init.apply(this,arguments)};R.prototype=x(ua.prototype,xb);Ya=R}ua.prototype.measureSpanWidth=function(a,b){var c=y.createElement("span"),d;d=y.createTextNode(a);c.appendChild(d);D(c,b);this.box.appendChild(c);d=c.offsetWidth;Na(c); +return d};var Mb;if(da)Highcharts.CanVGRenderer=R=function(){Ca="http://www.w3.org/1999/xhtml"},R.prototype.symbols={},Mb=function(){function a(){var a=b.length,d;for(d=0;do[q]?o[q]=g+j:n||(c=!1);if(n)B=(d=d.ticks[i[a+(e?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[e?0:1],i=B,e&&!h||f&&h?g+ki&&(c=!1)):g+j>m&&(g=m-j,d&&g+k0&&b.height>0){f=x({align:c&&k&&"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=u.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation, +zIndex:w}).css(f.style).add();b=[o[1],o[4],n(o[6],o[1])];o=[o[2],o[5],n(o[7],o[2])];c=La(b);k=La(o);g.align(f,!1,{x:c,y:k,width:za(b)-c,height:za(o)-k});g.show()}else g&&g.hide();return a},destroy:function(){ha(this.axis.plotLinesAndBands,this);delete this.axis;Ma(this)}};qa.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:J,lineColor:"#C0D0E0", +lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0, +maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Da(this.total,-1)},style:J.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.coll= +(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=t(d.linkedTo); +this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min=this.max=null;this.crosshair=n(d.crosshair,ja(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;sa(this,a.axes)===-1&&(a.axes.push(this), +a[this.coll].push(this));this.series=this.series||[];if(a.inverted&&c&&this.reversed===u)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)F(this,f,d[f]);if(this.isLog)this.val2lin=xa,this.lin2val=ga},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(G[this.coll],a))},defaultLabelFormatter:function(){var a= +this.axis,b=this.value,c=a.categories,d=this.dateTimeLabelFormat,e=G.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Fa(h,this);else if(c)g=b;else if(d)g=ab(d,b);else if(f&&a>=1E3)for(;f--&&g===u;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Da(b/c,-1)+e[f]);g===u&&(g=b>=1E4?Da(b,0):Da(b,-1,u,""));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();p(a.series,function(c){if(c.visible|| +!b.options.chart.ignoreHiddenSeries){var d;d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=I(n(a.dataMin,d[0]),La(d)),a.dataMax=s(n(a.dataMax,d[0]),za(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(t(c)&&t(e))a.dataMin=I(n(a.dataMin,c),c),a.dataMax=s(n(a.dataMax,e),e);if(t(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMaxg+this.width)m=!0}else if(a=g,c=l-this.right,ih+this.height)m=!0;return m&&!d?null:f.renderer.crispLine(["M",a,i,"L",c,j],b||1)},getLinearTickPositions:function(a, +b,c){for(var d,b=aa(N(b/a)*a),c=aa(Ha(c/a)*a),e=[];b<=c;){e.push(b);b=aa(b+a);if(b===d)break;d=b}return e},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===u&&!this.isLog)t(a.min)||t(a.max)?this.minRange=null:(p(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-i[g-1],f===u||hb&&(g=0);c=s(c,g);e=s(e,fa(i)?0:g/2);f=s(f,i==="on"?0:g);!a.noSharedTooltip&& +t(m)&&(d=t(d)?I(d,m):m)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=I(c,b),this.closestPointRange=d;if(a)this.oldTransA=i;this.translationSlope=this.transA=i=this.len/(b+f||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=i*e},setTickPositions:function(a){var b=this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval, +m=d.minTickInterval,q=d.tickPixelInterval,o,ma=b.categories;h?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=n(c.min,c.dataMin),b.max=n(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=n(b.userMin,d.min,b.dataMin),b.max=n(b.userMax,d.max,b.dataMax));if(e)!a&&I(b.min,n(b.dataMin,b.min))<=0&&ka(10,1),b.min=aa(xa(b.min)),b.max=aa(xa(b.max));if(b.range&&t(b.max))b.userMin=b.min=s(b.min,b.max-b.range),b.userMax=b.max,b.range=null;b.beforePadding&&b.beforePadding(); +b.adjustForMinRange();if(!ma&&!b.usePercentage&&!h&&t(b.min)&&t(b.max)&&(c=b.max-b.min)){if(!t(d.min)&&!t(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!t(d.max)&&!t(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&q===b.linkedParent.options.tickPixelInterval?b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=n(l,ma?1:(b.max-b.min)*q/s(b.len,q)),!t(l)&&b.lens(2*b.len,200)&&ka(19,!0),a=f?b.getTimeTicks(b.normalizeTimeTickInterval(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange,!0):e?b.getLogTickPositions(b.tickInterval,b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),o&&a.splice(1,a.length-2), +b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h(b[d]||0)&&this.options.alignTicks!==!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey, +b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1&&this.min!==u){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e=this.dataMax&&(b=u));this.displayBtn=a!==u||b!==u;this.setExtremes(a,b,!1,u,{trigger:"zoom"});return!0},setAxisSize:function(){var a= +this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=n(b.left,a.plotLeft+c);this.top=f=n(b.top,a.plotTop);this.width=c=n(b.width,a.plotWidth-c+d);this.height=b=n(b.height,a.plotHeight);this.bottom=a.chartHeight-b-f;this.right=a.chartWidth-c-g;this.len=s(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a=this.isLog;return{min:a?aa(ga(this.min)):this.min,max:a?aa(ga(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}}, +getThreshold:function(a){var b=this.isLog,c=b?ga(this.min):this.min,b=b?ga(this.max):this.max;c>a||a===null?a=c:b15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,q=d.title,o=d.labels,ma=0,H=b.axisOffset,w=b.clipOffset,r=[-1,1,1,-1][h],v, +x=1,Z=n(o.maxStaggerLines,5),y,z,K,B;a.hasData=j=a.hasVisibleSeries||t(a.min)&&t(a.max)&&!!e;a.showAxis=b=j||n(d.showEmpty,!0);a.staggerLines=a.horiz&&o.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:o.zIndex||7}).add();if(j||a.isLinked){a.labelAlign=n(o.align||a.autoLabelAlign(o.rotation));p(e,function(b){f[b]?f[b].addLabel():f[b]=new Qa(a,b)});if(a.horiz&& +!a.staggerLines&&Z&&!o.rotation){for(v=a.reversed?[].concat(e).reverse():e;x1)a.staggerLines=x}p(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)ma=s(f[b].getLabelSize(),ma)});if(a.staggerLines)ma*=a.staggerLines,a.labelOffset=ma}else for(v in f)f[v].destroy(),delete f[v];if(q&&q.text&&q.enabled!== +!1){if(!a.axisTitle)a.axisTitle=c.text(q.text,0,0,q.useHTML).attr({zIndex:7,rotation:q.rotation||0,align:q.textAlign||{low:"left",middle:"center",high:"right"}[q.align]}).css(q.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?"height":"width"],m=n(q.margin,g?5:10),l=q.offset;a.axisTitle[b?"show":"hide"]()}a.offset=r*n(d.offset,H[h]);a.axisTitleMargin=n(l,ma+m+(h!==2&&ma&&r*d.labels[g?"y":"x"]));H[h]=s(H[h],a.axisTitleMargin+k+r*a.offset);w[i]=s(w[i],N(d.lineWidth/2)*2)}, +getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=z(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+ +(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,b=a.horiz,c=a.reversed,d=a.chart,e=d.renderer,f=a.options,g=a.isLog,h=a.isLinked,i=a.tickPositions,j,k=a.axisTitle,l=a.stacks,m=a.ticks,q=a.minorTicks,o=a.alternateBands,n=f.stackLabels,H=f.alternateGridColor,s=a.tickmarkOffset,r=f.lineWidth,w=d.hasRendered&&t(a.oldMin)&&!isNaN(a.oldMin),v= +a.hasData,x=a.showAxis,y,z=a.justifyLabels=!a.staggerLines&&b&&f.labels.overflow==="justify",K;a.labelEdge.length=0;p([m,q,o],function(a){for(var b in a)a[b].isActive=!1});if(v||h)if(a.minorTickInterval&&!a.categories&&p(a.getMinorTickPositions(),function(b){q[b]||(q[b]=new Qa(a,b,"minor"));w&&q[b].isNew&&q[b].render(null,!0);q[b].render(null,!1,1)}),i.length&&(j=i.slice(),(b&&c||!b&&!c)&&j.reverse(),z&&(j=j.slice(1).concat([j[0]])),p(j,function(b,c){z&&(c=c===j.length-1?0:c+1);if(!h||b>=a.min&&b<= +a.max)m[b]||(m[b]=new Qa(a,b)),w&&m[b].isNew&&m[b].render(c,!0,0.1),m[b].render(c,!1,1)}),s&&a.min===0&&(m[-1]||(m[-1]=new Qa(a,-1,null,!0)),m[-1].render(-1))),H&&p(i,function(b,c){if(c%2===0&&b=0.5)a=w(a),g=this.getLinearTickPositions(a, +b,c);else if(a>=0.08)for(var f=N(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];fb&&(!d||k<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=ga(b),c=ga(c),a=e[d?"minorTickInterval":"tickInterval"],a=n(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=nb(a,null,mb(a)),g=Ra(this.getLinearTickPositions(a,b,c),xa),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval= +a;return g};qa.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=G.global.useUTC,h,i=new Date(b-Pa),j=a.unitRange,k=a.count;if(t(b)){j>=E.second&&(i.setMilliseconds(0),i.setSeconds(j>=E.minute?0:k*N(i.getSeconds()/k)));if(j>=E.minute)i[Cb](j>=E.hour?0:k*N(i[pb]()/k));if(j>=E.hour)i[Db](j>=E.day?0:k*N(i[qb]()/k));if(j>=E.day)i[sb](j>=E.month?1:k*N(i[Wa]()/k));j>=E.month&&(i[Eb](j>=E.year?0:k*N(i[db]()/k)),h=i[eb]());j>=E.year&&(h-=h%k,i[Fb](h));if(j===E.week)i[sb](i[Wa]()-i[rb]()+n(d,1));b= +1;Pa&&(i=new Date(i.getTime()+Pa));h=i[eb]();for(var d=i.getTime(),l=i[db](),m=i[Wa](),q=g?Pa:(864E5+i.getTimezoneOffset()*6E4)%864E5;d1||M(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b, +c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},n(this.options.hideDelay,500)),b&&p(b,function(a){a.setState()}),this.chart.hoverPoints=null},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=0,h=0,i,a=ja(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===u&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(p(a,function(a){i= +a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:h]);return Ra(c,w)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=n(this.options.distance,12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+s(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k=k&&c<=k+b&&(k=c+ +f+i));k+b>f+h&&(k=s(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ja(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];p(b,function(a){c=a.series;d.push(c.tooltipFormatter&&c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=this.shared; +clearTimeout(this.hideTimer);this.followPointer=ja(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];l&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&p(h,function(a){a.setState()}),p(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Za(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color|| +"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);A(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(w(c.x),w(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}};var $a=Highcharts.Pointer=function(a,b){this.init(a,b)};$a.prototype={init:function(a,b){var c=b.chart,d=c.events,e=da?"":c.zoomType,c=a.inverted, +f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new tb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||C.event;if(!a.target)a.target=a.srcElement;a=Rb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Qb(this.chart.container);d.pageX===u?(c=s(a.x,a.clientX-b.left),d=a.y):(c=d.pageX- +b.left,d=d.pageY-b.top);return r(a,{chartX:w(c),chartY:w(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};p(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft},runPointActions:function(a){var b=this,c=b.chart,d=c.series,e=c.tooltip,f,g,h=c.hoverPoint,i=c.hoverSeries,j,k,l=c.chartWidth,m=b.getIndex(a);if(e&& +b.options.tooltip.shared&&(!i||!i.noSharedTooltip)){g=[];j=d.length;for(k=0;kl&&g.splice(j,1);if(g.length&&g[0].clientX!==b.hoverX)e.refresh(g,a),b.hoverX=g[0].clientX}if(i&&i.tracker){if((f=i.tooltipPoints[m])&&f!==h)f.onMouseOver(a)}else e&&e.followPointer&&!e.isHidden&& +(d=e.getAnchor([{}],a),e.updatePosition({plotX:d[0],plotY:d[1]}));if(e&&!b._onDocumentMouseMove)b._onDocumentMouseMove=function(a){b.onDocumentMouseMove(a)},F(y,"mousemove",b._onDocumentMouseMove);p(c.axes,function(b){b.drawCrosshair(a,n(f,h))})},reset:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,f=e&&e.shared?b.hoverPoints:d;(a=a&&e&&f)&&ja(f)[0].plotX===u&&(a=!1);if(a)e.refresh(f),d&&d.setState(d.state,!0);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&e.hide();if(this._onDocumentMouseMove)X(y, +"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null;p(b.axes,function(a){a.hideCrosshair()});this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;p(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},pinchTranslate:function(a,b,c,d,e,f,g,h){a&&this.pinchTranslateDirection(!0,c,d, +e,f,g,h);b&&this.pinchTranslateDirection(!1,c,d,e,f,g,h)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x":"y",k=a?"X":"Y",l="chart"+k,m=a?"width":"height",q=i["plot"+(a?"Left":"Top")],o,n,p=h||1,s=i.inverted,t=i.bounds[a?"h":"v"],r=b.length===1,w=b[0][l],u=c[0][l],v=!r&&b[1][l],x=!r&&c[1][l],y,c=function(){!r&&M(w-v)>20&&(p=h||M(u-x)/M(w-v));n=(q-u)/p+w;o=i["plot"+(a?"Width":"Height")]/p};c();b=n;bt.max&&(b=t.max-o,y=!0);y?(u-=0.8*(u-g[j][0]),r|| +(x-=0.8*(x-g[j][1])),c()):g[j]=[u,x];s||(f[j]=n-q,f[m]=o);f=s?1/p:p;e[m]=o;e[j]=b;d[s?a?"scaleY":"scaleX":"scale"+k]=p;d["translate"+k]=f*q+(u-f*w)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches,g=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker,m={},q=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),o={};(k||e)&&!q&&a.preventDefault();Ra(f, +function(a){return b.normalize(a)});if(a.type==="touchstart")p(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],p(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=I(e,f),e=s(e,f);b.min=I(a.pos,g-d);b.max=s(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker=l=r({destroy:la},c.plotBox);b.pinchTranslate(i,j,d,f,m,l,o,h);b.hasPinched= +k;b.scaleGroups(m,o);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,q=this.mouseDownY;dh+j&&(d=h+j);ei+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m- +d,2)+Math.pow(q-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,q-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:M(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-q,this.selectionMarker.attr({height:M(d),y:(d>0?0:d)+q}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}}, +drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged||c)p(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.coll].push({axis:a,min:I(c,b),max:s(c,b)}),h=!0)}}),h&&A(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy(); +c&&this.scaleGroups()}if(b)D(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft, +a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=v(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a= +a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries,c=(a=a.relatedTarget||a.toElement)&&a.point&&a.point.series;if(b&&!b.options.stickyTracking&&!this.inClass(a,"highcharts-tooltip")&&c!==b)b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble=!0;if(!b.cancelClick)c&&this.inClass(a.target,"highcharts-tracker")?(g=this.chartPosition,h=c.plotX,i=c.plotY,r(c,{pageX:g.left+d+(f? +b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),A(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&A(b,"click",a))},onContainerTouchStart:function(a){var b=this.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length=== +1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,"onmousedown","onContainerMouseDown"],[b,"onmousemove","onContainerMouseMove"],[b,"onclick","onContainerClick"],[b,"mouseleave","onContainerMouseLeave"],[y,"mouseup","onDocumentMouseUp"]];ib&&c.push([b,"ontouchstart","onContainerTouchStart"],[b,"ontouchmove","onContainerTouchMove"],[y,"touchend","onDocumentTouchEnd"]);p(c,function(b){a["_"+ +b[2]]=function(c){a[b[2]](c)};b[1].indexOf("on")===0?b[0][b[1]]=a["_"+b[2]]:F(b[0],b[1],a["_"+b[2]])})},destroy:function(){var a=this;p(a._events,function(b){b[1].indexOf("on")===0?b[0][b[1]]=null:X(b[0],b[1],a["_"+b[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};J=Highcharts.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d=c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode; +if(e!==u&&e!==b.hoverPoint)e.onMouseOver(c)};p(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)p(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),ib))a[b].on("touchstart",f)}),a._hasTracking=!0},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer, +h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,q=function(){if(f.hoverSeries!==a)a.onMouseOver()};if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;mc-6&&g(q||c.chartWidth-2*k-t))b.itemX=t,b.itemY+=p+b.lastLineHeight+o,b.lastLineHeight=0;b.maxItemWidth=s(b.maxItemWidth,e);b.lastItemY=p+b.itemY+o;b.lastLineHeight=s(g,b.lastLineHeight);a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=p+g+o,b.lastLineHeight=g);b.offsetWidth= +q||s((f?b.itemX-t-l:e)+k,b.offsetWidth)},getAllItems:function(){var a=[];p(this.chart.series,function(b){var c=b.options;if(n(c.showInLegend,!t(c.linkedTo)?u:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(), +a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=a.getAllItems();ob(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;p(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)), +i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,"stroke-width":l||0,fill:m||Q}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;p(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight, +h,i=this.clipRect,j=e.navigation,k=n(j.animation,!0),l=j.arrowSize||12,m=this.nav,q=this.pages,o,s=this.allItems;e.layout==="horizontal"&&(f/=2);g&&(f=I(f,g));q.length=0;if(a>f&&!e.useHTML){this.clipHeight=h=f-20-this.titleHeight-this.padding;this.currentPage=n(this.currentPage,1);this.fullHeight=a;p(s,function(a,b){var c=a._legendItemPos[1],d=w(a.legendItem.bBox.height),e=q.length;if(!e||c-q[e-1]>h)q.push(o||c);b===s.length-1&&c+d-q[e-1]>h&&q.push(c);c!==o&&(o=c)});if(!i)i=b.clipRect=d.clipRect(0, +this.padding,9999,0),b.contentGroup.clip(i);i.attr({height:h});if(!m)this.nav=m=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,l,l).on("click",function(){b.scroll(-1,k)}).add(m),this.pager=d.text("",15,10).css(j.style).add(m),this.down=d.symbol("triangle-down",0,0,l,l).on("click",function(){b.scroll(1,k)}).add(m);b.scroll(0);a=f}else if(m)i.attr({height:c.chartHeight}),m.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages, +d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,h=g.activeColor,g=g.inactiveColor,i=this.pager,j=this.padding;e>d&&(e=d);if(e>0)b!==u&&Oa(b,this.chart),this.nav.attr({translateX:j,translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default":"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?"default":"pointer"}),c=-c[e-1]+this.initialItemY, +this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};R=Highcharts.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||12;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-5-c/2,a.symbolWidth,c,n(a.options.symbolRadius,2)).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d;d=a.symbolWidth;var e=this.chart.renderer,f=this.legendGroup,a=a.baseline-w(e.fontMetrics(a.options.itemStyle.fontSize).b* +0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled)b=c.radius,this.legendSymbol=d=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b).add(f),d.isMarker=!0}};/Trident\/7\.0/.test(ra)&&Va(zb.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};c.chart.renderer.forExport?d():setTimeout(d)});fb.prototype={init:function(a,b){var c,d=a.series;a.series=null;c=x(G, +a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ia.length;Ia.push(f);d.reflow!==!1&&F(f,"load",function(){f.initReflow()});if(e)for(g in e)F(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=da?!1:n(d.animation,!0);f.pointCount=0;f.counters=new Ab; +f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=L[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&p(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.isDirtyBox, +j=c.length,k=j,l=this.renderer,m=l.isHidden(),q=[];Oa(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;p(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,p(b,function(a){a.setScale()});this.adjustTickAmounts(); +this.getMargins();p(b,function(a){a.isDirty&&(i=!0)});p(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,q.push(function(){A(a,"afterSetExtremes",r(a.eventArgs,a.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();p(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();A(this,"redraw");m&&this.cloneRenderTo(!0);p(q,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;dI(k.dataMin,k.min)&&i=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+"px"}).align(r({y:a+e.margin},d),!1,"spacingBox"),!d.floating&&!d.verticalAlign&&(a=Ha(a+c.getBBox().height)));this.titleOffset= +a},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=jb(b,"width");this.containerHeight=jb(b,"height");this.chartWidth=s(0,a.width||this.containerWidth||600);this.chartHeight=s(0,n(a.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Na(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone= +b=this.renderTo.cloneNode(0),D(b,{position:"absolute",top:"-9999px",display:"block"}),y.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+ub++;if(fa(a))this.renderTo=a=y.getElementById(a);a||ka(13,!0);c=z(v(a,"data-highcharts-chart"));!isNaN(c)&&Ia[c]&&Ia[c].destroy();v(a,"data-highcharts-chart",this.index);a.innerHTML="";a.offsetWidth||this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight; +this.container=a=T(Ga,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new ua(a,c,d,!0):new Ya(a,c,d);da&&this.renderer.create(this,a,c,d)},getMargins:function(){var a=this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend, +f=n(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!t(d[0]))this.plotTop=s(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!t(d[1]))this.marginRight=s(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!t(d[3]))this.plotLeft=s(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!t(d[0]))this.plotTop=s(this.plotTop,c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!t(d[2]))this.marginBottom= +s(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&p(this.axes,function(a){a.getOffset()});t(d[3])||(this.plotLeft+=b[3]);t(d[0])||(this.plotTop+=b[0]);t(d[2])||(this.marginBottom+=b[2]);t(d[1])||(this.marginRight+=b[1]);this.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||jb(d,"width"),f=c.height||jb(d,"height"),c= +a?a.target:C,d=function(){if(b.container)b.setSize(e,f,!1),b.hasUserSize=null};if(!b.hasUserSize&&e&&f&&(c===C||c===y)){if(e!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),a?b.reflowTimeout=setTimeout(d,100):d();b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};F(C,"resize",b);F(a,"destroy",function(){X(C,"resize",b)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&A(d,"endResize",null,function(){d.isResizing-= +1})};Oa(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(t(a))d.chartWidth=e=s(0,w(a)),d.hasUserSize=!!e;if(t(b))d.chartHeight=f=s(0,w(b));(oa?kb:D)(d.container,{width:e+"px",height:f+"px"},oa);d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;p(d.axes,function(a){a.isDirty=!0;a.setScale()});p(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c);d.oldChartHeight=null;A(d,"resize");oa===!1?g():setTimeout(g,oa&&oa.duration|| +500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=w(this.plotLeft);this.plotTop=j=w(this.plotTop);this.plotWidth=k=s(0,w(d-i-this.marginRight));this.plotHeight=l=s(0,w(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox= +c.plotBox={x:i,y:j,width:k,height:l};d=2*N(this.plotBorderWidth/2);b=Ha(s(d,h[3])/2);c=Ha(s(d,h[0])/2);this.clipBox={x:b,y:c,width:N(this.plotSizeX-s(d,h[1])/2-b),height:N(this.plotSizeY-s(d,h[2])/2-c)};a||p(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=n(b[0],a[0]);this.marginRight=n(b[1],a[1]);this.marginBottom=n(b[2],a[2]);this.plotLeft=n(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a= +this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,q,o=this.plotLeft,n=this.plotTop,p=this.plotWidth,s=this.plotHeight,r=this.plotBox,t=this.clipRect,w=this.clipBox;q=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null,null,null,c-q,d-q));else{e={fill:j||Q};if(i)e.stroke=a.borderColor,e["stroke-width"]= +i;this.chartBackground=b.rect(q/2,q/2,c-q,d-q,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(r):this.plotBackground=b.rect(o,n,p,s,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(r):this.plotBGImage=b.image(l,o,n,p,s).add();t?t.animate({width:w.width,height:w.height}):this.clipRect=b.clipRect(w);if(m)g?g.animate(g.crisp(null,o,n,p,s)):this.plotBorder=b.rect(o,n,p,s,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a= +this,b=a.options.chart,c,d=a.options.series,e,f;p(["inverted","angular","polar"],function(g){c=L[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=L[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;p(b,function(a){a.linkedSeries.length=0});p(b,function(b){var d=b.options.linkedTo;if(fa(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},render:function(){var a=this,b=a.axes, +c=a.renderer,d=a.options,e=d.labels,f=d.credits,g;a.setTitle();a.legend=new zb(a,d.legend);a.getStacks();p(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;p(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&p(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();p(a.series,function(a){a.translate();a.setTooltipPoints();a.render()});e.items&&p(e.items,function(b){var d= +r(e.style,b.style),f=z(d.left)+a.plotLeft,g=z(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on("click",function(){if(g)location.href=g}).attr({align:f.position.align,zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;A(a,"destroy");Ia[a.index]=u;a.renderTo.removeAttribute("data-highcharts-chart"); +X(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();p("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",X(d),f&&Na(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!V&&C==C.top&&y.readyState!=="complete"||da&&!C.canvg?(da?Mb.push(function(){a.firstRender()}, +a.options.global.canvasToolsURL):y.attachEvent("onreadystatechange",function(){y.detachEvent("onreadystatechange",a.firstRender);y.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(),A(a,"init"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),p(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),A(a,"beforeRender"),a.pointer=new $a(a,b),a.render(),a.renderer.draw(),c&&c.apply(a, +[a]),p(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),A(a,"load")},splashArray:function(a,b){var c=b[a],c=S(c)?c:[c,c,c,c];return[n(b[a+"Top"],c[0]),n(b[a+"Right"],c[1]),n(b[a+"Bottom"],c[2]),n(b[a+"Left"],c[3])]}};fb.prototype.callbacks=[];var xb=Highcharts.CenteredSeriesMixin={getCenter:function(){var a=this.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[n(b[0],"50%"),n(b[1],"50%"),a.size||"100%",a.innerSize||0],g=I(e,f),h;return Ra(a, +function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*z(a)/100:a)+(d?c:0)})}},Ja=function(){};Ja.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.pointValKey,a=Ja.prototype.optionsToObject.call(this,a);r(this, +a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===u&&c)this.x=b===u?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b[d[0]]=a;else if(Ka(a)){if(a.length>e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];f++}for(;ga+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions= +a;c=x(e,c.series,a);this.tooltipOptions=x(G.tooltip,G.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;return c},getColor:function(){var a=this.options,b=this.userOptions,c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Y[this.type].color;if(!e&&!a.colorByPoint)t(b._colorIndex)?a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a= +this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)t(a._symbolIndex)?a=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)},drawLegendSymbol:R.drawLineMarker,setData:function(a,b){var c=this,d=c.points,e=c.options,f=c.chart,g=null,h=c.xAxis,i=h&&!!h.categories,j;c.xIncrement=null;c.pointRange=i?1:e.pointRange;c.colorCounter=0;var a=a||[],k=a.length; +j=e.turboThreshold;var l=this.xData,m=this.yData,q=c.pointArrayMap,q=q&&q.length;p(this.parallelArrays,function(a){c[a+"Data"].length=0});if(j&&k>j){for(j=0;g===null&&jj||this.forceCrop))if(a=h.min,h=h.max,b[d-1]h)b=[],c=[];else if(b[0]h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start,f=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===u||d= +c){f=s(0,i-h);break}for(;id){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m0), +j=this.getExtremesFromAll||this.cropped||(c[l+1]||j)>=g&&(c[l-1]||j)<=h,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=n(void 0,La(e));this.dataMax=n(void 0,za(e))},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||wa(i),k=a.threshold,a=0;a=f.min&&c<=f.max){h=b[i+1];c=d===u?0:d+1;for(d=b[i+1]?I(s(0,N((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.dateTimeLabelFormats,d=b.xDateFormat,e=this.xAxis,f=e&&e.options.type==="datetime",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!d){if(e)for(g in E){if(E[g]>=e){d=c[g];break}}else d=c.day;d=d||c.year}f&&d&&wa(a.key)&&(b=b.replace("{point.key}", +"{point.key:"+d+"}"));return Fa(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&A(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&A(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b= +this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!S(e))e=Y[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()}, +e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m,q=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=N(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled=== +u||i.enabled,m=c.isInsidePlot(w(d),e,c.inverted),a&&e!==u&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""],h=a.r,i=n(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:m?V?"inherit":"visible":"hidden"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(m&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(q)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{}, +c=c||{},d=d||{};for(f in e)g=e[f],h[f]=n(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Y[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h={stroke:g,fill:g},i=a.points||[],j=[],k,l=a.pointAttrToOptions,m=b.negativeColor,n=c.lineColor,o=c.fillColor,s;b.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color||ta(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,h);p(["hover","select"],function(b){j[b]=a.convertAttribs(d[b], +j[""])});a.pointAttr=j;for(g=i.length;g--;){h=i[g];if((c=h.options&&h.options.marker||h.options)&&c.enabled===!1)c.radius=0;if(h.negative&&m)h.color=h.fillColor=m;k=b.colorByPoint||h.color;if(h.options)for(s in l)t(c[l[s]])&&(k=!0);if(k){c=c||{};k=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker)f.color=ta(f.color||h.color).brighten(f.brightness||e.brightness).get();f={color:h.color};if(!o)f.fillColor=h.color;if(!n)f.lineColor=h.color;k[""]=a.convertAttribs(r(f,c),j[""]);k.hover=a.convertAttribs(d.hover, +j.hover,k[""]);k.select=a.convertAttribs(d.select,j.select,k[""])}else k=j;h.pointAttr=k}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(ra),d,e,f=a.data||[],g,h,i;A(a,"destroy");X(a);p(a.axisTypes||[],function(b){if(i=a[b])ha(i.series,a),i.isDirty=i.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g=f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);p("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","), +function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ha(b.series,a);for(h in a)delete a[h]},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;p(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"),d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a= +this,b=[],c,d=[];p(a.segments,function(e){c=a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=b.linecap!=="square",g=this.getGraphPath(),h=b.negativeColor;h&&c.push(["graphNeg",h]);p(c,function(c,h){var k=c[0],l=a[k];if(l)Za(l),l.animate({d:g});else if(d&&g.length)l={stroke:c[1],"stroke-width":d,zIndex:1},e?l.dashstyle=e:f&&(l["stroke-linecap"]= +l["stroke-linejoin"]="round"),a[k]=a.chart.renderer.path(g).attr(l).add(a.group).shadow(!h&&b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=s(e,j),l=this.yAxis;if(d&&(f||g)){d=w(l.toPixels(a.threshold||0,!0));d<0&&(k-=d);a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth- +d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed?(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};p(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)F(c,"resize",a),F(b, +"destroy",function(){X(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG, +e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group","series",e,f,h);this.markerGroup=this.plotGroup("markerGroup","markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels&&this.drawDataLabels();this.visible&&this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&& +!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:n(d&&d.left,a.plotLeft),translateY:n(e&&e.top,a.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();b&&A(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg, +e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&&(a={"stroke-width":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===u?!h:a)?"show":"hide";p(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c, +a);c.isDirty=!0;c.options.stacking&&p(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});p(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();A(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===u?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;A(this,a?"select":"unselect")},drawTracker:J.drawTrackerGraph};r(fb.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b= +n(b,!0),A(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new qa(this,x(a,{index:this[e].length,isX:b}));f[e]=ja(f[e]||{});f[e].push(a);n(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv=c=T(Ga,{className:"highcharts-loading"},r(d.style,{zIndex:10,display:Q}),this.container),this.loadingSpan=T("span", +null,d.labelStyle,c);this.loadingSpan.innerHTML=a||b.lang.loading;if(!this.loadingShown)D(c,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),kb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&kb(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){D(b,{display:Q})}});this.loadingShown=!1}});r(Ja.prototype,{update:function(a, +b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=n(b,!0);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);if(S(a)){e.getAttribs();if(f)a&&a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);if(a&&a.dataLabels&&d.dataLabel)d.dataLabel=d.dataLabel.destroy()}g=sa(d,h);e.updateParallelArrays(d,g);j.data[g]=d.options;e.isDirty=e.isDirtyData=!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d); +b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,f=d.chart,g,h=d.data;Oa(b,f);a=n(a,!0);c.firePointEvent("remove",null,function(){g=sa(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.updateParallelArrays(c,"splice",g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})}});r(O.prototype,{addPoint:function(a,b,c,d){var e=this.options,f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xAxis&&this.xAxis.names,k=g&&g.shift||0,l=e.data, +m,q=this.xData;Oa(d,i);c&&p([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=k+1});if(h)h.isArea=!0;b=n(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=q.length;if(this.requireSorting&&gg;)h--;this.updateParallelArrays(d,"splice",h,0,0);this.updateParallelArrays(d,h);if(j)j[g]=d.name;l.splice(h,0,a);m&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1): +(f.shift(),this.updateParallelArrays(d,"shift"),l.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},remove:function(a,b){var c=this,d=c.chart,a=n(a,!0);if(!c.isRemoving)c.isRemoving=!0,A(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},update:function(a,b){var c=this.chart,d=this.type,e=L[d].prototype,f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data}, +a);this.remove(!1);for(f in e)e.hasOwnProperty(f)&&(this[f]=u);r(this,L[a.type||d].prototype);this.init(c,a);n(b,!0)&&c.redraw(!1)}});r(qa.prototype,{update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=u;this.init(c,r(a,{events:u}));c.isDirtyBox=!0;n(b,!0)&&c.redraw()},remove:function(a){var b=this.chart,c=this.coll;p(this.series,function(a){a.remove(!1)});ha(b.axes,this);ha(b[c],this); +b.options[c].splice(this.options.index,1);p(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;n(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});var ca=ia(O);L.line=ca;Y.area=x(W,{threshold:0});var Ua=ia(O,{type:"area",getSegments:function(){var a=[],b=[],c=[],d=this.xAxis,e=this.yAxis,f=e.stacks[this.stackKey],g={},h,i,j=this.points,k=this.options.connectNulls,l,m,n;if(this.options.stacking&&!this.cropped){for(m= +0;m=0;d--)g=n(a[d].yBottom,f),da&&i>e?(i=s(a,e),k=2*e-i):ig&&k>e?(k=s(g,e),i=2*e-k):kf?b-f:e-(d.translate(a.y,0,1,0,1)<=e?f:0)));a.barX=o;a.pointWidth=g;b=M(o)<0.5;p=w(o+p)+j;o=w(o)+j;p-=o;t=M(r)<0.5;c=w(r+c)+k;r=w(r)+k;c-=r; +b&&(o+=1,p-=1);t&&(r-=1,c+=1);a.shapeType="rect";a.shapeArgs={x:o,y:r,width:p,height:c}})},getSymbol:la,drawLegendSymbol:R.drawRectangle,drawGraph:la,drawPoints:function(){var a=this,b=this.chart,c=a.options,d=b.renderer,e=b.options.animationLimit||250,f;p(a.points,function(g){var h=g.plotY,i=g.graphic;if(h!==u&&!isNaN(h)&&g.y!==null)f=g.shapeArgs,i?(Za(i),i[b.pointCount{series.name}
',pointFormat:"x: {point.x}
y: {point.y}
",followPointer:!0},stickyTracking:!1});ca=ia(O,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],takeOrdinalPosition:!1,drawTracker:J.drawTrackerPoint, +drawGraph:function(){this.options.lineWidth&&O.prototype.drawGraph.call(this)},setTooltipPoints:la});L.scatter=ca;Y.pie=x(W,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});W={type:"pie",isCartesian:!1,pointClass:ia(Ja, +{init:function(){Ja.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:n(a.name,"Slice")});b=function(b){a.slice(b.type==="select")};F(a,"select",b);F(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===u?!b.visible:a;c.options.data[sa(b,c.data)]=b.options;e=a?"show":"hide";p(["graphic","dataLabel","connector","shadowGroup"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b, +a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;Oa(c,d.chart);n(b,!0);this.sliced=this.options.sliced=a=t(a)?a:!this.sliced;d.options.data[sa(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth", +fill:"color"},getColor:la,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)p(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){O.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();n(b,!0)&&this.chart.redraw()},generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;O.prototype.generatePoints.call(this); +c=this.points;d=c.length;for(a=0;a0?e.y/b*100:0,e.total=b},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=Aa/180*(i-90),i=(this.endAngleRad=Aa/180*((c.endAngle||i+360)-90))-j,k=this.points,l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h= +P.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*U(h)*(a[2]/2+l)};for(m=0;m0.75*i&&(h-=2*Aa);o.slicedTranslation={translateX:w(U(h)*d),translateY:w(ba(h)*d)};f=U(h)*a[2]/2;g=ba(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-Aa/2||h>Aa/2?1:0;o.angle=h;e=I(e,l/2);o.labelPos=[a[0]+f+U(h)*l,a[1]+g+ba(h)*l,a[0]+ +f+U(h)*e,a[1]+g+ba(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},setTooltipPoints:la,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);p(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected? +"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible!==void 0&&h.setVisible(h.visible)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawTracker:J.drawTrackerPoint,drawLegendSymbol:R.drawRectangle,getCenter:xb.getCenter,getSymbol:la};W=ia(O,W);L.pie=W;O.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,b=a.points,e,f,g,h;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d), +h=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",d.zIndex||6),f=d,p(b,function(b){var j,k=b.dataLabel,l,m,p=b.connector,o=!0;e=b.options&&b.options.dataLabels;j=n(e&&e.enabled,f.enabled);if(k&&!j)b.dataLabel=k.destroy();else if(j){d=x(f,e);j=d.rotation;l=b.getLabelConfig();g=d.format?Fa(d.format,l):d.formatter.call(l,d);d.style.color=n(d.color,d.style.color,a.color,"black");if(k)if(t(g))k.attr({text:g}),o=!1;else{if(b.dataLabel=k=k.destroy(),p)b.connector=p.destroy()}else if(t(g)){k= +{fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:j,padding:d.padding,zIndex:1};for(m in k)k[m]===u&&delete k[m];k=b.dataLabel=a.chart.renderer[j?"text":"label"](g,0,-999,null,null,null,d.useHTML).attr(k).css(r(d.style,c&&{cursor:c})).add(h).shadow(d.shadow)}k&&a.alignDataLabel(b,k,d,null,o)}})};O.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=n(a.plotX,-999),i=n(a.plotY,-999),j=b.getBBox();if(a=this.visible&&(a.series.forceDL|| +f.isInsidePlot(a.plotX,a.plotY,g)))d=r({x:g?f.plotWidth-i:h,y:w(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g)):(b.align(c,null,d),g=b.alignAttr,n(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):n(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));if(!a)b.attr({y:-999}),b.placed=!1};O.prototype.justifyDataLabel=function(a, +b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i==="top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)};if(L.pie)L.pie.prototype.drawDataLabels=function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=n(e.connectorPadding, +10),g=n(e.connectorWidth,1),h=d.plotWidth,d=d.plotHeight,i,j,k=n(e.softConnector,!0),l=e.distance,m=a.center,q=m[2]/2,o=m[1],r=l>0,t,u,v,x,y=[[],[]],z,A,E,K,B,D=[0,0,0,0],I=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){O.prototype.drawDataLabels.apply(a);p(b,function(a){a.dataLabel&&a.visible&&y[a.half].push(a)});for(K=0;!x&&b[K];)x=b[K]&&b[K].dataLabel&&(b[K].dataLabel.getBBox().height||21),K++;for(K=2;K--;){var b=[],J=[],F=y[K],G=F.length,C;a.sortByAngle(F,K-0.5);if(l> +0){for(B=o-q-l;B<=o+q+l;B+=x)b.push(B);u=b.length;if(G>u){c=[].concat(F);c.sort(I);for(B=G;B--;)c[B].rank=B;for(B=G;B--;)F[B].rank>=u&&F.splice(B,1);G=F.length}for(B=0;B0){if(u=J.pop(),C=u.i, +A=u.y,c>A&&b[C+1]!==null||ch-f&&(D[1]=s(w(z+u-h+f),D[1])),A-x/2<0?D[0]=s(w(-A+x/2),D[0]):A+x/2>d&&(D[2]=s(w(A+x/2-d),D[2]))}}if(za(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),r&&g&&p(this.points,function(b){i= +b.connector;v=b.labelPos;if((t=b.dataLabel)&&t._pos)E=t._attr.visibility,z=t.connX,A=t.connY,j=k?["M",z+(v[6]==="left"?5:-5),A,"C",z,A,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],"L",v[4],v[5]]:["M",z+(v[6]==="left"?5:-5),A,"L",v[2],v[3],"L",v[4],v[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},L.pie.prototype.placeDataLabels=function(){p(this.points, +function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},L.pie.prototype.alignDataLabel=la,L.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||80,f;d[0]!==null?e=s(b[2]-s(a[1],a[3]),c):(e=s(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=s(I(e,b[2]-s(a[0],a[2])),c):(e=s(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);en(this.translatedThreshold,f.plotSizeY),j=n(c.inside,!!this.options.stacking);if(h&&(d=x(h),g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=n(c.align,!g||j?"center":i?"right":"left"); +c.verticalAlign=n(c.verticalAlign,g||j?"middle":i?"top":"bottom");O.prototype.alignDataLabel.call(this,a,b,c,d,e)};r(Highcharts,{Axis:qa,Chart:fb,Color:ta,Point:Ja,Tick:Qa,Tooltip:tb,Renderer:Ya,Series:O,SVGElement:pa,SVGRenderer:ua,arrayMin:La,arrayMax:za,charts:Ia,dateFormat:ab,format:Fa,pathAnim:vb,getOptions:function(){return G},hasBidiBug:Nb,isTouchDevice:Ib,numberFormat:Da,seriesTypes:L,setOptions:function(a){G=x(!0,G,a);Bb();return G},addEvent:F,removeEvent:X,createElement:T,discardElement:Na, +css:D,each:p,extend:r,map:Ra,merge:x,pick:n,splat:ja,extendClass:ia,pInt:z,wrap:Va,svg:V,canvas:da,vml:!V&&!da,product:"Highcharts",version:"3.0.9"})})(); diff --git a/reports/metric_fu/output/highcharts_graph.js b/reports/metric_fu/output/highcharts_graph.js new file mode 100644 index 0000000..3cf911a --- /dev/null +++ b/reports/metric_fu/output/highcharts_graph.js @@ -0,0 +1,38 @@ +createGraphElement("div"); + +if(document.getElementById('graph')) { + var chart = new Highcharts.Chart({ + chart: { + animation: false, + renderTo: 'graph' + }, + legend: { + align: 'center', + verticalAlign: 'top', + y: 25 + }, + plotOptions: { + line: { + animation: false, + lineWidth: 3, + marker: { + radius: 6 + }, + pointPlacement: 'on' + } + }, + title: { + text: graph_title + }, + xAxis: { + categories: graph_labels, + tickmarkPlacement: 'on' + }, + yAxis: { + maxPadding: 0, + min: 0, + minPadding: 0 + }, + series: graph_series + }); +} diff --git a/reports/metric_fu/output/hotspots.html b/reports/metric_fu/output/hotspots.html new file mode 100644 index 0000000..62d7a8d --- /dev/null +++ b/reports/metric_fu/output/hotspots.html @@ -0,0 +1,3192 @@ + + + + + + metrics + + + + + + + + + + +
+
+

Hotspot Results

+

Meta analysis of your metrics to find hotspots in your code.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Files + Classes + Methods
+ + ./app/controllers/notes_controller.rb + + +

+ + +
+ Rcov: uncovered code is 44.0%
+ +
+ + app/controllers/notes_controller.rb : NotesController + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 4.0
+ +
+ Reek: found 10 code smells
+ +
+ Rcov: uncovered code is 44.0%
+ +
+ + app/controllers/missions_controller.rb : MissionsController#getlist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 71.4%
+ +
+ + ./app/models/mission.rb + + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Rcov: average uncovered code is 35.6%
+ +
+ + app/controllers/missions_controller.rb : MissionsController + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.4
+ +
+ Reek: found 11 code smells
+ +
+ Rcov: average uncovered code is 35.2%
+ +
+ + app/controllers/projects_controller.rb : ProjectsController#detail + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: uncovered code is 58.3%
+ +
+ + ./app/controllers/missions_controller.rb + + +

+ + +
+ Rcov: average uncovered code is 35.2%
+ +
+ + app/models/mission.rb : Mission + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: average uncovered code is 35.6%
+ +
+ + app/controllers/shares_controller.rb : SharesController#getShareList + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 5 code smells
+ +
+ Rcov: uncovered code is 46.7%
+ +
+ + ./app/models/missions_user.rb + + +

+ + +
+ Rcov: average uncovered code is 25.0%
+ +
+ + app/models/missions_user.rb : Missions_user + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ Rcov: average uncovered code is 25.0%
+ +
+ + app/controllers/notes_controller.rb : NotesController#getNotesList + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 4.0
+ +
+ Reek: found 9 code smells
+ +
+ Rcov: uncovered code is 44.0%
+ +
+ + ./app/models/note.rb + + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Rcov: average uncovered code is 20.8%
+ +
+ + app/models/note.rb : Note + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ Rcov: average uncovered code is 20.8%
+ +
+ + app/controllers/projects_controller.rb : ProjectsController#index + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ Rcov: uncovered code is 45.0%
+ +
+ + ./app/controllers/projects_controller.rb + + +

+ + +
+ Saikuro: average complexity is 1.7
+ +
+ Rcov: average uncovered code is 20.2%
+ +
+ + ./app/controllers/projects_controller.rb : ProjectsController + + +

+ + +
+ Saikuro: average complexity is 1.9
+ +
+ Reek: found 12 code smells
+ +
+ Rcov: average uncovered code is 20.2%
+ +
+ + app/controllers/missions_controller.rb : MissionsController#detail + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 3.0
+ +
+ Reek: found 3 code smells
+ +
+ Rcov: uncovered code is 40.0%
+ +
+ + ./app/models/share.rb + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: average uncovered code is 16.7%
+ +
+ + app/models/share.rb : Share + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ Rcov: average uncovered code is 16.7%
+ +
+ + app/models/mission.rb : Mission#project_exists + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 40.0%
+ +
+ + ./app/controllers/shares_controller.rb + + +

+ + +
+ Saikuro: complexity is 1.0
+ +
+ Rcov: average uncovered code is 15.6%
+ +
+ + app/controllers/shares_controller.rb : SharesController + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 8 code smells
+ +
+ Rcov: average uncovered code is 15.6%
+ +
+ + ./app/models/note.rb : Note#note_category_should_among_valid_values + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 33.3%
+ +
+ + ./app/models/comment.rb + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: average uncovered code is 12.5%
+ +
+ + app/models/comment.rb : Comment + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: average uncovered code is 12.5%
+ +
+ + ./app/models/mission.rb : Mission#status_is_among_valid_values + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 33.3%
+ +
+ + app/controllers/notes_controller.rb + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 4.0
+ +
+ Roodi: found 2 design problems
+ +
+ Reek: found 10 code smells
+ +
+ + app/models/projects_user.rb : Projects_user + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ + ./app/models/mission.rb : Mission#priority_is_among_valid_values + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 33.3%
+ +
+ + app/controllers/projects_controller.rb + + + « + annotate + » + +

+ + +
+ Flay: found 1 code duplications
+ +
+ Churn: detected high level of churn (changed 16 times)
+ +
+ Saikuro: average complexity is 2.0
+ +
+ Roodi: found 3 design problems
+ +
+ Reek: found 12 code smells
+ +
+ + ./app/controllers/users_controller.rb : UsersController + + +

+ + +
+ Saikuro: average complexity is 1.7
+ +
+ Reek: found 5 code smells
+ +
+ Rcov: average uncovered code is 0.0%
+ +
+ + app/controllers/missions_controller.rb : MissionsController#create + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 3.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: uncovered code is 27.3%
+ +
+ + app/controllers/missions_controller.rb + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.4
+ +
+ Roodi: found 4 design problems
+ +
+ Reek: found 11 code smells
+ +
+ + app/controllers/application_controller.rb : ApplicationController + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: average uncovered code is 0.0%
+ +
+ + app/controllers/missions_controller.rb : MissionsController#update + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/models/missions_user.rb + + + « + annotate + » + +

+ + +
+ Flay: found 1 code duplications
+ +
+ Saikuro: average complexity is 2.0
+ +
+ Roodi: found 1 design problems
+ +
+ Reek: found 3 code smells
+ +
+ + ./app/models/project.rb : Project + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 0.0%
+ +
+ + app/models/comment.rb : Comment#user_id_exist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/models/note.rb + + + « + annotate + » + +

+ + +
+ Flay: found 2 code duplications
+ +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ + ./app/controllers/sessions_controller.rb : SessionsController + + +

+ + +
+ Saikuro: average complexity is 1.3
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: average uncovered code is 0.0%
+ +
+ + app/models/missions_user.rb : Missions_user#mission_exist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/controllers/shares_controller.rb + + + « + annotate + » + +

+ + +
+ Saikuro: average complexity is 2.5
+ +
+ Roodi: found 1 design problems
+ +
+ Reek: found 8 code smells
+ +
+ + app/models/user.rb : User + + + « + annotate + » + +

+ + +
+ Reek: found 1 code smells
+ +
+ + app/models/missions_user.rb : Missions_user#user_exist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/models/mission.rb + + + « + annotate + » + +

+ + +
+ Flay: found 2 code duplications
+ +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 2 code smells
+ +
  + + app/models/note.rb : Note#project_exist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/models/projects_user.rb + + + « + annotate + » + +

+ + +
+ Flay: found 1 code duplications
+ +
+ Saikuro: average complexity is 2.0
+ +
+ Roodi: found 1 design problems
+ +
+ Reek: found 3 code smells
+ +
  + + app/models/note.rb : Note#user_exist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/controllers/users_controller.rb + + + « + annotate + » + +

+ + +
+ Flay: found 1 code duplications
+ +
+ Saikuro: average complexity is 1.7
+ +
+ Roodi: found 3 design problems
+ +
+ Reek: found 5 code smells
+ +
  + + app/models/share.rb : Share#project_exists + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/models/comment.rb + + + « + annotate + » + +

+ + +
+ Flay: found 1 code duplications
+ +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
  + + app/models/share.rb : Share#user_exists + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 25.0%
+ +
+ + app/models/share.rb + + + « + annotate + » + +

+ + +
+ Flay: found 1 code duplications
+ +
+ Saikuro: average complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
  + + app/controllers/projects_controller.rb : ProjectsController#deleteUsers + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ Rcov: uncovered code is 23.8%
+ +
+ + app/controllers/application_controller.rb + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 2 code smells
+ +
  + + app/controllers/projects_controller.rb : ProjectsController#addUsers + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 3 code smells
+ +
+ Rcov: uncovered code is 14.3%
+ +
+ + ./app/controllers/application_controller.rb + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: average uncovered code is 0.0%
+ +
  + + app/controllers/missions_controller.rb : MissionsController#commentPublish + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: uncovered code is 12.5%
+ +
+ + ./app/models/project.rb + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
  + + app/controllers/shares_controller.rb : SharesController#create + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 3.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: uncovered code is 0.0%
+ +
+ + ./app/controllers/users_controller.rb + + +

+ + +
+ Saikuro: average complexity is 1.7
+ +
+ Rcov: average uncovered code is 0.0%
+ +
  + + app/controllers/application_controller.rb : ApplicationController#current_user + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 0.0%
+ +
+ + ./app/controllers/sessions_controller.rb + + +

+ + +
+ Saikuro: average complexity is 1.3
+ +
+ Rcov: average uncovered code is 0.0%
+ +
  + + app/models/projects_user.rb : Projects_user#project_exists + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ + db/schema.rb + + +

+ + +
+ Churn: detected high level of churn (changed 12 times)
+ +
  + + app/models/projects_user.rb : Projects_user#user_exists + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ + app/models/project.rb + + + « + annotate + » + +

+ + +
+ Reek: found 1 code smells
+ +
  + + app/controllers/users_controller.rb : UsersController#emailExist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 0.0%
+ +
+ + app/controllers/sessions_controller.rb + + + « + annotate + » + +

+ + +
+ Reek: found 1 code smells
+ +
  + + ./app/controllers/projects_controller.rb : ProjectsController#update + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
+ + app/models/user.rb + + + « + annotate + » + +

+ + +
+ Reek: found 1 code smells
+ +
  + + ./app/controllers/projects_controller.rb : ProjectsController#create + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/users_controller.rb : UsersController#update + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/users_controller.rb : UsersController#create + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + app/controllers/users_controller.rb : UsersController#usernameExist + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Reek: found 1 code smells
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/models/note.rb : Note#note_has_atleast_one_character + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/models/share.rb : Share#share_has_atleast_one_character + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/sessions_controller.rb : SessionsController#create + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/application_controller.rb : ApplicationController#authenticate + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/models/comment.rb : Comment#comment_has_atleast_one_character + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/models/project.rb : Project#require_at_least_on_user + + +

+ + +
+ Saikuro: complexity is 2.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + app/controllers/users_controller.rb : UsersController#checkExist? + + + « + annotate + » + +

+ + +
+ Saikuro: complexity is 1.0
+ +
+ Reek: found 2 code smells
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/projects_controller.rb : ProjectsController#project_params + + +

+ + +
+ Saikuro: complexity is 1.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/users_controller.rb : UsersController#user_params + + +

+ + +
+ Saikuro: complexity is 1.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/shares_controller.rb : SharesController#share_params + + +

+ + +
+ Saikuro: complexity is 1.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/sessions_controller.rb : SessionsController#show + + +

+ + +
+ Saikuro: complexity is 1.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
    + + ./app/controllers/sessions_controller.rb : SessionsController#destroy + + +

+ + +
+ Saikuro: complexity is 1.0
+ +
+ Rcov: uncovered code is 0.0%
+ +
+ + +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/index.html b/reports/metric_fu/output/index.html new file mode 100644 index 0000000..f10b5f8 --- /dev/null +++ b/reports/metric_fu/output/index.html @@ -0,0 +1,589 @@ + + + + + + metrics + + + + + + + + + + + +
+

MetricFu Results

+ + +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/js-class.js b/reports/metric_fu/output/js-class.js new file mode 100644 index 0000000..923fa96 --- /dev/null +++ b/reports/metric_fu/output/js-class.js @@ -0,0 +1 @@ +JS={extend:function(a,b){b=b||{};for(var c in b){if(a[c]===b[c])continue;a[c]=b[c]}return a},makeFunction:function(){return function(){return this.initialize?(this.initialize.apply(this,arguments)||this):this}},makeBridge:function(a){var b=function(){};b.prototype=a.prototype;return new b},bind:function(){var a=JS.array(arguments),b=a.shift(),c=a.shift()||null;return function(){return b.apply(c,a.concat(JS.array(arguments)))}},callsSuper:function(a){return a.SUPER===undefined?a.SUPER=/\bcallSuper\b/.test(a.toString()):a.SUPER},mask:function(a){var b=a.toString().replace(/callSuper/g,'super');a.toString=function(){return b};return a},array:function(a){if(!a)return[];if(a.toArray)return a.toArray();var b=a.length,c=[];while(b--)c[b]=a[b];return c},indexOf:function(a,b){for(var c=0,d=a.length;c':''),d=this.__meta__=new JS.Module(c?c+'.':'',{},{_1:this});d.include(this.klass.__mod__,false);return d},equals:function(a){return this===a},extend:function(a,b){return this.__eigen__().include(a,b,{_2:this})},hash:function(){return this.__hashcode__=this.__hashcode__||JS.Kernel.getHashCode()},isA:function(a){return this.__eigen__().includes(a)},method:function(a){var b=this,c=b.__mcache__=b.__mcache__||{};if((c[a]||{}).fn===b[a])return c[a].bd;return(c[a]={fn:b[a],bd:JS.bind(b[a],b)}).bd},methods:function(){return this.__eigen__().instanceMethods(true)},tap:function(a,b){a.call(b||null,this);return this}}),{__hashIndex__:0,getHashCode:function(){this.__hashIndex__+=1;return(Math.floor(new Date().getTime()/1000)+this.__hashIndex__).toString(16)}});JS.Module.include(JS.Kernel);JS.extend(JS.Module,JS.Kernel.__fns__);JS.Class.include(JS.Kernel);JS.extend(JS.Class,JS.Kernel.__fns__);JS.Interface=new JS.Class({initialize:function(d){this.test=function(a,b){var c=d.length;while(c--){if(!JS.isFn(a[d[c]]))return b?d[c]:false}return true}},extend:{ensure:function(){var a=JS.array(arguments),b=a.shift(),c,d;while(c=a.shift()){d=c.test(b,true);if(d!==true)throw new Error('object does not implement '+d+'()');}}}});JS.Singleton=new JS.Class({initialize:function(a,b,c){return new(new JS.Class(a,b,c))}}); \ No newline at end of file diff --git a/reports/metric_fu/output/rails_best_practices.html b/reports/metric_fu/output/rails_best_practices.html new file mode 100644 index 0000000..f566186 --- /dev/null +++ b/reports/metric_fu/output/rails_best_practices.html @@ -0,0 +1,723 @@ + + + + + + metrics + + + + + + + + + + + +
+

Rails Best Practices Results

+ +

rails_best_practices is a code metric tool for rails projects.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File PathWarning
/home/ccx/RubymineProjects/ambition/db/schema.rb:16always add db index (comments => [user_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:26always add db index (missions => [project_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:37always add db index (missions_users => [mission_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:37always add db index (missions_users => [user_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:42always add db index (notes => [project_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:60always add db index (projects_users => [project_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:60always add db index (projects_users => [user_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:65always add db index (shares => [project_id])
/home/ccx/RubymineProjects/ambition/db/schema.rb:65always add db index (shares => [user_id])
/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb:48move model logic into model (mission use_count > 4)
/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb:87move model logic into model (mission use_count > 4)
/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb:113move model logic into model (mission use_count > 4)
/home/ccx/RubymineProjects/ambition/app/helpers/users_helper.rb:1remove empty helpers
/home/ccx/RubymineProjects/ambition/app/helpers/sessions_helper.rb:1remove empty helpers
/home/ccx/RubymineProjects/ambition/app/controllers/shares_controller.rb:10use model association (for share)
/home/ccx/RubymineProjects/ambition/Gemfile:37remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/models/note.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/models/project.rb:5remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/models/missions_user.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/models/projects_user.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/models/share.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/models/comment.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/models/mission.rb:4remove trailing whitespace
/home/ccx/RubymineProjects/ambition/db/migrate/20161229084919_change_note_field_type_to_category.rb:3remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/controllers/notes_controller.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/controllers/shares_controller.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/controllers/sessions_controller.rb:7remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/app/controllers/projects_controller.rb:2remove trailing whitespace
/home/ccx/RubymineProjects/ambition/config/routes.rb:65remove trailing whitespace
/home/ccx/RubymineProjects/ambition/config/application.rb:25remove trailing whitespace
+ +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/rails_best_practices.js b/reports/metric_fu/output/rails_best_practices.js new file mode 100644 index 0000000..09daa93 --- /dev/null +++ b/reports/metric_fu/output/rails_best_practices.js @@ -0,0 +1,3 @@ + var graph_title = 'Rails Best Practices: design problems'; + var graph_series = [{name: 'rails_best_practices', data: [31]}]; + var graph_labels = {"0":"1/3"}; diff --git a/reports/metric_fu/output/rcov.html b/reports/metric_fu/output/rcov.html new file mode 100644 index 0000000..b7fceb6 --- /dev/null +++ b/reports/metric_fu/output/rcov.html @@ -0,0 +1,8533 @@ + + + + + + metrics + + + + + + + + + + + +
+ +

Rcov Code Coverage Results

+ +

C0 code coverage information.

+ +
+ + +

Total Coverage: 87.1%

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File PathPercent run
./app/controllers/projects_controller.rb21
./app/controllers/shares_controller.rb37
./app/controllers/missions_controller.rb59
./spec/controllers/shares_controller_spec.rb85
./spec/controllers/projects_controller_spec.rb86
./app/models/project.rb88
./app/controllers/application_controller.rb100
./app/controllers/notes_controller.rb100
./app/controllers/sessions_controller.rb100
./app/controllers/users_controller.rb100
./app/models/comment.rb100
./app/models/mission.rb100
./app/models/missions_user.rb100
./app/models/note.rb100
./app/models/share.rb100
./app/models/user.rb100
./spec/controllers/notes_controller_spec.rb100
./spec/controllers/sessions_controller_spec.rb100
./spec/controllers/users_controller_spec.rb100
./spec/models/comment_spec.rb100
./spec/models/mission_spec.rb100
./spec/models/missions_user_spec.rb100
./spec/models/note_spec.rb100
./spec/models/project_spec.rb100
./spec/models/share_spec.rb100
./spec/models/user_spec.rb100
+ + +

./app/controllers/projects_controller.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
class ProjectsController < ApplicationController
    
    before_action :authenticate
    skip_before_action :verify_authenticity_token, :only => [
        :index,
        :create,
        :addUsers,
        :detail,
        :update,
        :deleteUsers
    ]
    
    #=============================================>获取我的项目列表,user_id保存在session中.
    def index
    #Todo
    uid = session[:user_id]
    data=[]
    Projects_user.where(:user_id => uid).each do |i|
        pid=i.project_id
        p=Project.find_by(id:pid)
        mc = Mission.where(:project_id => pid).size
        uc = Projects_user.where(:project_id => pid).size
        sc = Share.where(:project_id => pid).size
        data+=[{
            :id => pid,
            :name => p.name,
            :content => p.content,
            :mission_count => mc,
            :users_count => uc,
            :shares_count => sc
        }]
    end
    render :json => {
        :code => 0,
        :data => data
    }
    end
    
    #=============================================>创建项目
    
    def create
        uid = session[:user_id]
        project = Project.new(project_params)
        if project.save
            Projects_user.create(project_id:project.id,user_id:uid)
            render status: :created, nothing: true
        else
            render json: project.errors, status: :unprocessable_entity
        end
     end
    
    
    #=============================================>项目添加用户
    
    def addUsers
        uid = User.find_by(email:params[:email]).id# 需要添加的用户
        register = session[:user_id]# 当前用户
        pid = params[:project_id]
        # 检查该项目中是否已经有要添加的用户
        pu_exist=Projects_user.find_by(project_id:pid,user_id:uid)
        if pu_exist.nil?# 不存在
            params_pu = {project_id: pid,user_id: uid}
            pu = Projects_user.new(params_pu)
            pu.save
            
            content = ""+User.find_by(id: register).name + " 邀请您进入项目 " + Project.find_by(id: pid).name+""
            puts content
            params_note = {user_id: uid,content: content,category: 2,project_id: pid}
            note = Note.new(params_note)
            note.save!
            render :json => {:code => 0}
        else# 存在
            render json:current_user.errors, status: :unprocessable_entity
        end
    end
    
    #=============================================>项目删除用户
    def deleteUsers
        uid = params[:user_id]# 需要添加的用户
        register = session[:user_id]# 当前用户
        pid = params[:project_id]
        # 检查该项目中是否已经有要添加的用户
        projects_user=Projects_user.find_by(project_id:pid,user_id:uid)
        if projects_user.nil?# 不存在
            render json:current_user.errors, status: :unprocessable_entity
        end
        # 存在
        puts projects_user.user_id
        puts projects_user.project_id
        Projects_user.where(project_id:pid,user_id:uid).delete_all
            
        content =""+ User.find_by(id: register).name + " 把您从项目 " + Project.find_by(id: pid).name+" 中删除"
        puts content
        params_note = {user_id: uid,content: content,category: 2,project_id: pid}
        note = Note.new(params_note)
        note.save!
            
        render :json => {:code => 0}
    end
    
    #=============================================>项目详情
    
    def detail
        #Todo    
        pid = params[:id]
        project = Project.find_by(id: pid)
        #uid = Projects_user.where(:project_id => pid)
        users = []
        projects_users = Projects_user.where("project_id = ?",pid).all
        
        projects_users.each do |projects_user|
            uid = projects_user.user_id
            i = User.find_by(id: uid)
            users += [{
                :name => i.name,
                :id => i.id
            }]
        end
        #puts users.inspect 
        # Users.find(uid).each do |i|
        #     users += [{
        #         :nickname => i.name,
        #         :id => i.id
        #     }]
        # end
        render :json => {
            :code => 0,
            :data => {
                :name => project.name,
                :content => project.content,
                :users => users
            }
        }
    end
    
    #=============================================>项目修改
    def update
        project = Project.find_by(:id => params[:project][:id])
        if project.update(project_params)
            render :json => {:code => 0}
        else
          render json:current_user.errors, status: :unprocessable_entity
        end
    end
    
    private
        def project_params
          params.require(:project).permit(:name,:content,:id)
        end
end
+
+ +

./app/controllers/shares_controller.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
class SharesController < ApplicationController
   
    before_action :authenticate
    skip_before_action :verify_authenticity_token, :only => [
        :create,
        :getShareList
    ]
    #当前用户创建分享
   
    def create
        uid = session[:user_id].to_i
        share=Share.new(share_params)
        share.user_id=uid
        if share.save
            content = ""+User.find(uid).name + " 分享了一些事"
            pid=share.project_id
            
            Projects_user.where(:project_id => pid).each do |i|
                params_note = {user_id: i.user_id,content: content,category: 1,project_id: pid}
                note = Note.new(params_note)
                note.save!
            end
            render status: :created, nothing: true
        else
            render json: project.errors, status: :unprocessable_entity
        end
    end
    
    #获取项目的分享列表
    
    def getShareList
    #Todo
    pid = params[:project_id]
    
    data = []
    Share.where(:project_id => pid).order("created_at desc").each do |i|
        puts i.content
        name = User.find(i.user_id).name
        data += [{
            :name => name,
            :time => i.created_at,
            :content => i.content
        }]
    end
    render :json => {
        :code => 0,
        :data => data
    }
    end
    private
        def share_params
          params.require(:share).permit(:project_id,:content)
        end
end
+
+ +

./app/controllers/missions_controller.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
class MissionsController < ApplicationController
    
    before_action :authenticate
    skip_before_action :verify_authenticity_token, :only => [
        :create,
        :getlist,
        :detail,
        :update,
        :commentPublish
    ]
    #======================================>获取当前项目某状态的任务列表
    
    def getlist
    #Todo
    pid = params[:project_id]
    stu = params[:status_type]
    #missions = []
    details = []
    missions = Mission.where("project_id = ? AND status = ?",pid,stu).all
    
    missions.each do |mission|
        
        #puts mission.inspect
        
        details += [{
            :id => mission.id,
            :name => mission.name,
            :content => mission.content
        }]
        
    end
    
    # Mission.where(:project_id => pid).where(:status => stu) do |i|
    #     missions += [{
    #         :id => i.id,
    #         :name => i.name,
    #         :content => i.content
    #     }]
    # end
    render :json => {
        :code => 0,
        :data => missions
    }
    end
    
    #======================================>获取任务详细信息
    
    def detail
    #Todo
    username = []
    comments_s = []
    mission_id = params[:id]
    mission = Mission.find_by(id: mission_id)
    m_us = Missions_user.where("mission_id = ?",mission_id).all
    #puts m_us.inspect
    m_us.each do |m_u|
        user_id = m_u.user_id
        user = User.find_by(id: user_id)
        #puts user.inspect
        username << user.name
    end
    comments = Comment.where("mission_id = ?",mission_id).all
    comments.each do |c|
        uname = User.find_by(id: c.user_id).name
        comments_s += [{
            :nickname => uname,
            :content => c.content,
            :time => c.created_at
        }]
    end
    #puts comments_s.inspect
    render :json => {
        :code => 0,
        :data => {
            :name => mission.name,
            :content => mission.content,
            :priority => mission.priority,
            :status => mission.status,
            :deadline => mission.deadline,
            :users => username,
            :comments => comments_s
        }
    }
    end
     #======================================>创建任务
    
    def create
    #Todo
    params_mission = {name: params[:name],project_id: params[:project_id],content: params[:content],deadline: params[:deadline],priority: params[:priority],status: params[:status]}
    mission = Mission.new(params_mission)
    if mission.save
        render :json => {:code => 0}
    else
        render json: mission.errors, status: :unprocessable_entity
    end
    userids = params[:users]
    userids.each do |id|
        user_enties = User.find_by(id: id)
        #puts user_enties.inspect
        params_mu = {mission_id: mission.id,user_id: user_enties.id}
        missions_user = Missions_user.new(params_mu)
        missions_user.save
        content = "有新任务 "+mission.name+""
        
        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
        note = Note.new(params_note)
        note.save
    end
    end
    
    #======================================>修改任务信息
    
    def update
    #Todo
    
    id = params[:id]
    #now = Datetime.now
    mission = Mission.find_by(id: id)
    params_mission = {name: params[:name],content: params[:content],deadline: params[:deadline],priority: params[:priority]}
    #puts params_mission
    mission.update(params_mission)
    mission.save
    Missions_user.delete_all(["mission_id = ?",id])
    userids = params[:users]
    userids.each do |name|
        user_enties = User.find_by(id: id)
        params = {mission_id: id,user_id: user_enties.id}
        missions_user = Missions_user.new(params)
        missions_user.save
        content = ""+mission.name + " 任务信息发生了变化"
        
        params_note = {content: content,user_id: user_enties.id,category: 3,project_id: mission.project_id}
        note = Note.new(params_note)
        note.save
    end
    render :json => {:code => 0}
    end
    
    #======================================>当前用户发表评论
    
    def commentPublish
    #Todo
    mission_id = params[:mission_id]
    content = params[:content]
    user_id = session[:user_id]
    params = {content: content, mission_id: mission_id, user_id: user_id}
    comment = Comment.new(params)
    if comment.save
        render :json => {:code => 0}
    else
        render json: mission.errors, status: :unprocessable_entity
    end
    end
end
+
+ +

./spec/controllers/shares_controller_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe SharesController,type: :controller do
    
    describe "POST #create" do
        
        it "create a correct share" do
            
            register = create(:user)
            user = User.find_by(email: register.email)
            session[:user_id] = user.id 
            
            params = {name: "project addUsers test",content: "addUsers test"}
            project = Project.new(params)
            project.users << register
            project.save
            
            post :create,project_id: project.id,content: "苟利国家生死以,岂因福祸避趋之"
            
            
        end
        
    end
    
    describe "GET #getShareList" do
        
        it "return correct share list" do
            
            
            register = create(:user)
            user = User.find_by(email: register.email)
            session[:user_id] = user.id 
            
            params = {name: "project  test",content: " test"}
            project = Project.new(params)
            project.users << register
            project.save
            
            post :create,project_id: project.id,content: "苟利国家生死以,岂因福祸避趋之"
            
            post :create,project_id: project.id,content: "too young too simple"
            
            post :create,project_id: project.id,content: "too young too naive"
            
            
            get :getShareList,project_id: project.id
            
            puts response.body
            
        end
        
    end
    
    
    
end
+
+ +

./spec/controllers/projects_controller_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe ProjectsController, type: :controller do
    
 
    
    describe "GET #index " do
    
        it "return valid projects json" do
            
            register = create(:user)
            user = User.find_by(email: register.email)
            session[:user_id] = user.id 
        
            post :create,content: "project content 1",name: "project1"
            post :create,content: "project content 2", name: "project2"
                
            get :index
            
            puts response.body
        end
    
    end
    
    describe "POST #create" do
       
      it "can create a valid project" do
        
          register = create(:user)
          user = User.find_by(email: register.email)
          #puts user.inspect
          session[:user_id] = user.id 
          post :create,content: "project content 1",name: "project1"
          #puts response.body
      end
    end
    
    describe "POST #addUsers" do
        
        it "can addUsers correctly" do
            
            register = create(:user)
            user = User.find_by(email: register.email)
            session[:user_id] = user.id 
            
            #user1 = create(:user)
            user2 = create(:user)
            params = {name: "project addUsers test",content: "addUsers test"}
            project = Project.new(params)
            project.users << register
            project.save
            #post :create,content: "project content 3",name: "project3"
            
            post :addUsers,user_id: user2.id,project_id: project.id
            
            
        end
        
    end
    
     describe "GET #detail" do
        
        it "can return correct json format of project " do
            
            register = create(:user)
            user = User.find_by(email: register.email)
            session[:user_id] = user.id 
            
            user1 = create(:user)
            user2 = create(:user)
            params = {name: "project addUsers test",content: "addUsers test"}
            project = Project.new(params)
            project.users << register
            project.save
            post :addUsers,user_id: user2.id,project_id: project.id
            post :addUsers,user_id: user1.id,project_id: project.id
            post :detail,id: project.id
            puts response.body
        end
        
    end
    
end
+
+ +

./app/models/project.rb

+ + +

./app/controllers/application_controller.rb

+ + +

./app/controllers/notes_controller.rb

+ + +

./app/controllers/sessions_controller.rb

+ + +

./app/controllers/users_controller.rb

+ + +

./app/models/comment.rb

+ + +

./app/models/mission.rb

+ + +

./app/models/missions_user.rb

+ + +

./app/models/note.rb

+ + +

./app/models/share.rb

+ + +

./app/models/user.rb

+ + +

./spec/controllers/notes_controller_spec.rb

+ + +

./spec/controllers/sessions_controller_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe SessionsController, type: :controller do
  before :each do
    @user1 = create(:user)
  end
  describe 'POST #create' do
    # 合法流程校验
    context 'with legal account' do
      before :each do
        post :create, email: @user1.email, password: @user1.password
      end
      it 'should get correct email and password' do
        actual_email = @user1.email
        actual_password = @user1.password
        expect(controller.params[:email]).to eq(actual_email)
        expect(controller.params[:password]).to eq(actual_password)
      end
      it 'should authenticate success' do
        expect(controller.session[:user_id]).to eq @user1.id
      end
      it 'should get ok and text: ok' do
        expect(response).to have_http_status :ok
        expect(response.body).to eq 'ok'
      end
    end
    # 非法参数测试
    context 'with illegal account' do
      before :each do
        post :create, email: @user1.email, password: 'wrong_password'
      end
      it 'does not authenticate success' do
        expect(controller.session[:user_id].nil?).to be true
      end
      it 'return with 401' do
        expect(response).to have_http_status :unauthorized
        expect(response.body).to eq 'account or password is not correct'
      end
      it 'should not raise error without param email or password' do
        expect {
          post :create, email: @user1.email
        }.not_to raise_error
        expect {
          post :create, password: 'wrong_password'
        }.not_to raise_error
      end
    end
  end
  describe 'DELETE #destroy' do
    it 'should destroy user id in session' do
      post :create, email:@user1.email, password: @user1.password
      expect(controller.session[:user_id].nil?).to be false
      delete :destroy
      expect(controller.session[:user_id].nil?).to be true
    end
    it 'should return 401 without login' do
      delete :destroy
      expect(response).to have_http_status :unauthorized
    end
  end
  describe 'GET #show' do
    context 'after login' do
      before :each do
        post :create, email:@user1.email, password: @user1.password
        get :show, format: 'json'
      end
      it 'should render show template' do
        expect(response).to render_template 'show'
      end
      it 'should return user in json' do
        userInfo = assigns[:current_user]
        expect(userInfo.id).to eq @user1.id
      end
    end
    it 'should renturn 401 without login' do
      get :show, format: 'json'
      expect(response).to have_http_status :unauthorized
    end
  end
end
+
+ +

./spec/controllers/users_controller_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe UsersController, type: :controller do
  let(:user) { build(:user_with_sequence_number) }
  let(:user_with_fixed_info){ create(:user)}
  let(:valid_attributes){ attributes_for(:user) }
  let(:invalid_attributes){ attributes_for(:user, email: nil, name: 'username2000') }
  describe 'GET #emailExist' do
    it 'valid email' do
      get :emailExist, email: user.email
      expect(response.body).to eq '0'
    end
    it 'duplicated email' do
      user = create(:user_with_sequence_number)
      get :emailExist, email: user.email
      expect(response.body).to eq '1'
    end
    it 'should not throw exception with no email param' do
      get :emailExist  # 不会失败,则证明没有异常
      get :emailExist, other_param: 'test'
    end
  end
  describe 'GET #usernameExist' do
    it 'valid username' do
      get :usernameExist, username: user.name
      expect(response.body).to eq 'not exist'
    end
    it 'duplicated username' do
      user = create(:user_with_sequence_number)
      get :usernameExist, username: user.name
      expect(response.body).to eq 'exist'
    end
    it 'should not throw exception with no username param' do
      get :usernameExist
      get :usernameExist, other_param: 'test'
    end
  end
  describe 'POST #create' do
    context 'success with valid attributes' do
      before :each do
        post :create, user: valid_attributes
      end
      it 'should create user' do
        expect(User.exists?(assigns[:user].id)).to be true
      end
      it 'should response with 201' do
        expect(response).to have_http_status :created
      end
    end
    context 'fail with invalid attributes' do
      # 已经在model测试中充分验证校对条件,所以这里只对使用电子邮箱为空的非法条件
      before :each do
        post :create, user: invalid_attributes
      end
      it 'does not save the new user' do
        expect(User.exists? name: 'username2000').to be false
      end
      it 'should return errors' do
        error_message = JSON.parse response.body
        expect(error_message['email'].nil?).to be false
        expect(error_message['email']).not_to be_empty
      end
    end
    context 'deal with params more or less than required' do
      let(:data_to_send) { { :name => 'username', :email => '1261138729@qq.com',
                             :password => 'secret', :password_confirmation => 'secret',
                             :more_field => 'test'} }
      it 'should throw exception without param[:user]' do
        expect {
          post :create
        }.to raise_error ActionController::ParameterMissing
      end
      it 'should not throw exception' do
        expect {
           post :create, user: data_to_send, other_param: 'test'
        }.to_not raise_error
      end
      it 'should not accept other params' do
        post :create, user: data_to_send
        user = assigns(:user)
        expect(user.has_attribute? :more_field).to eq false
      end
    end
  end
  describe 'PATCH #update' do
    context 'with valid attributes' do
      before :each do
        # 假设已经登录了
        allow(controller).to receive(:authenticate){ true }
        allow(controller).to receive(:current_user).and_return(User.find user_with_fixed_info.id)
        patch :update, user: valid_attributes, format: 'json'
      end
      it 'should located current user' do
        expect(assigns[:user]).to eq user_with_fixed_info
      end
      it 'should render show' do
        expect(response).to render_template 'show'
      end
    end
    context 'with invalid attributes' do
      before :each do
        # 假设已经登录了
        allow(controller).to receive(:authenticate){ true }
        allow(controller).to receive(:current_user).and_return(User.find user_with_fixed_info.id)
        patch :update, user: invalid_attributes, format: 'json'
      end
      it 'does not change current user' do
        expect(assigns[:user]).to eq user_with_fixed_info
      end
      it 'should return error messages and error status' do
        error_message = JSON.parse response.body
        expect(error_message['email'].nil?).to be false
        expect(error_message['email']).not_to be_empty
      end
    end
    it 'should login first' do
      patch :update, user:valid_attributes, format: 'json'
      expect(response).to have_http_status :unauthorized
    end
  end
end
+
+ +

./spec/models/comment_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe Comment , type: :model do
    
    it 'has a valid comment' do
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        params = {content:"good job",mission_id:123,user_id: user.id}
        expect(Comment.new(params)).to be_valid
    end
    
    it "content should not be empty" do
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        params = {content: nil,mission_id: 123,user_id: user.id}
        expect(Comment.new(params)).to_not be_valid
    end
    
    it "mission_id should not be empty" do
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        params = {content:"good job", mission_id: nil,user_id: user.id}
        expect(Comment.new(params)).to_not be_valid
    end
    
    it "content should has at least one word " do
        comment_with_allspace = build(:comment_content_allspace)
        comment_with_allspace.validate
        expect(comment_with_allspace.errors[:content].size).to eq(1)
    end
    
    it "user should be exist" do
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        expect(user).to be_valid
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: 1,status: 2,content: "mission content",project_id: project.id}
        mission = Mission.new(params)
        mission.save
        expect(mission).to be_valid
        expect(mission.errors[:project_id].size).to eq(0)
        params = {content: "comment", mission_id: mission.id, user_id: user.id}
        comment = Comment.new(params)
        expect(comment).to be_valid
        
    end
    
end
+
+ +

./spec/models/mission_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe Mission , type: :model do
  
    it 'has a valid mission' do
      params = {name: "mission1",content: "mission content",deadline:"2016-10-17 10:00:00",priority:1,status:"进行中"}
      
      mission = Mission.new(params)
      mission.validate
      expect(mission).to be_valid    
    end
    
    it 'content should not be nil' do
      expect(build(:no_content_mission)).to_not be_valid
    end
    
    it 'deadline should not be nil' do
      expect(build(:no_deadline_mission)).to_not be_valid
    end
    
    it 'status should not be nil' do
      expect(build(:no_status_mission)).to_not be_valid
    end
    
    it 'priority should not be nil' do
      expect(build(:no_priority_mission)).to_not be_valid
    end
    
    it 'priority is not among valid values' do
      mission = build(:priority_not_among_valid_values)
      mission.validate
      expect(mission.errors[:priority].size).to eq(1)
    end
    
    it 'status is not among valid values' do
      mission = build(:status_not_among_valid_values)
      mission.validate
      expect(mission.errors[:status].size).to eq(1)
    end
    
end
# require 'rails_helper'
# RSpec.describe Mission, type: :model do
#   it 'has a valid mission' do
#     expect(build(:project)).to be_valid
#   end
#   describe 'users test' do
#     it 'has at least on user' do
#       mission_with_no_user = build(:mission)
#       mission_with_no_user.users = []
#       mission_with_no_user.valid?
#       expect(mission_with_no_user.errors[:users].size).to eq(1)
#     end
#   end
#   describe  'name test' do
#     it 'does not allow absence of name' do
#       expect(build(:mission, name: nil)).to_not be_valid
#     end
#     it 'length of name in [1,20]' do
#       expect(build(:mission_name_length_gt_20)).to_not be_valid
#     end
#   end
# end
+
+ +

./spec/models/missions_user_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe Missions_user , type: :model do
    
    it "mission should exist" do
        
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        expect(user).to be_valid
    
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: 1,status: 2,content: "mission content",project_id: project.id}
        mission = Mission.new(params)
        mission.save
        expect(mission).to be_valid
        
        params = {mission_id: 5,user_id: user.id}
        missions_user = Missions_user.new(params)
        missions_user.save
        expect(missions_user).to_not be_valid
        expect(missions_user.errors[:mission].size).to eq(1)
        expect(Missions_user.find_by(user_id: user.id)).to eq(nil)
        
        
    end
    
    it  "user should exist" do
        
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        expect(user).to be_valid
    
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: 1,status: 2,content: "mission content",project_id: project.id}
        mission = Mission.new(params)
        mission.save
        expect(mission).to be_valid
        
        params = {mission_id: mission.id,user_id: 2}
        missions_user = Missions_user.new(params)
        missions_user.save
        #puts missions_user.inspect
        expect(missions_user).to_not be_valid
        expect(missions_user.errors[:user].size).to eq(1)
        expect(Missions_user.find_by(mission_id: mission.id)).to eq(nil)
        
    
    end
    
    
end
+
+ +

./spec/models/note_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe Note , type: :model do
    
    it "has a valid note" do
    
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        
        params = {content: "note content",user_id: user.id,project_id: project.id,category: 1}
        note = Note.new(params)
        note.save
        expect(note).to be_valid
        
    end
    
    it "notes content should at least has one character" do
        
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        
        params = {content: "  ",user_id: user.id,category: 1}
        note = Note.new(params)
        note.save
        expect(note.errors[:content].size).to eq(2)
        
    end
    
    it "category should be among valid values" do
        
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        params = {content: "  ",user_id: user.id,category: 4}
        note = Note.new(params)
        note.save
        expect(note.errors[:category].size).to eq(1)
        expect(note).to_not be_valid
        
    end
    
     it "notes user should be exist" do
    
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        
        params = {content: "note content",user_id: user.id,project_id: 5,category: 1}
        note = Note.new(params)
        note.save
        expect(note).to_not be_valid
        expect(note.errors[:project].size).to eq(1)
        expect(Note.find_by(project_id: 5)).to eq(nil)
    end
    
    it "notes project should be exist" do
    
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        
        params = {content: "note content",user_id: 5,project_id: project.id,category: 1}
        note = Note.new(params)
        note.save
        expect(note).to_not be_valid
        expect(note.errors[:user].size).to eq(1)
        expect(Note.find_by(user_id: 5)).to eq(nil)
    end
     
end
+
+ +

./spec/models/project_spec.rb

+ + +

./spec/models/share_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe Share, type: :model do
    
    it "its a valid share" do
       
        params = {name: "jaxon",email: "370403488@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        expect(user).to be_valid
    
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        
        params = {content: "share content",project_id: project.id,user_id: user.id}
        share = Share.new(params)
        share.save
        expect(share).to be_valid
        expect(Share.find_by(id: share.id)).to_not eq(nil)
        
    end
    
    it "share content should have at least one character" do
        
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        expect(user).to be_valid
    
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        
        params = {content: "     ",project_id: project.id,user_id: user.id}
        share = Share.new(params)
        share.save
        expect(share).to_not be_valid
        expect(share.errors[:content].size).to eq(2)
        expect(Share.find_by(id: share.id)).to eq(nil)
    
    end
    
    it "share's project should be exist" do
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        expect(user).to be_valid
    
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        
        params = {content: "share content",project_id: 5,user_id: user.id}
        share = Share.new(params)
        share.save
        expect(share).to_not be_valid
        expect(share.errors[:project].size).to eq(1)
        expect(Share.find_by(id: share.id)).to eq(nil)
    
    end
    
    it "share's user should be exist" do
        params = {name: "jaxon",email: "370403444@qq.com",password_digest: "123456",phone: "15652336366"}
        user = User.new(params)
        user.save
        expect(user).to be_valid
    
        params = {name: "project_1",content: "project content"}
        project = Project.new(params)
        project.users << user
        project.save
        expect(project).to be_valid
        
        params = {content: "share content",project_id: project.id,user_id: 10}
        share = Share.new(params)
        share.save
        expect(share).to_not be_valid
        expect(share.errors[:user].size).to eq(1)
        expect(Share.find_by(id: share.id)).to eq(nil)
    
    end
    
end
+
+ +

./spec/models/user_spec.rb

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
require 'rails_helper'
RSpec.describe User, type: :model do
  it 'has a valid factory' do
    expect(build(:user)).to be_valid
  end
  describe 'username test' do
    it 'does not allow absence of username' do
      expect(build(:user, name: nil)).not_to be_valid
    end
    it 'does not allow name length > 30' do
      expect(build(:user_name_length_gt_30)).not_to be_valid
    end
  end
  describe 'email test' do
    it 'does not allow absence of email' do
      expect(build(:user, email: nil)).not_to be_valid
    end
    it 'does not allow email length > 50' do
      expect(build(:user_email_length_gt_50)).not_to be_valid
    end
    it 'email should match /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i' do
      expect(build(:user, email: '123qq.com')).not_to be_valid
      expect(build(:user, email: '@qq.com')).not_to be_valid
      expect(build(:user, email: '123@qq')).not_to be_valid
      expect(build(:user, email: '123@.com')).not_to be_valid
      expect(build(:user, email: '123@qq.')).not_to be_valid
    end
  end
  describe 'password test' do
    it 'does not allow password length < 6' do
      expect(build(:user_password_length_lt_6)).not_to be_valid
    end
    it 'password_confirmation should match password when password_confirmation not nil' do
      expect(build(:user, password: '123456', password_confirmation: '654321')).to_not be_valid
    end
    it 'do not trigger match when password_confirmation nil' do
      expect(build(:user, password: '123456', password_confirmation: nil)).to be_valid
    end
    it 'does not allow password absence on create' do
      expect(build(:user, password: nil, password_confirmation: nil)).to_not be_valid
    end
    it 'can authenticate' do
      user = create(:user, password: '123456', password_confirmation: '123456')
      expect(user.authenticate('123456')).to be_instance_of User
      expect(user.authenticate('654312')).to be false
    end
  end
  describe 'phone test' do
    it 'does not allow phone absence' do
      expect(build(:user, phone: nil)).to_not be_valid
    end
    it 'does not allow character other than number' do
      expect(build(:user, phone: '1371234567a')).to_not be_valid
    end
    it 'does not allow phone longer or shorter than 11' do
      expect(build(:user, phone: '137123456789')).to_not be_valid
      expect(build(:user, phone: '1371234567')).to_not be_valid
    end
    # 防js注入
    it 'does not allow multiline' do
      expect(build(:user, phone: '13712345\n78')).to_not be_valid
    end
  end
end
+
+ + +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/rcov.js b/reports/metric_fu/output/rcov.js new file mode 100644 index 0000000..048092e --- /dev/null +++ b/reports/metric_fu/output/rcov.js @@ -0,0 +1,3 @@ + var graph_title = 'Rcov: code coverage'; + var graph_series = [{name: 'rcov', data: [87.1]}]; + var graph_labels = {"0":"1/3"}; diff --git a/reports/metric_fu/output/reek.html b/reports/metric_fu/output/reek.html new file mode 100644 index 0000000..820b90d --- /dev/null +++ b/reports/metric_fu/output/reek.html @@ -0,0 +1,1494 @@ + + + + + + metrics + + + + + + + + + + + +
+

Reek Results

+ +

Reek detects common code smells in ruby code.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File PathMethodDescriptionType
app/controllers/application_controller.rb + ApplicationController + + has no descriptive comment + + IrresponsibleModule +
app/controllers/application_controller.rb + ApplicationController#current_user + + calls session[:user_id] 2 times + + DuplicateMethodCall +
app/models/comment.rb + Comment#user_id_exist + + performs a nil-check + + NilCheck +
app/models/mission.rb + Mission + + has no descriptive comment + + IrresponsibleModule +
app/models/mission.rb + Mission#project_exists + + performs a nil-check + + NilCheck +
app/controllers/missions_controller.rb + MissionsController + + has no descriptive comment + + IrresponsibleModule +
app/controllers/missions_controller.rb + MissionsController#commentPublish + + has approx 7 statements + + TooManyStatements +
app/controllers/missions_controller.rb + MissionsController#commentPublish + + has the name 'commentPublish' + + UncommunicativeMethodName +
app/controllers/missions_controller.rb + MissionsController#create + + calls user_enties.id 2 times + + DuplicateMethodCall +
app/controllers/missions_controller.rb + MissionsController#create + + has approx 14 statements + + TooManyStatements +
app/controllers/missions_controller.rb + MissionsController#detail + + has approx 14 statements + + TooManyStatements +
app/controllers/missions_controller.rb + MissionsController#detail + + has the variable name 'c' + + UncommunicativeVariableName +
app/controllers/missions_controller.rb + MissionsController#detail + + refers to mission more than self + + FeatureEnvy +
app/controllers/missions_controller.rb + MissionsController#getlist + + has approx 7 statements + + TooManyStatements +
app/controllers/missions_controller.rb + MissionsController#update + + calls user_enties.id 2 times + + DuplicateMethodCall +
app/controllers/missions_controller.rb + MissionsController#update + + has approx 17 statements + + TooManyStatements +
app/models/missions_user.rb + Missions_user + + has no descriptive comment + + IrresponsibleModule +
app/models/missions_user.rb + Missions_user#mission_exist + + performs a nil-check + + NilCheck +
app/models/missions_user.rb + Missions_user#user_exist + + performs a nil-check + + NilCheck +
app/models/note.rb + Note + + has no descriptive comment + + IrresponsibleModule +
app/models/note.rb + Note#project_exist + + performs a nil-check + + NilCheck +
app/models/note.rb + Note#user_exist + + performs a nil-check + + NilCheck +
app/controllers/notes_controller.rb + NotesController + + has no descriptive comment + + IrresponsibleModule +
app/controllers/notes_controller.rb + NotesController#getNotesList + + calls n.created_at 2 times + + DuplicateMethodCall +
app/controllers/notes_controller.rb + NotesController#getNotesList + + calls n.created_at.to_s 2 times + + DuplicateMethodCall +
app/controllers/notes_controller.rb + NotesController#getNotesList + + has approx 13 statements + + TooManyStatements +
app/controllers/notes_controller.rb + NotesController#getNotesList + + has the name 'getNotesList' + + UncommunicativeMethodName +
app/controllers/notes_controller.rb + NotesController#getNotesList + + has the variable name 'h' + + UncommunicativeVariableName +
app/controllers/notes_controller.rb + NotesController#getNotesList + + has the variable name 'k' + + UncommunicativeVariableName +
app/controllers/notes_controller.rb + NotesController#getNotesList + + has the variable name 'n' + + UncommunicativeVariableName +
app/controllers/notes_controller.rb + NotesController#getNotesList + + has the variable name 'v' + + UncommunicativeVariableName +
app/controllers/notes_controller.rb + NotesController#getNotesList + + refers to n more than self + + FeatureEnvy +
app/models/project.rb + Project + + has no descriptive comment + + IrresponsibleModule +
app/controllers/projects_controller.rb + ProjectsController + + has no descriptive comment + + IrresponsibleModule +
app/controllers/projects_controller.rb + ProjectsController#addUsers + + has approx 14 statements + + TooManyStatements +
app/controllers/projects_controller.rb + ProjectsController#addUsers + + has the name 'addUsers' + + UncommunicativeMethodName +
app/controllers/projects_controller.rb + ProjectsController#addUsers + + performs a nil-check + + NilCheck +
app/controllers/projects_controller.rb + ProjectsController#deleteUsers + + has approx 14 statements + + TooManyStatements +
app/controllers/projects_controller.rb + ProjectsController#deleteUsers + + has the name 'deleteUsers' + + UncommunicativeMethodName +
app/controllers/projects_controller.rb + ProjectsController#deleteUsers + + performs a nil-check + + NilCheck +
app/controllers/projects_controller.rb + ProjectsController#detail + + has approx 9 statements + + TooManyStatements +
app/controllers/projects_controller.rb + ProjectsController#detail + + has the variable name 'i' + + UncommunicativeVariableName +
app/controllers/projects_controller.rb + ProjectsController#index + + has approx 10 statements + + TooManyStatements +
app/controllers/projects_controller.rb + ProjectsController#index + + has the variable name 'i' + + UncommunicativeVariableName +
app/controllers/projects_controller.rb + ProjectsController#index + + has the variable name 'p' + + UncommunicativeVariableName +
app/models/projects_user.rb + Projects_user + + has no descriptive comment + + IrresponsibleModule +
app/models/projects_user.rb + Projects_user#project_exists + + performs a nil-check + + NilCheck +
app/models/projects_user.rb + Projects_user#user_exists + + performs a nil-check + + NilCheck +
app/controllers/sessions_controller.rb + SessionsController + + has no descriptive comment + + IrresponsibleModule +
app/models/share.rb + Share + + has no descriptive comment + + IrresponsibleModule +
app/models/share.rb + Share#project_exists + + performs a nil-check + + NilCheck +
app/models/share.rb + Share#user_exists + + performs a nil-check + + NilCheck +
app/controllers/shares_controller.rb + SharesController + + has no descriptive comment + + IrresponsibleModule +
app/controllers/shares_controller.rb + SharesController#create + + has approx 11 statements + + TooManyStatements +
app/controllers/shares_controller.rb + SharesController#create + + has the variable name 'i' + + UncommunicativeVariableName +
app/controllers/shares_controller.rb + SharesController#getShareList + + calls i.content 2 times + + DuplicateMethodCall +
app/controllers/shares_controller.rb + SharesController#getShareList + + has approx 7 statements + + TooManyStatements +
app/controllers/shares_controller.rb + SharesController#getShareList + + has the name 'getShareList' + + UncommunicativeMethodName +
app/controllers/shares_controller.rb + SharesController#getShareList + + has the variable name 'i' + + UncommunicativeVariableName +
app/controllers/shares_controller.rb + SharesController#getShareList + + refers to i more than self + + FeatureEnvy +
app/models/user.rb + User + + has no descriptive comment + + IrresponsibleModule +
app/controllers/users_controller.rb + UsersController + + has no descriptive comment + + IrresponsibleModule +
app/controllers/users_controller.rb + UsersController#checkExist? + + doesn't depend on instance state + + UtilityFunction +
app/controllers/users_controller.rb + UsersController#checkExist? + + has the name 'checkExist?' + + UncommunicativeMethodName +
app/controllers/users_controller.rb + UsersController#emailExist + + has the name 'emailExist' + + UncommunicativeMethodName +
app/controllers/users_controller.rb + UsersController#usernameExist + + has the name 'usernameExist' + + UncommunicativeMethodName +
+ +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/reek.js b/reports/metric_fu/output/reek.js new file mode 100644 index 0000000..00166b0 --- /dev/null +++ b/reports/metric_fu/output/reek.js @@ -0,0 +1,3 @@ + var graph_title = 'Reek: code smells'; + var graph_series = [{name: 'IrresponsibleModule', data: [14]},{name: 'DuplicateMethodCall', data: [6]},{name: 'NilCheck', data: [12]},{name: 'TooManyStatements', data: [12]},{name: 'UncommunicativeMethodName', data: [8]},{name: 'UncommunicativeVariableName', data: [10]},{name: 'FeatureEnvy', data: [3]},{name: 'UtilityFunction', data: [1]}]; + var graph_labels = {"0":"1/3"}; diff --git a/reports/metric_fu/output/roodi.html b/reports/metric_fu/output/roodi.html new file mode 100644 index 0000000..6ebae9e --- /dev/null +++ b/reports/metric_fu/output/roodi.html @@ -0,0 +1,627 @@ + + + + + + metrics + + + + + + + + + + + +
+

Roodi Results

+ +

Roodi parses your Ruby code and warns you about design issues you have based on the checks that is has configured.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
File PathWarning
app/models/missions_user.rb:1Class name "Missions_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/
app/models/projects_user.rb:1Class name "Projects_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/
app/controllers/notes_controller.rb:7Method "getNotesList" has 24 lines. It should have 20 or less.
app/controllers/missions_controller.rb:13Method "getlist" has 27 lines. It should have 20 or less.
app/controllers/missions_controller.rb:48Method "detail" has 24 lines. It should have 20 or less.
app/controllers/missions_controller.rb:113Method "update" has 23 lines. It should have 20 or less.
app/controllers/projects_controller.rb:103Method "detail" has 23 lines. It should have 20 or less.
app/controllers/notes_controller.rb:7Method name "getNotesList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
app/controllers/shares_controller.rb:31Method name "getShareList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
app/controllers/users_controller.rb:11Method name "emailExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
app/controllers/users_controller.rb:19Method name "usernameExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
app/controllers/users_controller.rb:46Method name "checkExist?" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
app/controllers/missions_controller.rb:141Method name "commentPublish" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
app/controllers/projects_controller.rb:55Method name "addUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
app/controllers/projects_controller.rb:78Method name "deleteUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/
+ +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/roodi.js b/reports/metric_fu/output/roodi.js new file mode 100644 index 0000000..3419ad3 --- /dev/null +++ b/reports/metric_fu/output/roodi.js @@ -0,0 +1,3 @@ + var graph_title = 'Roodi: design problems'; + var graph_series = [{name: 'roodi', data: [15]}]; + var graph_labels = {"0":"1/3"}; diff --git a/reports/metric_fu/output/saikuro.html b/reports/metric_fu/output/saikuro.html new file mode 100644 index 0000000..e0b5b7c --- /dev/null +++ b/reports/metric_fu/output/saikuro.html @@ -0,0 +1,1704 @@ + + + + + + metrics + + + + + + + + + + + +
+

Saikuro Results

+

Saikuro analyzes ruby code for cyclomatic complexity.

+ +

Analyzed Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Method NameComplexity# Lines
NotesController#getNotesList428
SharesController#create317
MissionsController#create322
MissionsController#detail336
Project#require_at_least_on_user24
Projects_user#user_exists27
Projects_user#project_exists27
Missions_user#user_exist27
Missions_user#mission_exist28
Comment#user_id_exist27
Comment#comment_has_atleast_one_character25
ApplicationController#current_user22
ApplicationController#authenticate22
SessionsController#create28
Share#project_exists27
Share#user_exists27
Share#share_has_atleast_one_character25
Mission#project_exists28
Mission#status_is_among_valid_values25
Mission#priority_is_among_valid_values25
SharesController#getShareList218
Note#project_exist27
Note#user_exist27
Note#note_category_should_among_valid_values26
Note#note_has_atleast_one_character25
UsersController#update27
UsersController#create27
UsersController#usernameExist26
UsersController#emailExist26
MissionsController#commentPublish212
MissionsController#update224
MissionsController#getlist231
ProjectsController#update27
ProjectsController#detail231
ProjectsController#deleteUsers221
ProjectsController#addUsers220
ProjectsController#create29
ProjectsController#index223
SessionsController#show12
SessionsController#destroy14
SharesController#share_params12
UsersController#user_params12
UsersController#checkExist?12
ProjectsController#project_params12
+ + + +

Analyzed Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Class NameComplexity# Lines
ProjectsController13149
MissionsController12153
UsersController1052
Note849
Share636
Mission646
SharesController654
Projects_user428
Missions_user429
Comment443
ApplicationController415
NotesController436
SessionsController428
Project214
User014
UsersHelper01
SessionsHelper01
ApplicationHelper01
+ + +

Analyzed Files

+ + + +

app/controllers/projects_controller.rb

+

Class : ProjectsController

+
Total complexity : 13
+
Total lines : 149
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ ProjectsController#update + + 2 + + 7 +
+ ProjectsController#detail + + 2 + + 31 +
+ ProjectsController#deleteUsers + + 2 + + 21 +
+ ProjectsController#addUsers + + 2 + + 20 +
+ ProjectsController#create + + 2 + + 9 +
+ ProjectsController#index + + 2 + + 23 +
+ ProjectsController#project_params + + 1 + + 2 +
+ + + + + +

app/controllers/missions_controller.rb

+

Class : MissionsController

+
Total complexity : 12
+
Total lines : 153
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ MissionsController#create + + 3 + + 22 +
+ MissionsController#detail + + 3 + + 36 +
+ MissionsController#commentPublish + + 2 + + 12 +
+ MissionsController#update + + 2 + + 24 +
+ MissionsController#getlist + + 2 + + 31 +
+ + + + + +

app/controllers/users_controller.rb

+

Class : UsersController

+
Total complexity : 10
+
Total lines : 52
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ UsersController#update + + 2 + + 7 +
+ UsersController#create + + 2 + + 7 +
+ UsersController#usernameExist + + 2 + + 6 +
+ UsersController#emailExist + + 2 + + 6 +
+ UsersController#user_params + + 1 + + 2 +
+ UsersController#checkExist? + + 1 + + 2 +
+ + + + + +

app/models/note.rb

+

Class : Note

+
Total complexity : 8
+
Total lines : 49
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ Note#project_exist + + 2 + + 7 +
+ Note#user_exist + + 2 + + 7 +
+ Note#note_category_should_among_valid_values + + 2 + + 6 +
+ Note#note_has_atleast_one_character + + 2 + + 5 +
+ + + + + +

app/controllers/shares_controller.rb

+

Class : SharesController

+
Total complexity : 6
+
Total lines : 54
+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ SharesController#create + + 3 + + 17 +
+ SharesController#getShareList + + 2 + + 18 +
+ SharesController#share_params + + 1 + + 2 +
+ + + + + +

app/models/mission.rb

+

Class : Mission

+
Total complexity : 6
+
Total lines : 46
+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ Mission#project_exists + + 2 + + 8 +
+ Mission#status_is_among_valid_values + + 2 + + 5 +
+ Mission#priority_is_among_valid_values + + 2 + + 5 +
+ + + + + +

app/models/share.rb

+

Class : Share

+
Total complexity : 6
+
Total lines : 36
+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ Share#project_exists + + 2 + + 7 +
+ Share#user_exists + + 2 + + 7 +
+ Share#share_has_atleast_one_character + + 2 + + 5 +
+ + + + + +

app/controllers/sessions_controller.rb

+

Class : SessionsController

+
Total complexity : 4
+
Total lines : 28
+ + + + + + + + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ SessionsController#create + + 2 + + 8 +
+ SessionsController#show + + 1 + + 2 +
+ SessionsController#destroy + + 1 + + 4 +
+ + + + + +

app/controllers/notes_controller.rb

+

Class : NotesController

+
Total complexity : 4
+
Total lines : 36
+ + + + + + + + + + + + + +
MethodComplexity# Lines
+ NotesController#getNotesList + + 4 + + 28 +
+ + + + + +

app/controllers/application_controller.rb

+

Class : ApplicationController

+
Total complexity : 4
+
Total lines : 15
+ + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ ApplicationController#current_user + + 2 + + 2 +
+ ApplicationController#authenticate + + 2 + + 2 +
+ + + + + +

app/models/comment.rb

+

Class : Comment

+
Total complexity : 4
+
Total lines : 43
+ + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ Comment#user_id_exist + + 2 + + 7 +
+ Comment#comment_has_atleast_one_character + + 2 + + 5 +
+ + + + + +

app/models/missions_user.rb

+

Class : Missions_user

+
Total complexity : 4
+
Total lines : 29
+ + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ Missions_user#user_exist + + 2 + + 7 +
+ Missions_user#mission_exist + + 2 + + 8 +
+ + + + + +

app/models/projects_user.rb

+

Class : Projects_user

+
Total complexity : 4
+
Total lines : 28
+ + + + + + + + + + + + + + + + + + + +
MethodComplexity# Lines
+ Projects_user#user_exists + + 2 + + 7 +
+ Projects_user#project_exists + + 2 + + 7 +
+ + + + + +

app/models/project.rb

+

Class : Project

+
Total complexity : 2
+
Total lines : 14
+ + + + + + + + + + + + + +
MethodComplexity# Lines
+ Project#require_at_least_on_user + + 2 + + 4 +
+ + + + + + + + + + + + + + + + + + + + +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/standalone-framework.js b/reports/metric_fu/output/standalone-framework.js new file mode 100644 index 0000000..30a75c5 --- /dev/null +++ b/reports/metric_fu/output/standalone-framework.js @@ -0,0 +1,17 @@ +/* + Highcharts JS v3.0.9 (2014-01-15) + + Standalone Highcharts Framework + + License: MIT License +*/ +var HighchartsAdapter=function(){function o(c){function b(b,a,d){b.removeEventListener(a,d,!1)}function d(b,a,d){d=b.HCProxiedMethods[d.toString()];b.detachEvent("on"+a,d)}function a(a,c){var f=a.HCEvents,i,g,k,j;if(a.removeEventListener)i=b;else if(a.attachEvent)i=d;else return;c?(g={},g[c]=!0):g=f;for(j in g)if(f[j])for(k=f[j].length;k--;)i(a,j,f[j][k])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(a,b){var d=this,c=this.HCEvents,g;if(d.addEventListener)d.addEventListener(a, +b,!1);else if(d.attachEvent){g=function(a){b.call(d,a)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[b.toString()]=g;d.attachEvent("on"+a,g)}c[a]===r&&(c[a]=[]);c[a].push(b)},unbind:function(c,h){var f,i;c?(f=this.HCEvents[c]||[],h?(i=HighchartsAdapter.inArray(h,f),i>-1&&(f.splice(i,1),this.HCEvents[c]=f),this.removeEventListener?b(this,c,h):this.attachEvent&&d(this,c,h)):(a(this,c),this.HCEvents[c]=[])):(a(this),this.HCEvents={})},trigger:function(a,b){var d=this.HCEvents[a]|| +[],c=d.length,g,k,j;k=function(){b.defaultPrevented=!0};for(g=0;g=a.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();b=this.options.curAnim[this.prop]= +!0;for(e in a.curAnim)a.curAnim[e]!==!0&&(b=!1);b&&a.complete&&a.complete.call(this.elem);a=!1}else e=c-this.startTime,this.state=e/a.duration,this.pos=a.easing(e,0,1,a.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),a=!0;return a}};this.animate=function(b,d,a){var e,h="",f,i,g;b.stopAnimation=!1;if(typeof a!=="object"||a===null)e=arguments,a={duration:e[2],easing:e[3],complete:e[4]};if(typeof a.duration!=="number")a.duration=400;a.easing=Math[a.easing]||Math.easeInOutSine; +a.curAnim=Highcharts.extend({},d);for(g in d)i=new n(b,a,g),f=null,g==="d"?(i.paths=c.init(b,b.d,d.d),i.toD=d.d,e=0,f=1):b.attr?e=b.attr(g):(e=parseFloat(HighchartsAdapter._getStyle(b,g))||0,g!=="opacity"&&(h="px")),f||(f=parseFloat(d[g])),i.custom(e,f,h)}},_getStyle:function(c,b){return window.getComputedStyle(c).getPropertyValue(b)},getScript:function(c,b){var d=l.getElementsByTagName("head")[0],a=l.createElement("script");a.type="text/javascript";a.src=c;a.onload=b;d.appendChild(a)},inArray:function(c, +b){return b.indexOf?b.indexOf(c):p.indexOf.call(b,c)},adapterRun:function(c,b){return parseInt(HighchartsAdapter._getStyle(c,b),10)},grep:function(c,b){return p.filter.call(c,b)},map:function(c,b){for(var d=[],a=0,e=c.length;a + + + + + metrics + + + + + + + + + + + +
+

Lines of Code/Tests Metric Results

+ +
+ + +

Lines of Code/Tests Metrics Results

+ + + + + + + + + + + +
Lines of CodeLines of TestCode to test ratio
5607821:1.4
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameLinesLOCClassesMethodsMethods per classLOC per method
Controllers494381727312
Helpers660000
Models26717381728
Mailers000000
Javascripts2200000
Libraries000000
Models specs5343880000
Controllers specs5733940000
Total189613421544228
+ +

Generated on 2017-01-03 10:45:18 +0800

+ +
+ + + + + diff --git a/reports/metric_fu/output/stats.js b/reports/metric_fu/output/stats.js new file mode 100644 index 0000000..1919468 --- /dev/null +++ b/reports/metric_fu/output/stats.js @@ -0,0 +1,3 @@ + var graph_title = 'Stats: LOC & LOT'; + var graph_series = [{name: 'LOC', data: [560]},{name: 'LOT', data: [782]}]; + var graph_labels = {"0":"1/3"}; diff --git a/reports/metric_fu/output/utils.js b/reports/metric_fu/output/utils.js new file mode 100644 index 0000000..6db3759 --- /dev/null +++ b/reports/metric_fu/output/utils.js @@ -0,0 +1,9 @@ +function createGraphElement(elementType) { + var graphContainer = document.getElementById("graph_container"); + + if(graphContainer) { + var graphElement = document.createElement(elementType); + graphElement.setAttribute("id", "graph"); + graphContainer.appendChild(graphElement); + } +} diff --git a/reports/metric_fu/report.yml b/reports/metric_fu/report.yml new file mode 100644 index 0000000..cba9aee --- /dev/null +++ b/reports/metric_fu/report.yml @@ -0,0 +1,5625 @@ +--- +:flay: + :total_score: '268' + :matches: + - :reason: 1) Similar code found in :defn (mass = 160) + :matches: + - :name: app/models/comment.rb + :line: '23' + - :name: app/models/mission.rb + :line: '36' + - :name: app/models/missions_user.rb + :line: '10' + - :name: app/models/missions_user.rb + :line: '20' + - :name: app/models/note.rb + :line: '32' + - :name: app/models/note.rb + :line: '41' + - :name: app/models/projects_user.rb + :line: '11' + - :name: app/models/projects_user.rb + :line: '20' + - :name: app/models/share.rb + :line: '20' + - :name: app/models/share.rb + :line: '28' + - :reason: 2) Similar code found in :lasgn (mass = 40) + :matches: + - :name: app/controllers/projects_controller.rb + :line: '66' + - :name: app/controllers/projects_controller.rb + :line: '92' + - :reason: 3) Similar code found in :defn (mass = 36) + :matches: + - :name: app/models/mission.rb + :line: '22' + - :name: app/models/note.rb + :line: '24' + - :reason: 4) Similar code found in :defn (mass = 32) + :matches: + - :name: app/controllers/users_controller.rb + :line: '11' + - :name: app/controllers/users_controller.rb + :line: '19' +:rails_best_practices: + :total: + - Found 31 errors. + :problems: + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '16' + :problem: always add db index (comments => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '26' + :problem: always add db index (missions => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '37' + :problem: always add db index (missions_users => [mission_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '37' + :problem: always add db index (missions_users => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '42' + :problem: always add db index (notes => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '60' + :problem: always add db index (projects_users => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '60' + :problem: always add db index (projects_users => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '65' + :problem: always add db index (shares => [project_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/db/schema.rb" + :line: '65' + :problem: always add db index (shares => [user_id]) + :url: http://rails-bestpractices.com/posts/2010/07/24/always-add-db-index/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '48' + :problem: move model logic into model (mission use_count > 4) + :url: http://rails-bestpractices.com/posts/2010/07/21/move-model-logic-into-the-model/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '87' + :problem: move model logic into model (mission use_count > 4) + :url: http://rails-bestpractices.com/posts/2010/07/21/move-model-logic-into-the-model/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '113' + :problem: move model logic into model (mission use_count > 4) + :url: http://rails-bestpractices.com/posts/2010/07/21/move-model-logic-into-the-model/ + - :file: "/home/ccx/RubymineProjects/ambition/app/helpers/users_helper.rb" + :line: '1' + :problem: remove empty helpers + :url: http://rails-bestpractices.com/posts/2011/04/09/remove-empty-helpers/ + - :file: "/home/ccx/RubymineProjects/ambition/app/helpers/sessions_helper.rb" + :line: '1' + :problem: remove empty helpers + :url: http://rails-bestpractices.com/posts/2011/04/09/remove-empty-helpers/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/shares_controller.rb" + :line: '10' + :problem: use model association (for share) + :url: http://rails-bestpractices.com/posts/2010/07/19/use-model-association/ + - :file: "/home/ccx/RubymineProjects/ambition/Gemfile" + :line: '37' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/note.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/project.rb" + :line: '5' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/missions_user.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/projects_user.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/share.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/comment.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/models/mission.rb" + :line: '4' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/db/migrate/20161229084919_change_note_field_type_to_category.rb" + :line: '3' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/notes_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/shares_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/sessions_controller.rb" + :line: '7' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/missions_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/app/controllers/projects_controller.rb" + :line: '2' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/config/routes.rb" + :line: '65' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ + - :file: "/home/ccx/RubymineProjects/ambition/config/application.rb" + :line: '25' + :problem: remove trailing whitespace + :url: http://rails-bestpractices.com/posts/2010/12/02/remove-trailing-whitespace/ +:churn: + :changes: + - :file_path: app/controllers/projects_controller.rb + :times_changed: 16 + - :file_path: db/schema.rb + :times_changed: 12 + :class_churn: + - klass: + file: app/controllers/missions_controller.rb + klass: MissionsController + times_changed: 1 + :method_churn: + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#detail + times_changed: 1 + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#create + times_changed: 1 + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#update + times_changed: 1 + - method: + file: app/controllers/missions_controller.rb + klass: MissionsController + method: MissionsController#commentPublish + times_changed: 1 + :changed_files: + - ".gitignore" + - ".metrics" + - Gemfile + - db/schema.rb + - spec/controllers/sessions_controller_spec.rb + - spec/controllers/users_controller_spec.rb + - spec/models/user_spec.rb + :changed_classes: [] + :changed_methods: [] +:saikuro: + :files: + - :classes: + - :class_name: ProjectsController + :complexity: 13 + :lines: 149 + :methods: + - :name: ProjectsController#update + :complexity: 2 + :lines: 7 + - :name: ProjectsController#detail + :complexity: 2 + :lines: 31 + - :name: ProjectsController#deleteUsers + :complexity: 2 + :lines: 21 + - :name: ProjectsController#addUsers + :complexity: 2 + :lines: 20 + - :name: ProjectsController#create + :complexity: 2 + :lines: 9 + - :name: ProjectsController#index + :complexity: 2 + :lines: 23 + - :name: ProjectsController#project_params + :complexity: 1 + :lines: 2 + :filename: app/controllers/projects_controller.rb + - :classes: + - :class_name: MissionsController + :complexity: 12 + :lines: 153 + :methods: + - :name: MissionsController#create + :complexity: 3 + :lines: 22 + - :name: MissionsController#detail + :complexity: 3 + :lines: 36 + - :name: MissionsController#commentPublish + :complexity: 2 + :lines: 12 + - :name: MissionsController#update + :complexity: 2 + :lines: 24 + - :name: MissionsController#getlist + :complexity: 2 + :lines: 31 + :filename: app/controllers/missions_controller.rb + - :classes: + - :class_name: UsersController + :complexity: 10 + :lines: 52 + :methods: + - :name: UsersController#update + :complexity: 2 + :lines: 7 + - :name: UsersController#create + :complexity: 2 + :lines: 7 + - :name: UsersController#usernameExist + :complexity: 2 + :lines: 6 + - :name: UsersController#emailExist + :complexity: 2 + :lines: 6 + - :name: UsersController#user_params + :complexity: 1 + :lines: 2 + - :name: UsersController#checkExist? + :complexity: 1 + :lines: 2 + :filename: app/controllers/users_controller.rb + - :classes: + - :class_name: Note + :complexity: 8 + :lines: 49 + :methods: + - :name: Note#project_exist + :complexity: 2 + :lines: 7 + - :name: Note#user_exist + :complexity: 2 + :lines: 7 + - :name: Note#note_category_should_among_valid_values + :complexity: 2 + :lines: 6 + - :name: Note#note_has_atleast_one_character + :complexity: 2 + :lines: 5 + :filename: app/models/note.rb + - :classes: + - :class_name: SharesController + :complexity: 6 + :lines: 54 + :methods: + - :name: SharesController#create + :complexity: 3 + :lines: 17 + - :name: SharesController#getShareList + :complexity: 2 + :lines: 18 + - :name: SharesController#share_params + :complexity: 1 + :lines: 2 + :filename: app/controllers/shares_controller.rb + - :classes: + - :class_name: Mission + :complexity: 6 + :lines: 46 + :methods: + - :name: Mission#project_exists + :complexity: 2 + :lines: 8 + - :name: Mission#status_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#priority_is_among_valid_values + :complexity: 2 + :lines: 5 + :filename: app/models/mission.rb + - :classes: + - :class_name: Share + :complexity: 6 + :lines: 36 + :methods: + - :name: Share#project_exists + :complexity: 2 + :lines: 7 + - :name: Share#user_exists + :complexity: 2 + :lines: 7 + - :name: Share#share_has_atleast_one_character + :complexity: 2 + :lines: 5 + :filename: app/models/share.rb + - :classes: + - :class_name: SessionsController + :complexity: 4 + :lines: 28 + :methods: + - :name: SessionsController#create + :complexity: 2 + :lines: 8 + - :name: SessionsController#show + :complexity: 1 + :lines: 2 + - :name: SessionsController#destroy + :complexity: 1 + :lines: 4 + :filename: app/controllers/sessions_controller.rb + - :classes: + - :class_name: NotesController + :complexity: 4 + :lines: 36 + :methods: + - :name: NotesController#getNotesList + :complexity: 4 + :lines: 28 + :filename: app/controllers/notes_controller.rb + - :classes: + - :class_name: ApplicationController + :complexity: 4 + :lines: 15 + :methods: + - :name: ApplicationController#current_user + :complexity: 2 + :lines: 2 + - :name: ApplicationController#authenticate + :complexity: 2 + :lines: 2 + :filename: app/controllers/application_controller.rb + - :classes: + - :class_name: Comment + :complexity: 4 + :lines: 43 + :methods: + - :name: Comment#user_id_exist + :complexity: 2 + :lines: 7 + - :name: Comment#comment_has_atleast_one_character + :complexity: 2 + :lines: 5 + :filename: app/models/comment.rb + - :classes: + - :class_name: Missions_user + :complexity: 4 + :lines: 29 + :methods: + - :name: Missions_user#user_exist + :complexity: 2 + :lines: 7 + - :name: Missions_user#mission_exist + :complexity: 2 + :lines: 8 + :filename: app/models/missions_user.rb + - :classes: + - :class_name: Projects_user + :complexity: 4 + :lines: 28 + :methods: + - :name: Projects_user#user_exists + :complexity: 2 + :lines: 7 + - :name: Projects_user#project_exists + :complexity: 2 + :lines: 7 + :filename: app/models/projects_user.rb + - :classes: + - :class_name: Project + :complexity: 2 + :lines: 14 + :methods: + - :name: Project#require_at_least_on_user + :complexity: 2 + :lines: 4 + :filename: app/models/project.rb + - :classes: + - :class_name: ApplicationHelper + :complexity: 0 + :lines: 1 + :methods: [] + :filename: app/helpers/application_helper.rb + - :classes: + - :class_name: SessionsHelper + :complexity: 0 + :lines: 1 + :methods: [] + :filename: app/helpers/sessions_helper.rb + - :classes: + - :class_name: UsersHelper + :complexity: 0 + :lines: 1 + :methods: [] + :filename: app/helpers/users_helper.rb + - :classes: + - :class_name: User + :complexity: 0 + :lines: 14 + :methods: [] + :filename: app/models/user.rb + :classes: + - :name: ProjectsController + :complexity: 13 + :lines: 149 + :defs: + - :name: ProjectsController#index + :complexity: 2 + :lines: 23 + - :name: ProjectsController#create + :complexity: 2 + :lines: 9 + - :name: ProjectsController#addUsers + :complexity: 2 + :lines: 20 + - :name: ProjectsController#deleteUsers + :complexity: 2 + :lines: 21 + - :name: ProjectsController#detail + :complexity: 2 + :lines: 31 + - :name: ProjectsController#update + :complexity: 2 + :lines: 7 + - :name: ProjectsController#project_params + :complexity: 1 + :lines: 2 + - :name: MissionsController + :complexity: 12 + :lines: 153 + :defs: + - :name: MissionsController#getlist + :complexity: 2 + :lines: 31 + - :name: MissionsController#detail + :complexity: 3 + :lines: 36 + - :name: MissionsController#create + :complexity: 3 + :lines: 22 + - :name: MissionsController#update + :complexity: 2 + :lines: 24 + - :name: MissionsController#commentPublish + :complexity: 2 + :lines: 12 + - :name: UsersController + :complexity: 10 + :lines: 52 + :defs: + - :name: UsersController#emailExist + :complexity: 2 + :lines: 6 + - :name: UsersController#usernameExist + :complexity: 2 + :lines: 6 + - :name: UsersController#create + :complexity: 2 + :lines: 7 + - :name: UsersController#update + :complexity: 2 + :lines: 7 + - :name: UsersController#checkExist? + :complexity: 1 + :lines: 2 + - :name: UsersController#user_params + :complexity: 1 + :lines: 2 + - :name: Note + :complexity: 8 + :lines: 49 + :defs: + - :name: Note#note_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Note#note_category_should_among_valid_values + :complexity: 2 + :lines: 6 + - :name: Note#user_exist + :complexity: 2 + :lines: 7 + - :name: Note#project_exist + :complexity: 2 + :lines: 7 + - :name: Share + :complexity: 6 + :lines: 36 + :defs: + - :name: Share#share_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Share#user_exists + :complexity: 2 + :lines: 7 + - :name: Share#project_exists + :complexity: 2 + :lines: 7 + - :name: Mission + :complexity: 6 + :lines: 46 + :defs: + - :name: Mission#priority_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#status_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#project_exists + :complexity: 2 + :lines: 8 + - :name: SharesController + :complexity: 6 + :lines: 54 + :defs: + - :name: SharesController#create + :complexity: 3 + :lines: 17 + - :name: SharesController#getShareList + :complexity: 2 + :lines: 18 + - :name: SharesController#share_params + :complexity: 1 + :lines: 2 + - :name: Projects_user + :complexity: 4 + :lines: 28 + :defs: + - :name: Projects_user#project_exists + :complexity: 2 + :lines: 7 + - :name: Projects_user#user_exists + :complexity: 2 + :lines: 7 + - :name: Missions_user + :complexity: 4 + :lines: 29 + :defs: + - :name: Missions_user#mission_exist + :complexity: 2 + :lines: 8 + - :name: Missions_user#user_exist + :complexity: 2 + :lines: 7 + - :name: Comment + :complexity: 4 + :lines: 43 + :defs: + - :name: Comment#comment_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Comment#user_id_exist + :complexity: 2 + :lines: 7 + - :name: ApplicationController + :complexity: 4 + :lines: 15 + :defs: + - :name: ApplicationController#authenticate + :complexity: 2 + :lines: 2 + - :name: ApplicationController#current_user + :complexity: 2 + :lines: 2 + - :name: NotesController + :complexity: 4 + :lines: 36 + :defs: + - :name: NotesController#getNotesList + :complexity: 4 + :lines: 28 + - :name: SessionsController + :complexity: 4 + :lines: 28 + :defs: + - :name: SessionsController#create + :complexity: 2 + :lines: 8 + - :name: SessionsController#destroy + :complexity: 1 + :lines: 4 + - :name: SessionsController#show + :complexity: 1 + :lines: 2 + - :name: Project + :complexity: 2 + :lines: 14 + :defs: + - :name: Project#require_at_least_on_user + :complexity: 2 + :lines: 4 + - :name: User + :complexity: 0 + :lines: 14 + - :name: UsersHelper + :complexity: 0 + :lines: 1 + - :name: SessionsHelper + :complexity: 0 + :lines: 1 + - :name: ApplicationHelper + :complexity: 0 + :lines: 1 + :methods: + - :name: NotesController#getNotesList + :complexity: 4 + :lines: 28 + - :name: SharesController#create + :complexity: 3 + :lines: 17 + - :name: MissionsController#create + :complexity: 3 + :lines: 22 + - :name: MissionsController#detail + :complexity: 3 + :lines: 36 + - :name: Project#require_at_least_on_user + :complexity: 2 + :lines: 4 + - :name: Projects_user#user_exists + :complexity: 2 + :lines: 7 + - :name: Projects_user#project_exists + :complexity: 2 + :lines: 7 + - :name: Missions_user#user_exist + :complexity: 2 + :lines: 7 + - :name: Missions_user#mission_exist + :complexity: 2 + :lines: 8 + - :name: Comment#user_id_exist + :complexity: 2 + :lines: 7 + - :name: Comment#comment_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: ApplicationController#current_user + :complexity: 2 + :lines: 2 + - :name: ApplicationController#authenticate + :complexity: 2 + :lines: 2 + - :name: SessionsController#create + :complexity: 2 + :lines: 8 + - :name: Share#project_exists + :complexity: 2 + :lines: 7 + - :name: Share#user_exists + :complexity: 2 + :lines: 7 + - :name: Share#share_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: Mission#project_exists + :complexity: 2 + :lines: 8 + - :name: Mission#status_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: Mission#priority_is_among_valid_values + :complexity: 2 + :lines: 5 + - :name: SharesController#getShareList + :complexity: 2 + :lines: 18 + - :name: Note#project_exist + :complexity: 2 + :lines: 7 + - :name: Note#user_exist + :complexity: 2 + :lines: 7 + - :name: Note#note_category_should_among_valid_values + :complexity: 2 + :lines: 6 + - :name: Note#note_has_atleast_one_character + :complexity: 2 + :lines: 5 + - :name: UsersController#update + :complexity: 2 + :lines: 7 + - :name: UsersController#create + :complexity: 2 + :lines: 7 + - :name: UsersController#usernameExist + :complexity: 2 + :lines: 6 + - :name: UsersController#emailExist + :complexity: 2 + :lines: 6 + - :name: MissionsController#commentPublish + :complexity: 2 + :lines: 12 + - :name: MissionsController#update + :complexity: 2 + :lines: 24 + - :name: MissionsController#getlist + :complexity: 2 + :lines: 31 + - :name: ProjectsController#update + :complexity: 2 + :lines: 7 + - :name: ProjectsController#detail + :complexity: 2 + :lines: 31 + - :name: ProjectsController#deleteUsers + :complexity: 2 + :lines: 21 + - :name: ProjectsController#addUsers + :complexity: 2 + :lines: 20 + - :name: ProjectsController#create + :complexity: 2 + :lines: 9 + - :name: ProjectsController#index + :complexity: 2 + :lines: 23 + - :name: SessionsController#show + :complexity: 1 + :lines: 2 + - :name: SessionsController#destroy + :complexity: 1 + :lines: 4 + - :name: SharesController#share_params + :complexity: 1 + :lines: 2 + - :name: UsersController#user_params + :complexity: 1 + :lines: 2 + - :name: UsersController#checkExist? + :complexity: 1 + :lines: 2 + - :name: ProjectsController#project_params + :complexity: 1 + :lines: 2 +:roodi: + :total: + - Checked 18 files + :problems: + - :file: app/models/missions_user.rb + :line: '1' + :problem: Class name "Missions_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/ + - :file: app/models/projects_user.rb + :line: '1' + :problem: Class name "Projects_user" should match pattern /^[A-Z][a-zA-Z0-9]*$/ + - :file: app/controllers/notes_controller.rb + :line: '7' + :problem: Method "getNotesList" has 24 lines. It should have 20 or less. + - :file: app/controllers/missions_controller.rb + :line: '13' + :problem: Method "getlist" has 27 lines. It should have 20 or less. + - :file: app/controllers/missions_controller.rb + :line: '48' + :problem: Method "detail" has 24 lines. It should have 20 or less. + - :file: app/controllers/missions_controller.rb + :line: '113' + :problem: Method "update" has 23 lines. It should have 20 or less. + - :file: app/controllers/projects_controller.rb + :line: '103' + :problem: Method "detail" has 23 lines. It should have 20 or less. + - :file: app/controllers/notes_controller.rb + :line: '7' + :problem: Method name "getNotesList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/shares_controller.rb + :line: '31' + :problem: Method name "getShareList" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/users_controller.rb + :line: '11' + :problem: Method name "emailExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/users_controller.rb + :line: '19' + :problem: Method name "usernameExist" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/users_controller.rb + :line: '46' + :problem: Method name "checkExist?" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/missions_controller.rb + :line: '141' + :problem: Method name "commentPublish" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/projects_controller.rb + :line: '55' + :problem: Method name "addUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ + - :file: app/controllers/projects_controller.rb + :line: '78' + :problem: Method name "deleteUsers" should match pattern /^[_a-z<>=\[\]|+-\/\*`]+[_a-z0-9_<>=~@\[\]]*[=!\?]?$/ +:stats: + :codeLOC: 560 + :testLOC: 782 + :code_to_test_ratio: 1.4 + :lines: + - :name: Controllers + :lines: 494 + :loc: 381 + :classes: 7 + :methods: 27 + :methods_per_class: 3 + :loc_per_method: 12 + - :name: Helpers + :lines: 6 + :loc: 6 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Models + :lines: 267 + :loc: 173 + :classes: 8 + :methods: 17 + :methods_per_class: 2 + :loc_per_method: 8 + - :name: Mailers + :lines: 0 + :loc: 0 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Javascripts + :lines: 22 + :loc: 0 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Libraries + :lines: 0 + :loc: 0 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Models specs + :lines: 534 + :loc: 388 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Controllers specs + :lines: 573 + :loc: 394 + :classes: 0 + :methods: 0 + :methods_per_class: 0 + :loc_per_method: 0 + - :name: Total + :lines: 1896 + :loc: 1342 + :classes: 15 + :methods: 44 + :methods_per_class: 2 + :loc_per_method: 28 +:reek: + :matches: + - :file_path: app/controllers/application_controller.rb + :code_smells: + - :method: ApplicationController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: ApplicationController#current_user + :message: calls session[:user_id] 2 times + :type: DuplicateMethodCall + :lines: + - 12 + - 12 + - :file_path: app/models/comment.rb + :code_smells: + - :method: Comment#user_id_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 26 + - :file_path: app/models/mission.rb + :code_smells: + - :method: Mission + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Mission#project_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 40 + - :file_path: app/controllers/missions_controller.rb + :code_smells: + - :method: MissionsController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: MissionsController#commentPublish + :message: has approx 7 statements + :type: TooManyStatements + :lines: + - 141 + - :method: MissionsController#commentPublish + :message: has the name 'commentPublish' + :type: UncommunicativeMethodName + :lines: + - 141 + - :method: MissionsController#create + :message: calls user_enties.id 2 times + :type: DuplicateMethodCall + :lines: + - 100 + - 105 + - :method: MissionsController#create + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 87 + - :method: MissionsController#detail + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 48 + - :method: MissionsController#detail + :message: has the variable name 'c' + :type: UncommunicativeVariableName + :lines: + - 63 + - :method: MissionsController#detail + :message: refers to mission more than self + :type: FeatureEnvy + :lines: + - 48 + - :method: MissionsController#getlist + :message: has approx 7 statements + :type: TooManyStatements + :lines: + - 13 + - :method: MissionsController#update + :message: calls user_enties.id 2 times + :type: DuplicateMethodCall + :lines: + - 127 + - 132 + - :method: MissionsController#update + :message: has approx 17 statements + :type: TooManyStatements + :lines: + - 113 + - :file_path: app/models/missions_user.rb + :code_smells: + - :method: Missions_user + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Missions_user#mission_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 13 + - :method: Missions_user#user_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 23 + - :file_path: app/models/note.rb + :code_smells: + - :method: Note + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Note#project_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 44 + - :method: Note#user_exist + :message: performs a nil-check + :type: NilCheck + :lines: + - 35 + - :file_path: app/controllers/notes_controller.rb + :code_smells: + - :method: NotesController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: NotesController#getNotesList + :message: calls n.created_at 2 times + :type: DuplicateMethodCall + :lines: + - 16 + - 17 + - :method: NotesController#getNotesList + :message: calls n.created_at.to_s 2 times + :type: DuplicateMethodCall + :lines: + - 16 + - 17 + - :method: NotesController#getNotesList + :message: has approx 13 statements + :type: TooManyStatements + :lines: + - 7 + - :method: NotesController#getNotesList + :message: has the name 'getNotesList' + :type: UncommunicativeMethodName + :lines: + - 7 + - :method: NotesController#getNotesList + :message: has the variable name 'h' + :type: UncommunicativeVariableName + :lines: + - 12 + - :method: NotesController#getNotesList + :message: has the variable name 'k' + :type: UncommunicativeVariableName + :lines: + - 12 + - 25 + - :method: NotesController#getNotesList + :message: has the variable name 'n' + :type: UncommunicativeVariableName + :lines: + - 15 + - :method: NotesController#getNotesList + :message: has the variable name 'v' + :type: UncommunicativeVariableName + :lines: + - 25 + - :method: NotesController#getNotesList + :message: refers to n more than self + :type: FeatureEnvy + :lines: + - 7 + - :file_path: app/models/project.rb + :code_smells: + - :method: Project + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :file_path: app/controllers/projects_controller.rb + :code_smells: + - :method: ProjectsController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: ProjectsController#addUsers + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 55 + - :method: ProjectsController#addUsers + :message: has the name 'addUsers' + :type: UncommunicativeMethodName + :lines: + - 55 + - :method: ProjectsController#addUsers + :message: performs a nil-check + :type: NilCheck + :lines: + - 61 + - :method: ProjectsController#deleteUsers + :message: has approx 14 statements + :type: TooManyStatements + :lines: + - 78 + - :method: ProjectsController#deleteUsers + :message: has the name 'deleteUsers' + :type: UncommunicativeMethodName + :lines: + - 78 + - :method: ProjectsController#deleteUsers + :message: performs a nil-check + :type: NilCheck + :lines: + - 84 + - :method: ProjectsController#detail + :message: has approx 9 statements + :type: TooManyStatements + :lines: + - 103 + - :method: ProjectsController#detail + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 113 + - :method: ProjectsController#index + :message: has approx 10 statements + :type: TooManyStatements + :lines: + - 14 + - :method: ProjectsController#index + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 18 + - :method: ProjectsController#index + :message: has the variable name 'p' + :type: UncommunicativeVariableName + :lines: + - 20 + - :file_path: app/models/projects_user.rb + :code_smells: + - :method: Projects_user + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Projects_user#project_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 14 + - :method: Projects_user#user_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 23 + - :file_path: app/controllers/sessions_controller.rb + :code_smells: + - :method: SessionsController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :file_path: app/models/share.rb + :code_smells: + - :method: Share + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: Share#project_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 31 + - :method: Share#user_exists + :message: performs a nil-check + :type: NilCheck + :lines: + - 23 + - :file_path: app/controllers/shares_controller.rb + :code_smells: + - :method: SharesController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: SharesController#create + :message: has approx 11 statements + :type: TooManyStatements + :lines: + - 10 + - :method: SharesController#create + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 18 + - :method: SharesController#getShareList + :message: calls i.content 2 times + :type: DuplicateMethodCall + :lines: + - 37 + - 42 + - :method: SharesController#getShareList + :message: has approx 7 statements + :type: TooManyStatements + :lines: + - 31 + - :method: SharesController#getShareList + :message: has the name 'getShareList' + :type: UncommunicativeMethodName + :lines: + - 31 + - :method: SharesController#getShareList + :message: has the variable name 'i' + :type: UncommunicativeVariableName + :lines: + - 36 + - :method: SharesController#getShareList + :message: refers to i more than self + :type: FeatureEnvy + :lines: + - 31 + - :file_path: app/models/user.rb + :code_smells: + - :method: User + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :file_path: app/controllers/users_controller.rb + :code_smells: + - :method: UsersController + :message: has no descriptive comment + :type: IrresponsibleModule + :lines: + - 1 + - :method: UsersController#checkExist? + :message: doesn't depend on instance state + :type: UtilityFunction + :lines: + - 46 + - :method: UsersController#checkExist? + :message: has the name 'checkExist?' + :type: UncommunicativeMethodName + :lines: + - 46 + - :method: UsersController#emailExist + :message: has the name 'emailExist' + :type: UncommunicativeMethodName + :lines: + - 11 + - :method: UsersController#usernameExist + :message: has the name 'usernameExist' + :type: UncommunicativeMethodName + :lines: + - 19 +:rcov: + "./app/controllers/application_controller.rb": + :lines: + - :content: class ApplicationController < ActionController::Base + :was_run: 1 + - :content: " # Prevent CSRF attacks by raising an exception." + :was_run: + - :content: " # For APIs, you may want to use :null_session instead." + :was_run: + - :content: " protect_from_forgery with: :exception" + :was_run: 1 + - :content: " def authenticate" + :was_run: 1 + - :content: " render status: :unauthorized, nothing: true unless session['user_id']" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def current_user" + :was_run: 1 + - :content: " @current_user ||= User.find(session[:user_id]) if session[:user_id]" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " helper_method :current_user" + :was_run: 1 + - :content: end + :was_run: + :percent_run: 100 + :methods: + ApplicationController#authenticate: 0.0 + ApplicationController#current_user: 0.0 + "./app/controllers/missions_controller.rb": + :lines: + - :content: class MissionsController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :create," + :was_run: + - :content: " :getlist," + :was_run: + - :content: " :detail," + :was_run: + - :content: " :update," + :was_run: + - :content: " :commentPublish" + :was_run: + - :content: " ]" + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7o + jrflj5blvZPliY3pobnnm67mn5DnirbmgIHnmoTku7vliqHliJfooag= + :was_run: + - :content: " " + :was_run: + - :content: " def getlist" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " pid = params[:project_id]" + :was_run: 1 + - :content: " stu = params[:status_type]" + :was_run: 1 + - :content: " #missions = []" + :was_run: + - :content: " details = []" + :was_run: 1 + - :content: ' missions = Mission.where("project_id = ? AND status = ?",pid,stu).all' + :was_run: 1 + - :content: " " + :was_run: + - :content: " missions.each do |mission|" + :was_run: 1 + - :content: " " + :was_run: + - :content: " #puts mission.inspect" + :was_run: + - :content: " " + :was_run: + - :content: " details += [{" + :was_run: 1 + - :content: " :id => mission.id," + :was_run: + - :content: " :name => mission.name," + :was_run: + - :content: " :content => mission.content" + :was_run: + - :content: " }]" + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " # Mission.where(:project_id => pid).where(:status => stu) do + |i|" + :was_run: + - :content: " # missions += [{" + :was_run: + - :content: " # :id => i.id," + :was_run: + - :content: " # :name => i.name," + :was_run: + - :content: " # :content => i.content" + :was_run: + - :content: " # }]" + :was_run: + - :content: " # end" + :was_run: + - :content: " render :json => {" + :was_run: 1 + - :content: " :code => 0," + :was_run: + - :content: " :data => missions" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7o + jrflj5bku7vliqHor6bnu4bkv6Hmga8= + :was_run: + - :content: " " + :was_run: + - :content: " def detail" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " username = []" + :was_run: 1 + - :content: " comments_s = []" + :was_run: 1 + - :content: " mission_id = params[:id]" + :was_run: 1 + - :content: " mission = Mission.find_by(id: mission_id)" + :was_run: 1 + - :content: ' m_us = Missions_user.where("mission_id = ?",mission_id).all' + :was_run: 1 + - :content: " #puts m_us.inspect" + :was_run: + - :content: " m_us.each do |m_u|" + :was_run: 1 + - :content: " user_id = m_u.user_id" + :was_run: 0 + - :content: " user = User.find_by(id: user_id)" + :was_run: 0 + - :content: " #puts user.inspect" + :was_run: + - :content: " username << user.name" + :was_run: 0 + - :content: " end" + :was_run: + - :content: ' comments = Comment.where("mission_id = ?",mission_id).all' + :was_run: 1 + - :content: " comments.each do |c|" + :was_run: 1 + - :content: " uname = User.find_by(id: c.user_id).name" + :was_run: 1 + - :content: " comments_s += [{" + :was_run: 1 + - :content: " :nickname => uname," + :was_run: + - :content: " :content => c.content," + :was_run: + - :content: " :time => c.created_at" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " #puts comments_s.inspect" + :was_run: + - :content: " render :json => {" + :was_run: 1 + - :content: " :code => 0," + :was_run: + - :content: " :data => {" + :was_run: + - :content: " :name => mission.name," + :was_run: + - :content: " :content => mission.content," + :was_run: + - :content: " :priority => mission.priority," + :was_run: + - :content: " :status => mission.status," + :was_run: + - :content: " :deadline => mission.deadline," + :was_run: + - :content: " :users => username," + :was_run: + - :content: " :comments => comments_s" + :was_run: + - :content: " }" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: !binary |- + ICAgICAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+ + 5Yib5bu65Lu75Yqh + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " params_mission = {name: params[:name],project_id: params[:project_id],content: + params[:content],deadline: params[:deadline],priority: params[:priority],status: + params[:status]}" + :was_run: 1 + - :content: " mission = Mission.new(params_mission)" + :was_run: 1 + - :content: " if mission.save" + :was_run: 1 + - :content: " render :json => {:code => 0}" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json: mission.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " userids = params[:users]" + :was_run: 1 + - :content: " userids.each do |id|" + :was_run: 1 + - :content: " user_enties = User.find_by(id: id)" + :was_run: 1 + - :content: " #puts user_enties.inspect" + :was_run: + - :content: " params_mu = {mission_id: mission.id,user_id: user_enties.id}" + :was_run: 1 + - :content: " missions_user = Missions_user.new(params_mu)" + :was_run: 0 + - :content: " missions_user.save" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBjb250ZW50ID0gIuacieaWsOS7u+WKoSA8YT4iK21pc3Npb24u + bmFtZSsiPC9hPiI= + :was_run: 0 + - :content: " " + :was_run: + - :content: " params_note = {content: content,user_id: user_enties.id,category: + 3,project_id: mission.project_id}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7k + v67mlLnku7vliqHkv6Hmga8= + :was_run: + - :content: " " + :was_run: + - :content: " def update" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " " + :was_run: + - :content: " id = params[:id]" + :was_run: 0 + - :content: " #now = Datetime.now" + :was_run: + - :content: " mission = Mission.find_by(id: id)" + :was_run: 0 + - :content: " params_mission = {name: params[:name],content: params[:content],deadline: + params[:deadline],priority: params[:priority]}" + :was_run: 0 + - :content: " #puts params_mission" + :was_run: + - :content: " mission.update(params_mission)" + :was_run: 0 + - :content: " mission.save" + :was_run: 0 + - :content: ' Missions_user.delete_all(["mission_id = ?",id])' + :was_run: 0 + - :content: " userids = params[:users]" + :was_run: 0 + - :content: " userids.each do |name|" + :was_run: 0 + - :content: " user_enties = User.find_by(id: id)" + :was_run: 0 + - :content: " params = {mission_id: id,user_id: user_enties.id}" + :was_run: 0 + - :content: " missions_user = Missions_user.new(params)" + :was_run: 0 + - :content: " missions_user.save" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBjb250ZW50ID0gIjxhPiIrbWlzc2lvbi5uYW1lICsgIjwvYT4g + 5Lu75Yqh5L+h5oGv5Y+R55Sf5LqG5Y+Y5YyWIg== + :was_run: 0 + - :content: " " + :was_run: + - :content: " params_note = {content: content,user_id: user_enties.id,category: + 3,project_id: mission.project_id}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT7l + vZPliY3nlKjmiLflj5Hooajor4Torro= + :was_run: + - :content: " " + :was_run: + - :content: " def commentPublish" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " mission_id = params[:mission_id]" + :was_run: 1 + - :content: " content = params[:content]" + :was_run: 1 + - :content: " user_id = session[:user_id]" + :was_run: 1 + - :content: " params = {content: content, mission_id: mission_id, user_id: + user_id}" + :was_run: 1 + - :content: " comment = Comment.new(params)" + :was_run: 1 + - :content: " if comment.save" + :was_run: 1 + - :content: " render :json => {:code => 0}" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json: mission.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 59 + :methods: + MissionsController#getlist: 71.42857142857143 + MissionsController#detail: 40.0 + MissionsController#create: 27.27272727272727 + MissionsController#update: 25.0 + MissionsController#commentPublish: 12.5 + "./app/controllers/notes_controller.rb": + :lines: + - :content: class NotesController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " " + :was_run: + - :content: !binary |- + ICAgICPojrflj5bnlKjmiLflvZPliY3nmoTpgJrnn6XliJfooag= + :was_run: + - :content: " " + :was_run: + - :content: " def getNotesList" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " pid = params[:project_id]" + :was_run: 1 + - :content: " uid = session[:user_id]" + :was_run: 1 + - :content: ' notes = Note.where("user_id = ? AND project_id = ? ",uid,pid).order("created_at + desc").all' + :was_run: 1 + - :content: " note = Hash.new do |h,k|" + :was_run: 1 + - :content: " h[k] = []" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " notes.each do |n|" + :was_run: 1 + - :content: " date = n.created_at.to_s[/([\\d\\-]*)\\s(.*)/,1]" + :was_run: 1 + - :content: " time = n.created_at.to_s[/(.*)\\s([\\d\\:]*)/,2]" + :was_run: 1 + - :content: " note[date] << {" + :was_run: + - :content: " :content => n.content," + :was_run: + - :content: " :time => time," + :was_run: + - :content: " :type => n.category" + :was_run: + - :content: " }" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " data = []" + :was_run: 1 + - :content: " note.each do |k,v|" + :was_run: 1 + - :content: " data += [{" + :was_run: 1 + - :content: " :time => k," + :was_run: + - :content: " :notes => v" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " render :json => {" + :was_run: 1 + - :content: " :code => 0," + :was_run: + - :content: " :data => data" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + NotesController#getNotesList: 44.0 + "./app/controllers/projects_controller.rb": + :lines: + - :content: class ProjectsController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :index," + :was_run: + - :content: " :create," + :was_run: + - :content: " :addUsers," + :was_run: + - :content: " :detail," + :was_run: + - :content: " :update," + :was_run: + - :content: " :deleteUsers" + :was_run: + - :content: " ]" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6I635Y+W5oiR55qE6aG555uu5YiX6KGo77yMdXNlcl9pZOS/neWt + mOWcqHNlc3Npb27kuK0u + :was_run: + - :content: " def index" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " uid = session[:user_id]" + :was_run: 0 + - :content: " data=[]" + :was_run: 0 + - :content: " Projects_user.where(:user_id => uid).each do |i|" + :was_run: 0 + - :content: " pid=i.project_id" + :was_run: 0 + - :content: " p=Project.find_by(id:pid)" + :was_run: 0 + - :content: " mc = Mission.where(:project_id => pid).size" + :was_run: 0 + - :content: " uc = Projects_user.where(:project_id => pid).size" + :was_run: 0 + - :content: " sc = Share.where(:project_id => pid).size" + :was_run: 0 + - :content: " data+=[{" + :was_run: 0 + - :content: " :id => pid," + :was_run: + - :content: " :name => p.name," + :was_run: + - :content: " :content => p.content," + :was_run: + - :content: " :mission_count => mc," + :was_run: + - :content: " :users_count => uc," + :was_run: + - :content: " :shares_count => sc" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " render :json => {" + :was_run: 0 + - :content: " :code => 0," + :was_run: + - :content: " :data => data" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+5Yib5bu66aG555uu + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " uid = session[:user_id]" + :was_run: 1 + - :content: " project = Project.new(project_params)" + :was_run: 1 + - :content: " if project.save" + :was_run: 0 + - :content: " Projects_user.create(project_id:project.id,user_id:uid)" + :was_run: 0 + - :content: " render status: :created, nothing: true" + :was_run: 0 + - :content: " else" + :was_run: + - :content: " render json: project.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu5re75Yqg55So5oi3 + :was_run: + - :content: " " + :was_run: + - :content: " def addUsers" + :was_run: 1 + - :content: !binary |- + ICAgICAgICB1aWQgPSBVc2VyLmZpbmRfYnkoZW1haWw6cGFyYW1zWzplbWFp + bF0pLmlkIyDpnIDopoHmt7vliqDnmoTnlKjmiLc= + :was_run: 1 + - :content: !binary |- + ICAgICAgICByZWdpc3RlciA9IHNlc3Npb25bOnVzZXJfaWRdIyDlvZPliY3n + lKjmiLc= + :was_run: 0 + - :content: " pid = params[:project_id]" + :was_run: 0 + - :content: !binary |- + ICAgICAgICAjIOajgOafpeivpemhueebruS4reaYr+WQpuW3sue7j+acieim + gea3u+WKoOeahOeUqOaItw== + :was_run: + - :content: " pu_exist=Projects_user.find_by(project_id:pid,user_id:uid)" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBpZiBwdV9leGlzdC5uaWw/IyDkuI3lrZjlnKg= + :was_run: 0 + - :content: " params_pu = {project_id: pid,user_id: uid}" + :was_run: 0 + - :content: " pu = Projects_user.new(params_pu)" + :was_run: 0 + - :content: " pu.save" + :was_run: 0 + - :content: " " + :was_run: + - :content: !binary |- + ICAgICAgICAgICAgY29udGVudCA9ICI8YT4iK1VzZXIuZmluZF9ieShpZDog + cmVnaXN0ZXIpLm5hbWUgKyAiPC9hPiDpgoDor7fmgqjov5vlhaXpobnnm64g + PGE+IiArIFByb2plY3QuZmluZF9ieShpZDogcGlkKS5uYW1lKyI8L2E+Ig== + :was_run: 0 + - :content: " puts content" + :was_run: 0 + - :content: " params_note = {user_id: uid,content: content,category: + 2,project_id: pid}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save!" + :was_run: 0 + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBlbHNlIyDlrZjlnKg= + :was_run: + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu5Yig6Zmk55So5oi3 + :was_run: + - :content: " def deleteUsers" + :was_run: 1 + - :content: !binary |- + ICAgICAgICB1aWQgPSBwYXJhbXNbOnVzZXJfaWRdIyDpnIDopoHmt7vliqDn + moTnlKjmiLc= + :was_run: 0 + - :content: !binary |- + ICAgICAgICByZWdpc3RlciA9IHNlc3Npb25bOnVzZXJfaWRdIyDlvZPliY3n + lKjmiLc= + :was_run: 0 + - :content: " pid = params[:project_id]" + :was_run: 0 + - :content: !binary |- + ICAgICAgICAjIOajgOafpeivpemhueebruS4reaYr+WQpuW3sue7j+acieim + gea3u+WKoOeahOeUqOaItw== + :was_run: + - :content: " projects_user=Projects_user.find_by(project_id:pid,user_id:uid)" + :was_run: 0 + - :content: !binary |- + ICAgICAgICBpZiBwcm9qZWN0c191c2VyLm5pbD8jIOS4jeWtmOWcqA== + :was_run: 0 + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: !binary |- + ICAgICAgICAjIOWtmOWcqA== + :was_run: + - :content: " puts projects_user.user_id" + :was_run: 0 + - :content: " puts projects_user.project_id" + :was_run: 0 + - :content: " Projects_user.where(project_id:pid,user_id:uid).delete_all" + :was_run: 0 + - :content: " " + :was_run: + - :content: !binary |- + ICAgICAgICBjb250ZW50ID0iPGE+IisgVXNlci5maW5kX2J5KGlkOiByZWdp + c3RlcikubmFtZSArICI8L2E+IOaKiuaCqOS7jumhueebriA8YT4iICsgUHJv + amVjdC5maW5kX2J5KGlkOiBwaWQpLm5hbWUrIjwvYT4g5Lit5Yig6ZmkIg== + :was_run: 0 + - :content: " puts content" + :was_run: 0 + - :content: " params_note = {user_id: uid,content: content,category: 2,project_id: + pid}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save!" + :was_run: 0 + - :content: " " + :was_run: + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu6K+m5oOF + :was_run: + - :content: " " + :was_run: + - :content: " def detail" + :was_run: 1 + - :content: " #Todo " + :was_run: + - :content: " pid = params[:id]" + :was_run: 0 + - :content: " project = Project.find_by(id: pid)" + :was_run: 0 + - :content: " #uid = Projects_user.where(:project_id => pid)" + :was_run: + - :content: " users = []" + :was_run: 0 + - :content: ' projects_users = Projects_user.where("project_id = ?",pid).all' + :was_run: 0 + - :content: " " + :was_run: + - :content: " projects_users.each do |projects_user|" + :was_run: 0 + - :content: " uid = projects_user.user_id" + :was_run: 0 + - :content: " i = User.find_by(id: uid)" + :was_run: 0 + - :content: " users += [{" + :was_run: 0 + - :content: " :name => i.name," + :was_run: + - :content: " :id => i.id" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " #puts users.inspect " + :was_run: + - :content: " # Users.find(uid).each do |i|" + :was_run: + - :content: " # users += [{" + :was_run: + - :content: " # :nickname => i.name," + :was_run: + - :content: " # :id => i.id" + :was_run: + - :content: " # }]" + :was_run: + - :content: " # end" + :was_run: + - :content: " render :json => {" + :was_run: 0 + - :content: " :code => 0," + :was_run: + - :content: " :data => {" + :was_run: + - :content: " :name => project.name," + :was_run: + - :content: " :content => project.content," + :was_run: + - :content: " :users => users" + :was_run: + - :content: " }" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 + PT09PT0+6aG555uu5L+u5pS5 + :was_run: + - :content: " def update" + :was_run: 1 + - :content: " project = Project.find_by(:id => params[:project][:id])" + :was_run: 0 + - :content: " if project.update(project_params)" + :was_run: 0 + - :content: " render :json => {:code => 0}" + :was_run: 0 + - :content: " else" + :was_run: + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def project_params" + :was_run: 1 + - :content: " params.require(:project).permit(:name,:content,:id)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 21 + :methods: + ProjectsController#index: 45.0 + ProjectsController#create: 0.0 + ProjectsController#addUsers: 14.285714285714285 + ProjectsController#deleteUsers: 23.809523809523807 + ProjectsController#detail: 58.333333333333336 + ProjectsController#update: 0.0 + ProjectsController#project_params: 0.0 + "./app/controllers/sessions_controller.rb": + :lines: + - :content: class SessionsController < ApplicationController + :was_run: 1 + - :content: !binary |- + ICAjIOmZpOeZu+W9leS5i+Wklu+8jOWFtuS9meaOpeWPo+W/hemhu+WcqOeZ + u+W9leeKtuaAgeS4i+iuv+mXrg== + :was_run: + - :content: " before_action :authenticate, except: [ :create ]" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [:create,:destroy,:show]" + :was_run: 1 + - :content: " " + :was_run: + - :content: !binary |- + ICAjIOeUqOaIt+eZu+W9lQ== + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " user = User.find_by(email: params[:email])" + :was_run: 1 + - :content: " if user && user.authenticate(params[:password])" + :was_run: 1 + - :content: " session[:user_id] = user.id" + :was_run: 1 + - :content: " render status: :ok, text: 'ok'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render status: :unauthorized, text: 'account or password is + not correct'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def destroy" + :was_run: 1 + - :content: " session.delete :user_id" + :was_run: 1 + - :content: " @current_user &&= nil" + :was_run: 1 + - :content: " render status: :ok, nothing: true" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " def show" + :was_run: 1 + - :content: " render 'show'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + SessionsController#create: 0.0 + SessionsController#destroy: 0.0 + SessionsController#show: 0.0 + "./app/controllers/shares_controller.rb": + :lines: + - :content: class SharesController < ApplicationController + :was_run: 1 + - :content: " " + :was_run: + - :content: " before_action :authenticate" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :create," + :was_run: + - :content: " :getShareList" + :was_run: + - :content: " ]" + :was_run: + - :content: !binary |- + ICAgICPlvZPliY3nlKjmiLfliJvlu7rliIbkuqs= + :was_run: + - :content: " " + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " uid = session[:user_id].to_i" + :was_run: 1 + - :content: " share=Share.new(share_params)" + :was_run: 1 + - :content: " share.user_id=uid" + :was_run: 0 + - :content: " if share.save" + :was_run: 0 + - :content: !binary |- + ICAgICAgICAgICAgY29udGVudCA9ICI8YT4iK1VzZXIuZmluZCh1aWQpLm5h + bWUgKyAiPC9hPiDliIbkuqvkuobkuIDkupvkuosi + :was_run: 0 + - :content: " pid=share.project_id" + :was_run: 0 + - :content: " " + :was_run: + - :content: " Projects_user.where(:project_id => pid).each do |i|" + :was_run: 0 + - :content: " params_note = {user_id: i.user_id,content: content,category: + 1,project_id: pid}" + :was_run: 0 + - :content: " note = Note.new(params_note)" + :was_run: 0 + - :content: " note.save!" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " render status: :created, nothing: true" + :was_run: 0 + - :content: " else" + :was_run: + - :content: " render json: project.errors, status: :unprocessable_entity" + :was_run: 0 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICPojrflj5bpobnnm67nmoTliIbkuqvliJfooag= + :was_run: + - :content: " " + :was_run: + - :content: " def getShareList" + :was_run: 1 + - :content: " #Todo" + :was_run: + - :content: " pid = params[:project_id]" + :was_run: 0 + - :content: " " + :was_run: + - :content: " data = []" + :was_run: 0 + - :content: ' Share.where(:project_id => pid).order("created_at desc").each + do |i|' + :was_run: 0 + - :content: " puts i.content" + :was_run: 0 + - :content: " name = User.find(i.user_id).name" + :was_run: 0 + - :content: " data += [{" + :was_run: 0 + - :content: " :name => name," + :was_run: + - :content: " :time => i.created_at," + :was_run: + - :content: " :content => i.content" + :was_run: + - :content: " }]" + :was_run: + - :content: " end" + :was_run: + - :content: " render :json => {" + :was_run: 0 + - :content: " :code => 0," + :was_run: + - :content: " :data => data" + :was_run: + - :content: " }" + :was_run: + - :content: " end" + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def share_params" + :was_run: 1 + - :content: " params.require(:share).permit(:project_id,:content)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 37 + :methods: + SharesController#create: 0.0 + SharesController#getShareList: 46.666666666666664 + SharesController#share_params: 0.0 + "./app/controllers/users_controller.rb": + :lines: + - :content: class UsersController < ApplicationController + :was_run: 1 + - :content: " before_action :authenticate, except: [ :emailExist, :usernameExist, + :create ]" + :was_run: 1 + - :content: " skip_before_action :verify_authenticity_token, :only => [" + :was_run: 1 + - :content: " :emailExist," + :was_run: + - :content: " :usernameExist," + :was_run: + - :content: " :create," + :was_run: + - :content: " :update" + :was_run: + - :content: " ]" + :was_run: + - :content: " def emailExist" + :was_run: 1 + - :content: " if checkExist?(:email, params[:email])" + :was_run: 1 + - :content: " render :text => '1'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render :text => '0'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def usernameExist" + :was_run: 1 + - :content: " if checkExist?(:name, params[:username])" + :was_run: 1 + - :content: " render :text => 'exist'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render :text => 'not exist'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def create" + :was_run: 1 + - :content: " @user = User.new(user_params)" + :was_run: 1 + - :content: " if @user.save" + :was_run: 1 + - :content: " render status: :created, nothing: true" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json: @user.errors, status: :unprocessable_entity" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " def update" + :was_run: 1 + - :content: " @user = current_user" + :was_run: 1 + - :content: " if @user.update(user_params)" + :was_run: 1 + - :content: " render 'show'" + :was_run: 1 + - :content: " else" + :was_run: + - :content: " render json:current_user.errors, status: :unprocessable_entity" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " private" + :was_run: 1 + - :content: " def checkExist?(field_name, value)" + :was_run: 1 + - :content: " User.exists?(field_name => value)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " def user_params" + :was_run: 1 + - :content: " params.require(:user).permit(:name,:password, :password_confirmation, + :email, :phone)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + UsersController#emailExist: 0.0 + UsersController#usernameExist: 0.0 + UsersController#create: 0.0 + UsersController#update: 0.0 + UsersController#checkExist?: 0.0 + UsersController#user_params: 0.0 + "./app/models/comment.rb": + :lines: + - :content: class Comment < ActiveRecord::Base + :was_run: 1 + - :content: " " + :was_run: + - :content: " belongs_to :mission" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validates :content, presence: true" + :was_run: 1 + - :content: " validates :mission_id, presence: true" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validates :user_id, presence: true" + :was_run: 1 + - :content: " validate :comment_has_atleast_one_character, on: :create" + :was_run: 1 + - :content: " validate :user_id_exist, on: :create" + :was_run: 1 + - :content: " " + :was_run: + - :content: " private " + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " def comment_has_atleast_one_character" + :was_run: 1 + - :content: " tmp = content.strip" + :was_run: 1 + - :content: " if tmp.length < 1" + :was_run: 1 + - :content: " errors[:content] = 'content should has at least one + character'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " def user_id_exist" + :was_run: 1 + - :content: " " + :was_run: + - :content: " user = User.find_by(id: user_id)" + :was_run: 1 + - :content: " if user == nil" + :was_run: 1 + - :content: ' errors[:user] = "user is not exist"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: !binary |- + ICAgICAgICAjIG1pc3Npb24g5piv5ZCm5a2Y5Zyo55qE6aqM6K+B5bCG5pS+ + 5ZyoY29udHJvbGxlcuS4rei/m+ihjA== + :was_run: + - :content: " " + :was_run: + - :content: " # def mission_id_should_be_exist" + :was_run: + - :content: " " + :was_run: + - :content: " # @mission = Mission.find(:mission_id)" + :was_run: + - :content: " " + :was_run: + - :content: " # if @mission == nil" + :was_run: + - :content: ' # errors[:mission_id] = "mission is not exist"' + :was_run: + - :content: " # end" + :was_run: + - :content: " # end " + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + Comment#comment_has_atleast_one_character: 0.0 + Comment#user_id_exist: 25.0 + "./app/models/mission.rb": + :lines: + - :content: 'class Mission < ActiveRecord:: Base' + :was_run: 1 + - :content: " has_many :comments" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " validates :name, presence: true" + :was_run: 1 + - :content: " validates :deadline, presence: true" + :was_run: 1 + - :content: " validates :priority, presence: true" + :was_run: 1 + - :content: " validates :status, presence: true" + :was_run: 1 + - :content: " validates :content, presence: true" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validates :project_id, presence: true" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " validate :priority_is_among_valid_values" + :was_run: 1 + - :content: " validate :status_is_among_valid_values" + :was_run: 1 + - :content: " " + :was_run: + - :content: " validate :project_exists, on: :create" + :was_run: 1 + - :content: " " + :was_run: + - :content: " private " + :was_run: 1 + - :content: " " + :was_run: + - :content: " def priority_is_among_valid_values" + :was_run: 1 + - :content: " " + :was_run: + - :content: " if priority != 1 and priority != 2 and priority != 3" + :was_run: 1 + - :content: ' errors[:priority] = "priority is not among valid + values"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " def status_is_among_valid_values" + :was_run: 1 + - :content: " " + :was_run: + - :content: " if status != 1 and status != 2 and status != 3 and + status != 4" + :was_run: 1 + - :content: ' errors[:status] = "status is not among valid values"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " def project_exists" + :was_run: 1 + - :content: " #puts project_id" + :was_run: + - :content: " project = Project.find_by(id: project_id)" + :was_run: 1 + - :content: " #puts project.inspect" + :was_run: + - :content: " if project == nil" + :was_run: 1 + - :content: ' errors[:project_id] = "project_id is not exist"' + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: + Mission#priority_is_among_valid_values: 33.33333333333333 + Mission#status_is_among_valid_values: 33.33333333333333 + Mission#project_exists: 40.0 + "./app/models/missions_user.rb": + :lines: + - :content: 'class Missions_user 'username', :email => '1261138729@qq.com'," + :was_run: 1 + - :content: " :password => 'secret', :password_confirmation + => 'secret'," + :was_run: + - :content: " :more_field => 'test'} }" + :was_run: 1 + - :content: " it 'should throw exception without param[:user]' do" + :was_run: 1 + - :content: " expect {" + :was_run: 1 + - :content: " post :create" + :was_run: 1 + - :content: " }.to raise_error ActionController::ParameterMissing" + :was_run: + - :content: " end" + :was_run: + - :content: " it 'should not throw exception' do" + :was_run: 1 + - :content: " expect {" + :was_run: 1 + - :content: " post :create, user: data_to_send, other_param: 'test'" + :was_run: 1 + - :content: " }.to_not raise_error" + :was_run: + - :content: " end" + :was_run: + - :content: " it 'should not accept other params' do" + :was_run: 1 + - :content: " post :create, user: data_to_send" + :was_run: 1 + - :content: " user = assigns(:user)" + :was_run: 1 + - :content: " expect(user.has_attribute? :more_field).to eq false" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'PATCH #update' do" + :was_run: 1 + - :content: " context 'with valid attributes' do" + :was_run: 1 + - :content: " before :each do" + :was_run: 1 + - :content: !binary |- + ICAgICAgICAjIOWBh+iuvuW3sue7j+eZu+W9leS6hg== + :was_run: + - :content: " allow(controller).to receive(:authenticate){ true }" + :was_run: 1 + - :content: " allow(controller).to receive(:current_user).and_return(User.find + user_with_fixed_info.id)" + :was_run: 1 + - :content: " patch :update, user: valid_attributes, format: 'json'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'should located current user' do" + :was_run: 1 + - :content: " expect(assigns[:user]).to eq user_with_fixed_info" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'should render show' do" + :was_run: 1 + - :content: " expect(response).to render_template 'show'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " context 'with invalid attributes' do" + :was_run: 1 + - :content: " before :each do" + :was_run: 1 + - :content: !binary |- + ICAgICAgICAjIOWBh+iuvuW3sue7j+eZu+W9leS6hg== + :was_run: + - :content: " allow(controller).to receive(:authenticate){ true }" + :was_run: 1 + - :content: " allow(controller).to receive(:current_user).and_return(User.find + user_with_fixed_info.id)" + :was_run: 1 + - :content: " patch :update, user: invalid_attributes, format: 'json'" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not change current user' do" + :was_run: 1 + - :content: " expect(assigns[:user]).to eq user_with_fixed_info" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'should return error messages and error status' do" + :was_run: 1 + - :content: " error_message = JSON.parse response.body" + :was_run: 1 + - :content: " expect(error_message['email'].nil?).to be false" + :was_run: 1 + - :content: " expect(error_message['email']).not_to be_empty" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " it 'should login first' do" + :was_run: 1 + - :content: " patch :update, user:valid_attributes, format: 'json'" + :was_run: 1 + - :content: " expect(response).to have_http_status :unauthorized" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/comment_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Comment , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: " it 'has a valid comment' do" + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: ' params = {content:"good job",mission_id:123,user_id: user.id}' + :was_run: 1 + - :content: " expect(Comment.new(params)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "content should not be empty" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " params = {content: nil,mission_id: 123,user_id: user.id}" + :was_run: 1 + - :content: " expect(Comment.new(params)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "mission_id should not be empty" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: ' params = {content:"good job", mission_id: nil,user_id: user.id}' + :was_run: 1 + - :content: " expect(Comment.new(params)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "content should has at least one word " do' + :was_run: 1 + - :content: " comment_with_allspace = build(:comment_content_allspace)" + :was_run: 1 + - :content: " comment_with_allspace.validate" + :was_run: 1 + - :content: " expect(comment_with_allspace.errors[:content].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "user should be exist" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: ' params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: + 1,status: 2,content: "mission content",project_id: project.id}' + :was_run: 1 + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.save" + :was_run: 1 + - :content: " expect(mission).to be_valid" + :was_run: 1 + - :content: " expect(mission.errors[:project_id].size).to eq(0)" + :was_run: 1 + - :content: ' params = {content: "comment", mission_id: mission.id, user_id: + user.id}' + :was_run: 1 + - :content: " comment = Comment.new(params)" + :was_run: 1 + - :content: " expect(comment).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/mission_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Mission , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: " it 'has a valid mission' do" + :was_run: 1 + - :content: !binary |- + ICAgICAgcGFyYW1zID0ge25hbWU6ICJtaXNzaW9uMSIsY29udGVudDogIm1p + c3Npb24gY29udGVudCIsZGVhZGxpbmU6IjIwMTYtMTAtMTcgMTA6MDA6MDAi + LHByaW9yaXR5OjEsc3RhdHVzOiLov5vooYzkuK0ifQ== + :was_run: 1 + - :content: " " + :was_run: + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.validate" + :was_run: 1 + - :content: " expect(mission).to be_valid " + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'content should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_content_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'deadline should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_deadline_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'status should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_status_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'priority should not be nil' do" + :was_run: 1 + - :content: " expect(build(:no_priority_mission)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'priority is not among valid values' do" + :was_run: 1 + - :content: " mission = build(:priority_not_among_valid_values)" + :was_run: 1 + - :content: " mission.validate" + :was_run: 1 + - :content: " expect(mission.errors[:priority].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " it 'status is not among valid values' do" + :was_run: 1 + - :content: " mission = build(:status_not_among_valid_values)" + :was_run: 1 + - :content: " mission.validate" + :was_run: 1 + - :content: " expect(mission.errors[:status].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + - :content: "# require 'rails_helper'" + :was_run: + - :content: "# RSpec.describe Mission, type: :model do" + :was_run: + - :content: "# it 'has a valid mission' do" + :was_run: + - :content: "# expect(build(:project)).to be_valid" + :was_run: + - :content: "# end" + :was_run: + - :content: "# describe 'users test' do" + :was_run: + - :content: "# it 'has at least on user' do" + :was_run: + - :content: "# mission_with_no_user = build(:mission)" + :was_run: + - :content: "# mission_with_no_user.users = []" + :was_run: + - :content: "# mission_with_no_user.valid?" + :was_run: + - :content: "# expect(mission_with_no_user.errors[:users].size).to eq(1)" + :was_run: + - :content: "# end" + :was_run: + - :content: "# end" + :was_run: + - :content: "# describe 'name test' do" + :was_run: + - :content: "# it 'does not allow absence of name' do" + :was_run: + - :content: "# expect(build(:mission, name: nil)).to_not be_valid" + :was_run: + - :content: "# end" + :was_run: + - :content: "# it 'length of name in [1,20]' do" + :was_run: + - :content: "# expect(build(:mission_name_length_gt_20)).to_not be_valid" + :was_run: + - :content: "# end" + :was_run: + - :content: "# end" + :was_run: + - :content: "# end" + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/missions_user_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Missions_user , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' it "mission should exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: ' params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: + 1,status: 2,content: "mission content",project_id: project.id}' + :was_run: 1 + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.save" + :was_run: 1 + - :content: " expect(mission).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " params = {mission_id: 5,user_id: user.id}" + :was_run: 1 + - :content: " missions_user = Missions_user.new(params)" + :was_run: 1 + - :content: " missions_user.save" + :was_run: 1 + - :content: " expect(missions_user).to_not be_valid" + :was_run: 1 + - :content: " expect(missions_user.errors[:mission].size).to eq(1)" + :was_run: 1 + - :content: " expect(Missions_user.find_by(user_id: user.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "user should exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: ' params = {name: "mission",deadline: "2016-10-17 10:00:00",priority: + 1,status: 2,content: "mission content",project_id: project.id}' + :was_run: 1 + - :content: " mission = Mission.new(params)" + :was_run: 1 + - :content: " mission.save" + :was_run: 1 + - :content: " expect(mission).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " params = {mission_id: mission.id,user_id: 2}" + :was_run: 1 + - :content: " missions_user = Missions_user.new(params)" + :was_run: 1 + - :content: " missions_user.save" + :was_run: 1 + - :content: " #puts missions_user.inspect" + :was_run: + - :content: " expect(missions_user).to_not be_valid" + :was_run: 1 + - :content: " expect(missions_user.errors[:user].size).to eq(1)" + :was_run: 1 + - :content: " expect(Missions_user.find_by(mission_id: mission.id)).to + eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/note_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Note , type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' it "has a valid note" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "note content",user_id: user.id,project_id: + project.id,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "notes content should at least has one character" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: " ",user_id: user.id,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note.errors[:content].size).to eq(2)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "category should be among valid values" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: ' params = {content: " ",user_id: user.id,category: 4}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note.errors[:category].size).to eq(1)" + :was_run: 1 + - :content: " expect(note).to_not be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "notes user should be exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "note content",user_id: user.id,project_id: + 5,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note).to_not be_valid" + :was_run: 1 + - :content: " expect(note.errors[:project].size).to eq(1)" + :was_run: 1 + - :content: " expect(Note.find_by(project_id: 5)).to eq(nil)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "notes project should be exist" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "note content",user_id: 5,project_id: + project.id,category: 1}' + :was_run: 1 + - :content: " note = Note.new(params)" + :was_run: 1 + - :content: " note.save" + :was_run: 1 + - :content: " expect(note).to_not be_valid" + :was_run: 1 + - :content: " expect(note.errors[:user].size).to eq(1)" + :was_run: 1 + - :content: " expect(Note.find_by(user_id: 5)).to eq(nil)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/project_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Project, type: :model do' + :was_run: 1 + - :content: " it 'has a valid factory' do" + :was_run: 1 + - :content: " expect(build(:project)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " describe 'users test' do" + :was_run: 1 + - :content: " it 'has at least on user' do" + :was_run: 1 + - :content: " project_with_no_user = build(:project)" + :was_run: 1 + - :content: " project_with_no_user.users = []" + :was_run: 1 + - :content: " project_with_no_user.valid?" + :was_run: 1 + - :content: " expect(project_with_no_user.errors[:users].size).to eq(1)" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'name test' do" + :was_run: 1 + - :content: " it 'does not allow absence of name' do" + :was_run: 1 + - :content: " expect(build(:project, name: nil)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'length of name in [1,20]' do" + :was_run: 1 + - :content: " expect(build(:project_name_length_gt_20)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow duplicate name' do" + :was_run: 1 + - :content: " create(:project, name: 'project1')" + :was_run: 1 + - :content: " expect(build(:project, name: 'project1')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/share_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe Share, type: :model do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' it "its a valid share" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403488@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "share content",project_id: project.id,user_id: + user.id}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to be_valid" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to_not eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "share content should have at least one character" do' + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: " ",project_id: project.id,user_id: + user.id}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to_not be_valid" + :was_run: 1 + - :content: " expect(share.errors[:content].size).to eq(2)" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "share''s project should be exist" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "share content",project_id: 5,user_id: + user.id}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to_not be_valid" + :was_run: 1 + - :content: " expect(share.errors[:project].size).to eq(1)" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: ' it "share''s user should be exist" do' + :was_run: 1 + - :content: ' params = {name: "jaxon",email: "370403444@qq.com",password_digest: + "123456",phone: "15652336366"}' + :was_run: 1 + - :content: " user = User.new(params)" + :was_run: 1 + - :content: " user.save" + :was_run: 1 + - :content: " expect(user).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {name: "project_1",content: "project content"}' + :was_run: 1 + - :content: " project = Project.new(params)" + :was_run: 1 + - :content: " project.users << user" + :was_run: 1 + - :content: " project.save" + :was_run: 1 + - :content: " expect(project).to be_valid" + :was_run: 1 + - :content: " " + :was_run: + - :content: ' params = {content: "share content",project_id: project.id,user_id: + 10}' + :was_run: 1 + - :content: " share = Share.new(params)" + :was_run: 1 + - :content: " share.save" + :was_run: 1 + - :content: " expect(share).to_not be_valid" + :was_run: 1 + - :content: " expect(share.errors[:user].size).to eq(1)" + :was_run: 1 + - :content: " expect(Share.find_by(id: share.id)).to eq(nil)" + :was_run: 1 + - :content: " " + :was_run: + - :content: " end" + :was_run: + - :content: " " + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + "./spec/models/user_spec.rb": + :lines: + - :content: require 'rails_helper' + :was_run: 1 + - :content: 'RSpec.describe User, type: :model do' + :was_run: 1 + - :content: " it 'has a valid factory' do" + :was_run: 1 + - :content: " expect(build(:user)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " describe 'username test' do" + :was_run: 1 + - :content: " it 'does not allow absence of username' do" + :was_run: 1 + - :content: " expect(build(:user, name: nil)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow name length > 30' do" + :was_run: 1 + - :content: " expect(build(:user_name_length_gt_30)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'email test' do" + :was_run: 1 + - :content: " it 'does not allow absence of email' do" + :was_run: 1 + - :content: " expect(build(:user, email: nil)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow email length > 50' do" + :was_run: 1 + - :content: " expect(build(:user_email_length_gt_50)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'email should match /\\A([^@\\s]+)@((?:[-a-z0-9]+\\.)+[a-z]{2,})\\Z/i' + do" + :was_run: 1 + - :content: " expect(build(:user, email: '123qq.com')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '@qq.com')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '123@qq')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '123@.com')).not_to be_valid" + :was_run: 1 + - :content: " expect(build(:user, email: '123@qq.')).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'password test' do" + :was_run: 1 + - :content: " it 'does not allow password length < 6' do" + :was_run: 1 + - :content: " expect(build(:user_password_length_lt_6)).not_to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'password_confirmation should match password when password_confirmation + not nil' do" + :was_run: 1 + - :content: " expect(build(:user, password: '123456', password_confirmation: + '654321')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'do not trigger match when password_confirmation nil' do" + :was_run: 1 + - :content: " expect(build(:user, password: '123456', password_confirmation: + nil)).to be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow password absence on create' do" + :was_run: 1 + - :content: " expect(build(:user, password: nil, password_confirmation: nil)).to_not + be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'can authenticate' do" + :was_run: 1 + - :content: " user = create(:user, password: '123456', password_confirmation: + '123456')" + :was_run: 1 + - :content: " expect(user.authenticate('123456')).to be_instance_of User" + :was_run: 1 + - :content: " expect(user.authenticate('654312')).to be false" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: " describe 'phone test' do" + :was_run: 1 + - :content: " it 'does not allow phone absence' do" + :was_run: 1 + - :content: " expect(build(:user, phone: nil)).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow character other than number' do" + :was_run: 1 + - :content: " expect(build(:user, phone: '1371234567a')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " it 'does not allow phone longer or shorter than 11' do" + :was_run: 1 + - :content: " expect(build(:user, phone: '137123456789')).to_not be_valid" + :was_run: 1 + - :content: " expect(build(:user, phone: '1371234567')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: !binary |- + ICAgICMg6ZiyanPms6jlhaU= + :was_run: + - :content: " it 'does not allow multiline' do" + :was_run: 1 + - :content: " expect(build(:user, phone: '13712345\\n78')).to_not be_valid" + :was_run: 1 + - :content: " end" + :was_run: + - :content: " end" + :was_run: + - :content: end + :was_run: + :percent_run: 100 + :methods: {} + :global_percent_run: 87.1 +:hotspots: + files: + - location: + class_name: + method_name: + file_path: "./app/controllers/notes_controller.rb" + file_name: "./app/controllers/notes_controller.rb" + line_number: + hash_key: '["./app/controllers/notes_controller.rb", nil, nil]' + details: + rcov: uncovered code is 44.0% + - location: + class_name: + method_name: + file_path: "./app/models/mission.rb" + file_name: "./app/models/mission.rb" + line_number: + hash_key: '["./app/models/mission.rb", nil, nil]' + details: + saikuro: average complexity is 2.0 + rcov: average uncovered code is 35.6% + - location: + class_name: + method_name: + file_path: "./app/controllers/missions_controller.rb" + file_name: "./app/controllers/missions_controller.rb" + line_number: + hash_key: '["./app/controllers/missions_controller.rb", nil, nil]' + details: + rcov: average uncovered code is 35.2% + - location: + class_name: + method_name: + file_path: "./app/models/missions_user.rb" + file_name: "./app/models/missions_user.rb" + line_number: + hash_key: '["./app/models/missions_user.rb", nil, nil]' + details: + rcov: average uncovered code is 25.0% + - location: + class_name: + method_name: + file_path: "./app/models/note.rb" + file_name: "./app/models/note.rb" + line_number: + hash_key: '["./app/models/note.rb", nil, nil]' + details: + saikuro: average complexity is 2.0 + rcov: average uncovered code is 20.8% + - location: + class_name: + method_name: + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", nil, nil]' + details: + saikuro: average complexity is 1.7 + rcov: average uncovered code is 20.2% + - location: + class_name: + method_name: + file_path: "./app/models/share.rb" + file_name: "./app/models/share.rb" + line_number: + hash_key: '["./app/models/share.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: average uncovered code is 16.7% + - location: + class_name: + method_name: + file_path: "./app/controllers/shares_controller.rb" + file_name: "./app/controllers/shares_controller.rb" + line_number: + hash_key: '["./app/controllers/shares_controller.rb", nil, nil]' + details: + saikuro: complexity is 1.0 + rcov: average uncovered code is 15.6% + - location: + class_name: + method_name: + file_path: "./app/models/comment.rb" + file_name: "./app/models/comment.rb" + line_number: + hash_key: '["./app/models/comment.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: average uncovered code is 12.5% + - location: + class_name: + method_name: + file_path: app/controllers/notes_controller.rb + file_name: app/controllers/notes_controller.rb + line_number: + hash_key: '["app/controllers/notes_controller.rb", nil, nil]' + details: + saikuro: complexity is 4.0 + roodi: found 2 design problems + reek: found 10 code smells + - location: + class_name: + method_name: + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", nil, nil]' + details: + flay: found 1 code duplications + churn: detected high level of churn (changed 16 times) + saikuro: average complexity is 2.0 + roodi: found 3 design problems + reek: found 12 code smells + - location: + class_name: + method_name: + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", nil, nil]' + details: + saikuro: average complexity is 2.4 + roodi: found 4 design problems + reek: found 11 code smells + - location: + class_name: + method_name: + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 2.0 + roodi: found 1 design problems + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", nil, nil]' + details: + flay: found 2 code duplications + saikuro: average complexity is 2.0 + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", nil, nil]' + details: + saikuro: average complexity is 2.5 + roodi: found 1 design problems + reek: found 8 code smells + - location: + class_name: + method_name: + file_path: app/models/mission.rb + file_name: app/models/mission.rb + line_number: + hash_key: '["app/models/mission.rb", nil, nil]' + details: + flay: found 2 code duplications + saikuro: complexity is 2.0 + reek: found 2 code smells + - location: + class_name: + method_name: + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 2.0 + roodi: found 1 design problems + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 1.7 + roodi: found 3 design problems + reek: found 5 code smells + - location: + class_name: + method_name: + file_path: app/models/comment.rb + file_name: app/models/comment.rb + line_number: + hash_key: '["app/models/comment.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: complexity is 2.0 + reek: found 1 code smells + - location: + class_name: + method_name: + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", nil, nil]' + details: + flay: found 1 code duplications + saikuro: average complexity is 2.0 + reek: found 3 code smells + - location: + class_name: + method_name: + file_path: app/controllers/application_controller.rb + file_name: app/controllers/application_controller.rb + line_number: + hash_key: '["app/controllers/application_controller.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + - location: + class_name: + method_name: + file_path: "./app/controllers/application_controller.rb" + file_name: "./app/controllers/application_controller.rb" + line_number: + hash_key: '["./app/controllers/application_controller.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: average uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: "./app/models/project.rb" + file_name: "./app/models/project.rb" + line_number: + hash_key: '["./app/models/project.rb", nil, nil]' + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", nil, nil]' + details: + saikuro: average complexity is 1.7 + rcov: average uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", nil, nil]' + details: + saikuro: average complexity is 1.3 + rcov: average uncovered code is 0.0% + - location: + class_name: + method_name: + file_path: db/schema.rb + file_name: db/schema.rb + line_number: + hash_key: '["db/schema.rb", nil, nil]' + details: + churn: detected high level of churn (changed 12 times) + - location: + class_name: + method_name: + file_path: app/models/project.rb + file_name: app/models/project.rb + line_number: + hash_key: '["app/models/project.rb", nil, nil]' + details: + reek: found 1 code smells + - location: + class_name: + method_name: + file_path: app/controllers/sessions_controller.rb + file_name: app/controllers/sessions_controller.rb + line_number: + hash_key: '["app/controllers/sessions_controller.rb", nil, nil]' + details: + reek: found 1 code smells + - location: + class_name: + method_name: + file_path: app/models/user.rb + file_name: app/models/user.rb + line_number: + hash_key: '["app/models/user.rb", nil, nil]' + details: + reek: found 1 code smells + classes: + - location: + class_name: NotesController + method_name: + file_path: app/controllers/notes_controller.rb + file_name: app/controllers/notes_controller.rb + line_number: + hash_key: '["app/controllers/notes_controller.rb", "NotesController", nil]' + details: + saikuro: complexity is 4.0 + reek: found 10 code smells + rcov: uncovered code is 44.0% + - location: + class_name: MissionsController + method_name: + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + nil]' + details: + saikuro: average complexity is 2.4 + reek: found 11 code smells + rcov: average uncovered code is 35.2% + - location: + class_name: Mission + method_name: + file_path: app/models/mission.rb + file_name: app/models/mission.rb + line_number: + hash_key: '["app/models/mission.rb", "Mission", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 2 code smells + rcov: average uncovered code is 35.6% + - location: + class_name: Missions_user + method_name: + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", "Missions_user", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + rcov: average uncovered code is 25.0% + - location: + class_name: Note + method_name: + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", "Note", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + rcov: average uncovered code is 20.8% + - location: + class_name: ProjectsController + method_name: + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + nil]' + details: + saikuro: average complexity is 1.9 + reek: found 12 code smells + rcov: average uncovered code is 20.2% + - location: + class_name: Share + method_name: + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", "Share", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + rcov: average uncovered code is 16.7% + - location: + class_name: SharesController + method_name: + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", "SharesController", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 8 code smells + rcov: average uncovered code is 15.6% + - location: + class_name: Comment + method_name: + file_path: app/models/comment.rb + file_name: app/models/comment.rb + line_number: + hash_key: '["app/models/comment.rb", "Comment", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 1 code smells + rcov: average uncovered code is 12.5% + - location: + class_name: Projects_user + method_name: + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", "Projects_user", nil]' + details: + saikuro: average complexity is 2.0 + reek: found 3 code smells + - location: + class_name: UsersController + method_name: + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", nil]' + details: + saikuro: average complexity is 1.7 + reek: found 5 code smells + rcov: average uncovered code is 0.0% + - location: + class_name: ApplicationController + method_name: + file_path: app/controllers/application_controller.rb + file_name: app/controllers/application_controller.rb + line_number: + hash_key: '["app/controllers/application_controller.rb", "ApplicationController", + nil]' + details: + saikuro: average complexity is 2.0 + reek: found 2 code smells + rcov: average uncovered code is 0.0% + - location: + class_name: Project + method_name: + file_path: "./app/models/project.rb" + file_name: "./app/models/project.rb" + line_number: + hash_key: '["./app/models/project.rb", "Project", nil]' + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + nil]' + details: + saikuro: average complexity is 1.3 + reek: found 1 code smells + rcov: average uncovered code is 0.0% + - location: + class_name: User + method_name: + file_path: app/models/user.rb + file_name: app/models/user.rb + line_number: + hash_key: '["app/models/user.rb", "User", nil]' + details: + reek: found 1 code smells + methods: + - location: + class_name: MissionsController + method_name: MissionsController#getlist + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#getlist"]' + simple_method_name: "#getlist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 71.4% + - location: + class_name: ProjectsController + method_name: ProjectsController#detail + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#detail"]' + simple_method_name: "#detail" + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + rcov: uncovered code is 58.3% + - location: + class_name: SharesController + method_name: SharesController#getShareList + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", "SharesController", "SharesController#getShareList"]' + simple_method_name: "#getShareList" + details: + saikuro: complexity is 2.0 + reek: found 5 code smells + rcov: uncovered code is 46.7% + - location: + class_name: NotesController + method_name: NotesController#getNotesList + file_path: app/controllers/notes_controller.rb + file_name: app/controllers/notes_controller.rb + line_number: + hash_key: '["app/controllers/notes_controller.rb", "NotesController", "NotesController#getNotesList"]' + simple_method_name: "#getNotesList" + details: + saikuro: complexity is 4.0 + reek: found 9 code smells + rcov: uncovered code is 44.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#index + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#index"]' + simple_method_name: "#index" + details: + saikuro: complexity is 2.0 + reek: found 3 code smells + rcov: uncovered code is 45.0% + - location: + class_name: MissionsController + method_name: MissionsController#detail + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#detail"]' + simple_method_name: "#detail" + details: + saikuro: complexity is 3.0 + reek: found 3 code smells + rcov: uncovered code is 40.0% + - location: + class_name: Mission + method_name: Mission#project_exists + file_path: app/models/mission.rb + file_name: app/models/mission.rb + line_number: + hash_key: '["app/models/mission.rb", "Mission", "Mission#project_exists"]' + simple_method_name: "#project_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 40.0% + - location: + class_name: Note + method_name: Note#note_category_should_among_valid_values + file_path: "./app/models/note.rb" + file_name: "./app/models/note.rb" + line_number: + hash_key: '["./app/models/note.rb", "Note", "Note#note_category_should_among_valid_values"]' + simple_method_name: "#note_category_should_among_valid_values" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 33.3% + - location: + class_name: Mission + method_name: Mission#status_is_among_valid_values + file_path: "./app/models/mission.rb" + file_name: "./app/models/mission.rb" + line_number: + hash_key: '["./app/models/mission.rb", "Mission", "Mission#status_is_among_valid_values"]' + simple_method_name: "#status_is_among_valid_values" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 33.3% + - location: + class_name: Mission + method_name: Mission#priority_is_among_valid_values + file_path: "./app/models/mission.rb" + file_name: "./app/models/mission.rb" + line_number: + hash_key: '["./app/models/mission.rb", "Mission", "Mission#priority_is_among_valid_values"]' + simple_method_name: "#priority_is_among_valid_values" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 33.3% + - location: + class_name: MissionsController + method_name: MissionsController#create + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 3.0 + reek: found 2 code smells + rcov: uncovered code is 27.3% + - location: + class_name: MissionsController + method_name: MissionsController#update + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#update"]' + simple_method_name: "#update" + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Comment + method_name: Comment#user_id_exist + file_path: app/models/comment.rb + file_name: app/models/comment.rb + line_number: + hash_key: '["app/models/comment.rb", "Comment", "Comment#user_id_exist"]' + simple_method_name: "#user_id_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Missions_user + method_name: Missions_user#mission_exist + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", "Missions_user", "Missions_user#mission_exist"]' + simple_method_name: "#mission_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Missions_user + method_name: Missions_user#user_exist + file_path: app/models/missions_user.rb + file_name: app/models/missions_user.rb + line_number: + hash_key: '["app/models/missions_user.rb", "Missions_user", "Missions_user#user_exist"]' + simple_method_name: "#user_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Note + method_name: Note#project_exist + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", "Note", "Note#project_exist"]' + simple_method_name: "#project_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Note + method_name: Note#user_exist + file_path: app/models/note.rb + file_name: app/models/note.rb + line_number: + hash_key: '["app/models/note.rb", "Note", "Note#user_exist"]' + simple_method_name: "#user_exist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Share + method_name: Share#project_exists + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", "Share", "Share#project_exists"]' + simple_method_name: "#project_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: Share + method_name: Share#user_exists + file_path: app/models/share.rb + file_name: app/models/share.rb + line_number: + hash_key: '["app/models/share.rb", "Share", "Share#user_exists"]' + simple_method_name: "#user_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 25.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#deleteUsers + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#deleteUsers"]' + simple_method_name: "#deleteUsers" + details: + saikuro: complexity is 2.0 + reek: found 3 code smells + rcov: uncovered code is 23.8% + - location: + class_name: ProjectsController + method_name: ProjectsController#addUsers + file_path: app/controllers/projects_controller.rb + file_name: app/controllers/projects_controller.rb + line_number: + hash_key: '["app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#addUsers"]' + simple_method_name: "#addUsers" + details: + saikuro: complexity is 2.0 + reek: found 3 code smells + rcov: uncovered code is 14.3% + - location: + class_name: MissionsController + method_name: MissionsController#commentPublish + file_path: app/controllers/missions_controller.rb + file_name: app/controllers/missions_controller.rb + line_number: + hash_key: '["app/controllers/missions_controller.rb", "MissionsController", + "MissionsController#commentPublish"]' + simple_method_name: "#commentPublish" + details: + saikuro: complexity is 2.0 + reek: found 2 code smells + rcov: uncovered code is 12.5% + - location: + class_name: SharesController + method_name: SharesController#create + file_path: app/controllers/shares_controller.rb + file_name: app/controllers/shares_controller.rb + line_number: + hash_key: '["app/controllers/shares_controller.rb", "SharesController", "SharesController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 3.0 + reek: found 2 code smells + rcov: uncovered code is 0.0% + - location: + class_name: ApplicationController + method_name: ApplicationController#current_user + file_path: app/controllers/application_controller.rb + file_name: app/controllers/application_controller.rb + line_number: + hash_key: '["app/controllers/application_controller.rb", "ApplicationController", + "ApplicationController#current_user"]' + simple_method_name: "#current_user" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: Projects_user + method_name: Projects_user#project_exists + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", "Projects_user", "Projects_user#project_exists"]' + simple_method_name: "#project_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + - location: + class_name: Projects_user + method_name: Projects_user#user_exists + file_path: app/models/projects_user.rb + file_name: app/models/projects_user.rb + line_number: + hash_key: '["app/models/projects_user.rb", "Projects_user", "Projects_user#user_exists"]' + simple_method_name: "#user_exists" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + - location: + class_name: UsersController + method_name: UsersController#emailExist + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", "UsersController", "UsersController#emailExist"]' + simple_method_name: "#emailExist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#update + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#update"]' + simple_method_name: "#update" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#create + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#update + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", "UsersController#update"]' + simple_method_name: "#update" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#create + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", "UsersController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#usernameExist + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", "UsersController", "UsersController#usernameExist"]' + simple_method_name: "#usernameExist" + details: + saikuro: complexity is 2.0 + reek: found 1 code smells + rcov: uncovered code is 0.0% + - location: + class_name: Note + method_name: Note#note_has_atleast_one_character + file_path: "./app/models/note.rb" + file_name: "./app/models/note.rb" + line_number: + hash_key: '["./app/models/note.rb", "Note", "Note#note_has_atleast_one_character"]' + simple_method_name: "#note_has_atleast_one_character" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: Share + method_name: Share#share_has_atleast_one_character + file_path: "./app/models/share.rb" + file_name: "./app/models/share.rb" + line_number: + hash_key: '["./app/models/share.rb", "Share", "Share#share_has_atleast_one_character"]' + simple_method_name: "#share_has_atleast_one_character" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: SessionsController#create + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + "SessionsController#create"]' + simple_method_name: "#create" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: ApplicationController + method_name: ApplicationController#authenticate + file_path: "./app/controllers/application_controller.rb" + file_name: "./app/controllers/application_controller.rb" + line_number: + hash_key: '["./app/controllers/application_controller.rb", "ApplicationController", + "ApplicationController#authenticate"]' + simple_method_name: "#authenticate" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: Comment + method_name: Comment#comment_has_atleast_one_character + file_path: "./app/models/comment.rb" + file_name: "./app/models/comment.rb" + line_number: + hash_key: '["./app/models/comment.rb", "Comment", "Comment#comment_has_atleast_one_character"]' + simple_method_name: "#comment_has_atleast_one_character" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: Project + method_name: Project#require_at_least_on_user + file_path: "./app/models/project.rb" + file_name: "./app/models/project.rb" + line_number: + hash_key: '["./app/models/project.rb", "Project", "Project#require_at_least_on_user"]' + simple_method_name: "#require_at_least_on_user" + details: + saikuro: complexity is 2.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#checkExist? + file_path: app/controllers/users_controller.rb + file_name: app/controllers/users_controller.rb + line_number: + hash_key: '["app/controllers/users_controller.rb", "UsersController", "UsersController#checkExist?"]' + simple_method_name: "#checkExist?" + details: + saikuro: complexity is 1.0 + reek: found 2 code smells + rcov: uncovered code is 0.0% + - location: + class_name: ProjectsController + method_name: ProjectsController#project_params + file_path: "./app/controllers/projects_controller.rb" + file_name: "./app/controllers/projects_controller.rb" + line_number: + hash_key: '["./app/controllers/projects_controller.rb", "ProjectsController", + "ProjectsController#project_params"]' + simple_method_name: "#project_params" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: UsersController + method_name: UsersController#user_params + file_path: "./app/controllers/users_controller.rb" + file_name: "./app/controllers/users_controller.rb" + line_number: + hash_key: '["./app/controllers/users_controller.rb", "UsersController", "UsersController#user_params"]' + simple_method_name: "#user_params" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: SharesController + method_name: SharesController#share_params + file_path: "./app/controllers/shares_controller.rb" + file_name: "./app/controllers/shares_controller.rb" + line_number: + hash_key: '["./app/controllers/shares_controller.rb", "SharesController", "SharesController#share_params"]' + simple_method_name: "#share_params" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: SessionsController#show + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + "SessionsController#show"]' + simple_method_name: "#show" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% + - location: + class_name: SessionsController + method_name: SessionsController#destroy + file_path: "./app/controllers/sessions_controller.rb" + file_name: "./app/controllers/sessions_controller.rb" + line_number: + hash_key: '["./app/controllers/sessions_controller.rb", "SessionsController", + "SessionsController#destroy"]' + simple_method_name: "#destroy" + details: + saikuro: complexity is 1.0 + rcov: uncovered code is 0.0% diff --git a/reports/metric_fu/scratch/churn/cf527d9087ce9d29318206d328847a9cee1ad1ba.json b/reports/metric_fu/scratch/churn/cf527d9087ce9d29318206d328847a9cee1ad1ba.json new file mode 100644 index 0000000..4a89272 --- /dev/null +++ b/reports/metric_fu/scratch/churn/cf527d9087ce9d29318206d328847a9cee1ad1ba.json @@ -0,0 +1 @@ +{"churn":{"changes":[{"file_path":"app/controllers/projects_controller.rb","times_changed":16},{"file_path":"db/schema.rb","times_changed":11}],"class_churn":[{"klass":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController"},"times_changed":1}],"method_churn":[{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#detail"},"times_changed":1},{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#create"},"times_changed":1},{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#update"},"times_changed":1},{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#commentPublish"},"times_changed":1}],"changed_files":["app/controllers/missions_controller.rb","config/routes.rb","public/pages/inform.html","public/pages/task.html"],"changed_classes":[{"file":"app/controllers/missions_controller.rb","klass":"MissionsController"}],"changed_methods":[{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#detail"},{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#create"},{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#update"},{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#commentPublish"}]}} \ No newline at end of file diff --git a/reports/metric_fu/scratch/churn/ef6d8fda9b061141447ab6b39d744586a53406d0.json b/reports/metric_fu/scratch/churn/ef6d8fda9b061141447ab6b39d744586a53406d0.json new file mode 100644 index 0000000..5a90eb2 --- /dev/null +++ b/reports/metric_fu/scratch/churn/ef6d8fda9b061141447ab6b39d744586a53406d0.json @@ -0,0 +1 @@ +{"churn":{"changes":[{"file_path":"app/controllers/projects_controller.rb","times_changed":16},{"file_path":"db/schema.rb","times_changed":12}],"class_churn":[{"klass":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController"},"times_changed":1}],"method_churn":[{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#detail"},"times_changed":1},{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#create"},"times_changed":1},{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#update"},"times_changed":1},{"method":{"file":"app/controllers/missions_controller.rb","klass":"MissionsController","method":"MissionsController#commentPublish"},"times_changed":1}],"changed_files":[".gitignore",".metrics","Gemfile","db/schema.rb","spec/controllers/sessions_controller_spec.rb","spec/controllers/users_controller_spec.rb","spec/models/user_spec.rb"],"changed_classes":[],"changed_methods":[]}} \ No newline at end of file