able_git_hooks 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: edc627c31da0c20e26a37d02937483614ff2467d2b103b5a677804dde8ce9e46
4
- data.tar.gz: 3cdbf9533b3fd89c50b867adda4581e51fa1b720a3dd5248d9179f93d9644e81
3
+ metadata.gz: 2c2cfb7a8cf9f20c9239f1fa90bd5b8186be514321d7f9f0fc12ff5fc1786fd4
4
+ data.tar.gz: fc41fa34ca1a4732b10f70bc3b7a212fedb832dfd03e5c6279742e9775e156ba
5
5
  SHA512:
6
- metadata.gz: de0cf62b06fd7649fbad4c5da0e4115b8a942b175c9d3e9ceff34239f0ecbaea7f609f81dff660a2e26ff8d8600b24e7f937bcdc67b7b3f6a9c756e4b2a391e1
7
- data.tar.gz: 156c269792873441ed1cf3ea38b400befd8f5cc28a07c2b1b692fc0c23b01d38e1764080769d2cdb8465a9198ab517e1217be6db6c6426c44c0583b921eeab10
6
+ metadata.gz: 4012768541ad36d72dba19328eb85ef199f40c38e42e5cd2209e260fc0cfcab3503001d7d46c4ac2372016bb6390312df91ea4ac8245041a10125c9d264029a8
7
+ data.tar.gz: fd916bca9d07e150bebb6f3029058b629e39c416aeca772f44e0df26b9b9d82e6ce1f7e398c7a9df272a1b1b5156769e28ccab58789fc96b2165a79c3f67d1fd
@@ -0,0 +1,117 @@
1
+ ---
2
+ AllCops:
3
+ DisabledByDefault: true
4
+ Exclude:
5
+ - bin/**/*
6
+ - node_modules/**/*
7
+ - db/migrate/*
8
+ - db/schema.rb
9
+ TargetRubyVersion: 2.5
10
+ Layout/AccessModifierIndentation:
11
+ EnforcedStyle: indent
12
+ Layout/BlockAlignment:
13
+ EnforcedStyleAlignWith: either
14
+ Layout/DefEndAlignment:
15
+ EnforcedStyleAlignWith: start_of_line
16
+ Layout/DotPosition:
17
+ EnforcedStyle: leading
18
+ Layout/EmptyComment:
19
+ Enabled: true
20
+ Layout/EmptyLineBetweenDefs:
21
+ Enabled: true
22
+ NumberOfEmptyLines: 1
23
+ Layout/EmptyLinesAroundBlockBody:
24
+ EnforcedStyle: no_empty_lines
25
+ Layout/EmptyLinesAroundClassBody:
26
+ EnforcedStyle: no_empty_lines
27
+ Layout/EmptyLinesAroundModuleBody:
28
+ EnforcedStyle: no_empty_lines
29
+ Layout/EndAlignment:
30
+ EnforcedStyleAlignWith: start_of_line
31
+ Layout/ExtraSpacing:
32
+ AllowForAlignment: true
33
+ Layout/IndentArray:
34
+ EnforcedStyle: consistent
35
+ Layout/IndentHash:
36
+ EnforcedStyle: consistent
37
+ Layout/IndentationConsistency:
38
+ EnforcedStyle: normal
39
+ Layout/IndentationWidth:
40
+ Width: 2
41
+ Layout/SpaceAroundBlockParameters:
42
+ EnforcedStyleInsidePipes: no_space
43
+ Layout/SpaceAroundEqualsInParameterDefault:
44
+ EnforcedStyle: space
45
+ Layout/SpaceAroundOperators:
46
+ Enabled: true
47
+ Layout/SpaceBeforeBlockBraces:
48
+ EnforcedStyle: space
49
+ Layout/SpaceInLambdaLiteral:
50
+ EnforcedStyle: require_no_space
51
+ Layout/SpaceInsideBlockBraces:
52
+ EnforcedStyle: space
53
+ EnforcedStyleForEmptyBraces: no_space
54
+ Layout/SpaceInsideHashLiteralBraces:
55
+ EnforcedStyle: space
56
+ EnforcedStyleForEmptyBraces: no_space
57
+ Layout/SpaceInsideReferenceBrackets:
58
+ EnforcedStyle: no_space
59
+ Layout/SpaceInsideStringInterpolation:
60
+ EnforcedStyle: no_space
61
+ Layout/Tab:
62
+ Enabled: true
63
+ Layout/TrailingWhitespace:
64
+ Enabled: true
65
+ Lint/SafeNavigationChain:
66
+ Enabled: true
67
+ Lint/ShadowedArgument:
68
+ Enabled: true
69
+ Lint/UnusedBlockArgument:
70
+ Enabled: true
71
+ Lint/UnusedMethodArgument:
72
+ Enabled: true
73
+ Naming/VariableName:
74
+ EnforcedStyle: snake_case
75
+ Rails/LexicallyScopedActionFilter:
76
+ Include:
77
+ - app/controllers/**/*.rb
78
+ Rails/TimeZone:
79
+ EnforcedStyle: flexible
80
+ Rails/UnknownEnv:
81
+ Environments:
82
+ - development
83
+ - test
84
+ - production
85
+ Style/BlockDelimiters:
86
+ EnforcedStyle: line_count_based
87
+ Style/BracesAroundHashParameters:
88
+ EnforcedStyle: no_braces
89
+ Style/EmptyElse:
90
+ EnforcedStyle: both
91
+ Style/EmptyMethod:
92
+ EnforcedStyle: expanded
93
+ Style/HashSyntax:
94
+ EnforcedStyle: ruby19_no_mixed_keys
95
+ Style/MethodDefParentheses:
96
+ EnforcedStyle: require_parentheses
97
+ Style/NumericLiterals:
98
+ MinDigits: 5
99
+ Strict: false
100
+ Style/RedundantReturn:
101
+ Enabled: true
102
+ Style/Semicolon:
103
+ Enabled: true
104
+ Style/SingleLineMethods:
105
+ Enabled: true
106
+ Style/StabbyLambdaParentheses:
107
+ EnforcedStyle: require_parentheses
108
+ Style/StringLiterals:
109
+ EnforcedStyle: double_quotes
110
+ Style/StringLiteralsInInterpolation:
111
+ EnforcedStyle: single_quotes
112
+ Style/TrailingCommaInArguments:
113
+ EnforcedStyleForMultiline: no_comma
114
+ Style/TrailingCommaInArrayLiteral:
115
+ EnforcedStyleForMultiline: no_comma
116
+ Style/TrailingCommaInHashLiteral:
117
+ EnforcedStyleForMultiline: no_comma
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- able_git_hooks (0.11.0)
4
+ able_git_hooks (0.12.0)
5
5
  railties (~> 5.2, >= 5.2.0)
