diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 00000000000..41eb523bf62 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,31 @@ +--- +engines: + brakeman: + enabled: true + bundler-audit: + enabled: true + duplication: + enabled: true + config: + languages: + - ruby + - javascript + eslint: + enabled: true + fixme: + enabled: true + rubocop: + enabled: true +ratings: + paths: + - Gemfile.lock + - "**.erb" + - "**.haml" + - "**.rb" + - "**.js" +exclude_paths: +- config/ +- db/ +- spec/ +- test/ +- vendor/ diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000000..96212a3593b --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +**/*{.,-}min.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000000..9faa37508e5 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,213 @@ +ecmaFeatures: + modules: true + jsx: true + +env: + amd: true + browser: true + es6: true + jquery: true + node: true + +# http://eslint.org/docs/rules/ +rules: + # Possible Errors + comma-dangle: [2, never] + no-cond-assign: 2 + no-console: 0 + no-constant-condition: 2 + no-control-regex: 2 + no-debugger: 2 + no-dupe-args: 2 + no-dupe-keys: 2 + no-duplicate-case: 2 + no-empty: 2 + no-empty-character-class: 2 + no-ex-assign: 2 + no-extra-boolean-cast: 2 + no-extra-parens: 0 + no-extra-semi: 2 + no-func-assign: 2 + no-inner-declarations: [2, functions] + no-invalid-regexp: 2 + no-irregular-whitespace: 2 + no-negated-in-lhs: 2 + no-obj-calls: 2 + no-regex-spaces: 2 + no-sparse-arrays: 2 + no-unexpected-multiline: 2 + no-unreachable: 2 + use-isnan: 2 + valid-jsdoc: 0 + valid-typeof: 2 + + # Best Practices + accessor-pairs: 2 + block-scoped-var: 0 + complexity: [2, 6] + consistent-return: 0 + curly: 0 + default-case: 0 + dot-location: 0 + dot-notation: 0 + eqeqeq: 2 + guard-for-in: 2 + no-alert: 2 + no-caller: 2 + no-case-declarations: 2 + no-div-regex: 2 + no-else-return: 0 + no-empty-label: 2 + no-empty-pattern: 2 + no-eq-null: 2 + no-eval: 2 + no-extend-native: 2 + no-extra-bind: 2 + no-fallthrough: 2 + no-floating-decimal: 0 + no-implicit-coercion: 0 + no-implied-eval: 2 + no-invalid-this: 0 + no-iterator: 2 + no-labels: 0 + no-lone-blocks: 2 + no-loop-func: 2 + no-magic-number: 0 + no-multi-spaces: 0 + no-multi-str: 0 + no-native-reassign: 2 + no-new-func: 2 + no-new-wrappers: 2 + no-new: 2 + no-octal-escape: 2 + no-octal: 2 + no-proto: 2 + no-redeclare: 2 + no-return-assign: 2 + no-script-url: 2 + no-self-compare: 2 + no-sequences: 0 + no-throw-literal: 0 + no-unused-expressions: 2 + no-useless-call: 2 + no-useless-concat: 2 + no-void: 2 + no-warning-comments: 0 + no-with: 2 + radix: 2 + vars-on-top: 0 + wrap-iife: 2 + yoda: 0 + + # Strict + strict: 0 + + # Variables + init-declarations: 0 + no-catch-shadow: 2 + no-delete-var: 2 + no-label-var: 2 + no-shadow-restricted-names: 2 + no-shadow: 0 + no-undef-init: 2 + no-undef: 0 + no-undefined: 0 + no-unused-vars: 0 + no-use-before-define: 0 + + # Node.js and CommonJS + callback-return: 2 + global-require: 2 + handle-callback-err: 2 + no-mixed-requires: 0 + no-new-require: 0 + no-path-concat: 2 + no-process-exit: 2 + no-restricted-modules: 0 + no-sync: 0 + + # Stylistic Issues + array-bracket-spacing: 0 + block-spacing: 0 + brace-style: 0 + camelcase: 0 + comma-spacing: 0 + comma-style: 0 + computed-property-spacing: 0 + consistent-this: 0 + eol-last: 0 + func-names: 0 + func-style: 0 + id-length: 0 + id-match: 0 + indent: 0 + jsx-quotes: 0 + key-spacing: 0 + linebreak-style: 0 + lines-around-comment: 0 + max-depth: 0 + max-len: 0 + max-nested-callbacks: 0 + max-params: 0 + max-statements: [2, 30] + new-cap: 0 + new-parens: 0 + newline-after-var: 0 + no-array-constructor: 0 + no-bitwise: 0 + no-continue: 0 + no-inline-comments: 0 + no-lonely-if: 0 + no-mixed-spaces-and-tabs: 0 + no-multiple-empty-lines: 0 + no-negated-condition: 0 + no-nested-ternary: 0 + no-new-object: 0 + no-plusplus: 0 + no-restricted-syntax: 0 + no-spaced-func: 0 + no-ternary: 0 + no-trailing-spaces: 0 + no-underscore-dangle: 0 + no-unneeded-ternary: 0 + object-curly-spacing: 0 + one-var: 0 + operator-assignment: 0 + operator-linebreak: 0 + padded-blocks: 0 + quote-props: 0 + quotes: 0 + require-jsdoc: 0 + semi-spacing: 0 + semi: 0 + sort-vars: 0 + space-after-keywords: 0 + space-before-blocks: 0 + space-before-function-paren: 0 + space-before-keywords: 0 + space-in-parens: 0 + space-infix-ops: 0 + space-return-throw-case: 0 + space-unary-ops: 0 + spaced-comment: 0 + wrap-regex: 0 + + # ECMAScript 6 + arrow-body-style: 0 + arrow-parens: 0 + arrow-spacing: 0 + constructor-super: 0 + generator-star-spacing: 0 + no-arrow-condition: 0 + no-class-assign: 0 + no-const-assign: 0 + no-dupe-class-members: 0 + no-this-before-super: 0 + no-var: 0 + object-shorthand: 0 + prefer-arrow-callback: 0 + prefer-const: 0 + prefer-reflect: 0 + prefer-spread: 0 + prefer-template: 0 + require-yield: 0 diff --git a/.travis.yml b/.travis.yml index 44e4b46e229..f434d8be97a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,4 @@ install: - docker-compose run web bower install --allow-root script: - - docker-compose run web bash -c "rake test:all" + - docker-compose run -e CI=TRUE web bash -c "rake test:all" diff --git a/Gemfile b/Gemfile index b4d770ef809..30d32f78f59 100644 --- a/Gemfile +++ b/Gemfile @@ -48,6 +48,7 @@ group :test do gem 'timecop' gem 'jasmine-rails' gem 'jasmine-jquery-rails' + gem 'coveralls', require: false end # run with `bundle install --without production` to exclude these diff --git a/Gemfile.lock b/Gemfile.lock index b7d82b16a11..5e279511837 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -54,9 +54,16 @@ GEM commonjs (0.2.7) composite_primary_keys (5.0.14) activerecord (~> 3.2.0, >= 3.2.9) + coveralls (0.8.18) + json (>= 1.8, < 3) + simplecov (~> 0.12.0) + term-ansicolor (~> 1.3) + thor (~> 0.19.1) + tins (~> 1.6) descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) diff-lcs (1.2.5) + docile (1.1.5) domain_name (0.5.20160826) unf (>= 0.0.5, < 1.0.0) enumerable-lazy (0.0.1) @@ -236,6 +243,11 @@ GEM scrypt (1.2.1) ffi-compiler (>= 0.0.2) rake + simplecov (0.12.0) + docile (~> 1.1.0) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.0) sprockets (2.2.3) hike (~> 1.2) multi_json (~> 1.0) @@ -257,6 +269,8 @@ GEM rails (>= 3) sunspot (= 2.2.6) sunspot_solr (2.2.6) + term-ansicolor (1.4.0) + tins (~> 1.0) test-unit (3.2.1) power_assert therubyracer (0.12.2) @@ -266,6 +280,7 @@ GEM thread_safe (0.3.5) tilt (1.4.1) timecop (0.8.1) + tins (1.13.0) treetop (1.4.15) polyglot polyglot (>= 0.3.1) @@ -292,6 +307,7 @@ DEPENDENCIES byebug coffee-rails (~> 3.2.1) composite_primary_keys + coveralls execjs friendly_id geocoder @@ -343,5 +359,8 @@ DEPENDENCIES will_paginate (>= 3.0.6) will_paginate-bootstrap (>= 1.0.1) +RUBY VERSION + ruby 2.1.2p95 + BUNDLED WITH 1.13.7 diff --git a/lib/tasks/test.rake b/lib/tasks/test.rake index 36f177c2a02..ed25f4e42fa 100644 --- a/lib/tasks/test.rake +++ b/lib/tasks/test.rake @@ -38,4 +38,10 @@ namespace :test do puts "turning off solr dependence at config/sunspot.yml" puts sunspot.to_yaml end + + task :coverage do + require 'coveralls/rake/task' + Coveralls::RakeTask.new + Rake::Task["coveralls:push"].execute + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 0962c0ac109..92b4a240573 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,6 @@ +require 'coveralls' +Coveralls.wear_merged! + ENV["RAILS_ENV"] = "test" require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help'