6
6
  rubocop (~> 0.57.2, >= 0.57.2)
7
7
 
@@ -40,7 +40,7 @@ GEM
40
40
  method_source (0.9.0)
41
41
  mini_portile2 (2.3.0)
42
42
  minitest (5.11.3)
43
- nokogiri (1.8.3)
43
+ nokogiri (1.8.4)
44
44
  mini_portile2 (~> 2.3.0)
45
45
  parallel (1.12.1)
46
46
  parser (2.5.1.0)
data/README.md CHANGED
@@ -24,3 +24,10 @@ And then execute:
24
24
  Execute the generator command to copy the files:
25
25
 
26
26
  $ bundle exec rails generate able_git_hooks:install
27
+
28
+
29
+ For the ESLint default configuration you'll need to install
30
+
31
+ - eslint-plugin-import
32
+ - eslint-plugin-react
33
+ - eslint-plugin-prettier
@@ -4,6 +4,9 @@ module AbleGitHooks
4
4
  desc "Install git hook files"
5
5
  source_root File.expand_path("../templates", __FILE__)
6
6
 
7
+ class_option :with_stylelint, type: :boolean, default: false, description: "Include the default configuration for stylelint"
8
+
9
+
7
10
  def install_git_hooks
8
11
  copy_file "_do_hook", ".git/hooks/_do_hook"
9
12
  chmod ".git/hooks/_do_hook", 0755
@@ -22,6 +25,32 @@ module AbleGitHooks
22
25
  def copy_rubocop_defaults
23
26
  template "rubocop.yml", "config/rubocop.yml"
24
27
  end
28
+
29
+ def install_eslint_hooks
30
+ copy_file "eslint-check.js", "hooks/pre-commit/eslint-check.js"
31
+ chmod "hooks/pre-commit/eslint-check.js", 0755
32
+ end
33
+
34
+ def copy_eslint_defaults
35
+ copy_file "eslintrc.json", ".eslintrc.json"
36
+ end
37
+
38
+ def copy_prettier_defaults
39
+ copy_file "prettierrc", ".prettierrc"
40
+ end
41
+
42
+ def install_stylelint_hooks
43
+ if options["with_stylelint"]
44
+ copy_file "stylelint-check.js", "hooks/pre-commit/stylelint-check.js"
45
+ chmod "hooks/pre-commit/stylelint-check.js", 0755
46
+ end
47
+ end
48
+
49
+ def copy_stylelint_defaults
50
+ if options["with_stylelint"]
51
+ copy_file "stylelintrc", ".stylelintrc"
52
+ end
53
+ end
25
54
  end
26
55
  end
27
56
  end
@@ -14,5 +14,5 @@ declare -r hookdir="hooks/$ARG0"
14
14
 
15
15
  for hook in "$hookdir"/*; do
16
16
  echo "executing hook: ${hook}"
17
- exec "${hook}"
17
+ eval "${hook}"
18
18
  done
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+
3
+ "use strict";
4
+
5
+ /***
6
+ * Description:
7
+ * Run prettier on the files are they are staged to be commit. Exit successfully
8
+ * only if the file would be left unchanged by prettier.
9
+ *
10
+ * Steps:
11
+ *
12
+ * 1. List the sources files that are to be committed.
13
+ * 2. Use git show :<path> to print the staged file to stdout.
14
+ * 3. Pipe stdout to `prettier.check`.
15
+ *
16
+ ***/
17
+
18
+ const { promisify } = require("util");
19
+ let { exec } = require("child_process");
20
+ exec = promisify(exec);
21
+ const ESLintCLIEngine = require("eslint").CLIEngine;
22
+ const cli = new ESLintCLIEngine({});
23
+ const formatter = cli.getFormatter();
24
+
25
+
26
+ const getStagedFiles =
27
+ "git diff --staged --name-only -z --diff-filter=ACMR";
28
+
29
+ const onlyJSFiles = filenames => {
30
+ return filenames.filter(
31
+ file => file.endsWith(".js") || file.endsWith(".jsx"),
32
+ );
33
+ };
34
+
35
+ const splitFileNames = ret => {
36
+ const fileNames = ret.stdout.substring(0, ret.stdout.length - 1);
37
+ return fileNames.split("\u0000");
38
+ };
39
+
40
+ function and(x, y) {
41
+ return x && y;
42
+ }
43
+
44
+ const reduceWithAnd = xs => {
45
+ return xs.reduce(and, true);
46
+ };
47
+
48
+ const exit = success => {
49
+ if (success) {
50
+ process.exit(0);
51
+ } else {
52
+ process.exit(1);
53
+ }
54
+ };
55
+
56
+ function lintFile(filepath) {
57
+ return exec(`git show :${filepath}`).then(ret => {
58
+ const report = cli.executeOnText(ret.stdout, filepath);
59
+ if (report.errorCount > 0 || report.warningCount > 0) {
60
+ const errorResults = ESLintCLIEngine.getErrorResults(report.results);
61
+ console.log(formatter(errorResults));
62
+ }
63
+ return report.errorCount === 0 && report.warningCount === 0;
64
+ });
65
+ }
66
+
67
+ function lintFiles(filepaths) {
68
+ return Promise.all(filepaths.map(lintFile));
69
+ }
70
+
71
+ exec(getStagedFiles)
72
+ .then(splitFileNames)
73
+ .then(onlyJSFiles)
74
+ .then(lintFiles)
75
+ .then(reduceWithAnd)
76
+ .then(exit);
@@ -0,0 +1,33 @@
1
+ {
2
+ "parserOptions": {
3
+ "ecmaVersion": 6,
4
+ "sourceType": "module",
5
+ "ecmaFeatures": {
6
+ "jsx": true
7
+ }
8
+ },
9
+ plugins: ["import", "react", "prettier"],
10
+ "rules": {
11
+ "no-dupe-keys": "error",
12
+ "no-undef": "error",
13
+ "no-unreachable": "error",
14
+ "no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
15
+ "no-useless-constructor": "error",
16
+ "no-var": "error",
17
+ "no-duplicate-imports": "error",
18
+ "no-duplicate-case": "error",
19
+ "no-console": "error",
20
+ "no-debugger": "error",
21
+ "import/no-unresolved": "error",
22
+ "import/default": "error",
23
+ "react/jsx-no-undef": "error",
24
+ "react/jsx-uses-vars": 1,
25
+ "react/jsx-uses-react": "error",
26
+ "react/react-in-jsx-scope": "error",
27
+ "react/no-string-refs": "error",
28
+ "react/prop-types": ["error", { skipUndeclared: true }],
29
+ "react/forbid-prop-types": "error",
30
+ "react/prefer-stateless-function": "error",
31
+ "prettier/prettier": "error"
32
+ }
33
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "trailingComma": "all"
3
+ }
@@ -4,6 +4,9 @@ require "rubocop"
4
4
  require "shellwords"
5
5
 
6
6
  staged_files = `git diff -z --staged --name-only --diff-filter=ACM`.split("\u0000")
7
+
8
+ exit 0 if staged_files.empty?
9
+
7
10
  config_store = RuboCop::ConfigStore.new
8
11
  target_files = RuboCop::TargetFinder.new(config_store).find(staged_files)
9
12
 
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict';
4
+
5
+ /***
6
+ * Description:
7
+ * Run stylelint against the staged version of style files. If any errors are
8
+ * found by stylelint, print them to standard output and return with a non-zero
9
+ * exit code. Otherwise return successfully.
10
+ ***/
11
+
12
+ const { promisify } = require('util');
13
+ let { exec } = require('child_process');
14
+ exec = promisify(exec);
15
+ const stylelint = require('stylelint');
16
+
17
+
18
+ const getStagedFiles =
19
+ "git diff --staged --name-only -z --diff-filter=ACMR";
20
+
21
+ const onlyJSFiles = filenames => {
22
+ return filenames.filter(
23
+ file => file.endsWith(".js") || file.endsWith(".jsx"),
24
+ );
25
+ };
26
+
27
+ const splitFileNames = ret => {
28
+ const fileNames = ret.stdout.substring(0, ret.stdout.length - 1);
29
+ return fileNames.split("\u0000");
30
+ };
31
+
32
+ function and(x, y) {
33
+ return x && y;
34
+ }
35
+
36
+ const reduceWithAnd = xs => {
37
+ return xs.reduce(and, true);
38
+ };
39
+
40
+ const exit = success => {
41
+ if (success) {
42
+ process.exit(0);
43
+ } else {
44
+ process.exit(1);
45
+ }
46
+ };
47
+
48
+ function lintFile(filepath) {
49
+ return exec(`git show :${filepath}`)
50
+ .then(ret => stylelint.lint({ code: ret.stdout, codeFilename: filepath, formatter: 'verbose' }))
51
+ .then(result => {
52
+ if (!result.errored) {
53
+ return true;
54
+ } else {
55
+ console.log(result.output);
56
+ return false;
57
+ }
58
+ });
59
+ }
60
+
61
+ function lintFiles(filepaths) {
62
+ return Promise.all(filepaths.map(lintFile));
63
+ }
64
+
65
+ exec(getStagedFiles)
66
+ .then(splitFileNames)
67
+ .then(onlyStyleFiles)
68
+ .then(lintFiles)
69
+ .then(reduceWithAnd)
70
+ .then(exit);
@@ -0,0 +1,15 @@
1
+ {
2
+ "processors": ["stylelint-processor-styled-components"],
3
+ "extends": [
4
+ "stylelint-config-standard",
5
+ "stylelint-config-styled-components"
6
+ ],
7
+ "syntax": "scss",
8
+ "plugins": ["stylelint-order"],
9
+ "rules": {
10
+ "order/properties-alphabetical-order": true,
11
+ "block-opening-brace-space-after": null,
12
+ "block-closing-brace-space-before": null,
13
+ "color-hex-case": "lower"
14
+ }
15
+ }
@@ -1,3 +1,3 @@
1
1
  module AbleGitHooks
2
- VERSION = "0.11.0"
2
+ VERSION = "0.12.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: able_git_hooks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mario Rodas
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-07-02 00:00:00.000000000 Z
12
+ date: 2018-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -102,6 +102,7 @@ extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
104
  - ".gitignore"
105
+ - ".rubocop.yml"
105
106
  - Gemfile
106
107
  - Gemfile.lock
107
108
  - LICENSE.txt
@@ -113,8 +114,13 @@ files:
113
114
  - lib/able_git_hooks.rb
114
115
  - lib/able_git_hooks/generators/install_generator.rb
115
116
  - lib/able_git_hooks/generators/templates/_do_hook
117
+ - lib/able_git_hooks/generators/templates/eslint-check.js
118
+ - lib/able_git_hooks/generators/templates/eslintrc.json
119
+ - lib/able_git_hooks/generators/templates/prettierrc
116
120
  - lib/able_git_hooks/generators/templates/rubocop.rb
117
121
  - lib/able_git_hooks/generators/templates/rubocop.yml
122
+ - lib/able_git_hooks/generators/templates/stylelint-check.js
123
+ - lib/able_git_hooks/generators/templates/stylelintrc
118
124
  - lib/able_git_hooks/railtie.rb
119
125
  - lib/able_git_hooks/version.rb
120
126
  homepage: http://able.co
@@ -137,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
143
  version: '0'
138
144
  requirements: []
139
145
  rubyforge_project:
140
- rubygems_version: 2.7.6
146
+ rubygems_version: 2.7.7
141
147
  signing_key:
142
148
  specification_version: 4
143
149
  summary: Creates an extensible git hooks system on rails projects