rubocop-schema-gen 0.1.0 → 0.1.5

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +13 -0
  3. data/README.md +20 -25
  4. data/assets/templates/cop_schema.yml +1 -3
  5. data/assets/templates/schema.yml +4 -0
  6. data/exe/rubocop-schema-gen +4 -2
  7. data/lib/rubocop/schema.rb +0 -4
  8. data/lib/rubocop/schema/ascii_doc/base.rb +52 -0
  9. data/lib/rubocop/schema/ascii_doc/cop.rb +93 -0
  10. data/lib/rubocop/schema/ascii_doc/department.rb +21 -0
  11. data/lib/rubocop/schema/ascii_doc/index.rb +20 -0
  12. data/lib/rubocop/schema/ascii_doc/stringifier.rb +49 -0
  13. data/lib/rubocop/schema/{cache.rb → cached_http_client.rb} +9 -12
  14. data/lib/rubocop/schema/cli.rb +94 -26
  15. data/lib/rubocop/schema/cop_info_merger.rb +54 -0
  16. data/lib/rubocop/schema/cop_schema.rb +69 -26
  17. data/lib/rubocop/schema/defaults_ripper.rb +48 -0
  18. data/lib/rubocop/schema/diff.rb +67 -0
  19. data/lib/rubocop/schema/document_loader.rb +55 -0
  20. data/lib/rubocop/schema/extension_spec.rb +67 -0
  21. data/lib/rubocop/schema/generator.rb +91 -0
  22. data/lib/rubocop/schema/helpers.rb +62 -0
  23. data/lib/rubocop/schema/repo.rb +91 -0
  24. data/lib/rubocop/schema/value_objects.rb +29 -3
  25. data/lib/rubocop/schema/version.rb +1 -1
  26. metadata +20 -36
  27. data/.gitignore +0 -19
  28. data/.rspec +0 -3
  29. data/.rubocop.yml +0 -38
  30. data/.ruby-version +0 -1
  31. data/.travis.yml +0 -6
  32. data/CODE_OF_CONDUCT.md +0 -74
  33. data/Gemfile +0 -10
  34. data/LICENSE.txt +0 -21
  35. data/Rakefile +0 -6
  36. data/bin/console +0 -14
  37. data/bin/setup +0 -8
  38. data/lib/rubocop/schema/lockfile_inspector.rb +0 -51
  39. data/lib/rubocop/schema/scraper.rb +0 -183
  40. data/lib/rubocop/schema/templates.rb +0 -8
  41. data/rubocop-schema.gemspec +0 -31
  42. data/rubocop-schema.json +0 -21110
@@ -0,0 +1,62 @@
1
+ require 'uri'
2
+ require 'yaml'
3
+ require 'net/http'
4
+ require 'cgi'
5
+
6
+ module RuboCop
7
+ module Schema
8
+ module Helpers
9
+ def self.templates
10
+ @templates ||= {}
11
+ end
12
+
13
+ def deep_dup(obj)
14
+ case obj
15
+ when String
16
+ obj.dup
17
+ when Hash
18
+ obj.transform_values &method(:deep_dup)
19
+ when Array
20
+ obj.map &method(:deep_dup)
21
+ else
22
+ obj
23
+ end
24
+ end
25
+
26
+ def deep_merge(old, new, &block)
27
+ return old if old.class != new.class
28
+
29
+ case old
30
+ when Hash
31
+ old.merge(new.map { |k, v| [k, old.key?(k) ? deep_merge(old[k], v, &block) : v] }.to_h)
32
+ .tap { |merged| yield merged if block_given? }
33
+ when Array
34
+ old | new
35
+ else
36
+ old
37
+ end
38
+ end
39
+
40
+ def boolean
41
+ { 'type' => 'boolean' }
42
+ end
43
+
44
+ def template(name)
45
+ deep_dup(Helpers.templates[name] ||= YAML.load_file(ROOT.join('assets', 'templates', "#{name}.yml")).freeze)
46
+ end
47
+
48
+ # Used for stripping HTML from Asciidoctor output, where raw output is not available, or not
49
+ # appropriate to use.
50
+ def strip_html(str)
51
+ CGI.unescapeHTML str.gsub(/<.*?>/, '').gsub(/\s+/, ' ')
52
+ end
53
+
54
+ def http_get(url)
55
+ url = URI(url)
56
+ res = Net::HTTP.get_response(url)
57
+ res.body = '' unless res.is_a? Net::HTTPOK
58
+ res.body.force_encoding Encoding::UTF_8
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,91 @@
1
+ require 'json'
2
+
3
+ require 'rubocop/schema/helpers'
4
+ require 'rubocop/schema/diff'
5
+ require 'rubocop/schema/extension_spec'
6
+ require 'rubocop/schema/value_objects'
7
+
8
+ module RuboCop
9
+ module Schema
10
+ class Repo
11
+ include Helpers
12
+
13
+ # GitHub public APIs have a rate limit of 60/hour when making unauthenticated requests. 100 items
14
+ # per page is the maximum allowed, which we'll use to keep the number of requests to a minimum.
15
+ TAGS_PER_PAGE = 100
16
+ TAGS_URL_TEMPLATE = -"https://api.github.com/repos/rubocop/%s/tags?page=%d&per_page=#{TAGS_PER_PAGE}"
17
+
18
+ def initialize(dir, loader, &event_handler)
19
+ @dir = Pathname(dir)
20
+ @loader = loader
21
+ @event_handler = event_handler
22
+ @dir.mkpath
23
+ end
24
+
25
+ def build
26
+ ExtensionSpec::KNOWN_GEMS.each &method(:build_for_gem)
27
+ Event.dispatch message: "Repo updated: #{@dir}", &@event_handler
28
+ end
29
+
30
+ private
31
+
32
+ def build_for_gem(name)
33
+ existing = read(name).map { |h| [h['version'], h['diff']] }.to_h
34
+ previous = nil
35
+ body = versions_of(name).map do |version|
36
+ previous, diff = fetch_for_spec(Spec.new(name: name, version: version), existing, previous)
37
+ {
38
+ 'version' => version,
39
+ 'diff' => diff
40
+ }
41
+ end
42
+ write name, body.compact
43
+ end
44
+
45
+ def fetch_for_spec(spec, existing, previous)
46
+ if existing.key? spec.version
47
+ diff = existing[spec.version]
48
+ schema = Diff.apply(previous, diff)
49
+ else
50
+ schema = build_for_spec(spec)
51
+ diff = Diff.diff(previous, schema)
52
+ end
53
+ [schema, diff]
54
+ end
55
+
56
+ def build_for_spec(spec)
57
+ Event.dispatch message: "Generating: #{spec}", &@event_handler
58
+ Generator.new([spec], @loader).schema
59
+ end
60
+
61
+ def write(name, body)
62
+ path_for(name).binwrite JSON.pretty_generate body
63
+ end
64
+
65
+ def read(name)
66
+ path = path_for(name)
67
+ return [] unless path.exist?
68
+
69
+ JSON.parse path.read
70
+ end
71
+
72
+ def path_for(name)
73
+ @dir.join("#{name}.json")
74
+ end
75
+
76
+ def versions_of(name)
77
+ tags = []
78
+ loop do
79
+ json = http_get(format(TAGS_URL_TEMPLATE, name, (tags.length / TAGS_PER_PAGE) + 1))
80
+ raise "No tags available for #{name}" if json == ''
81
+
82
+ parsed = JSON.parse(json)
83
+ tags += parsed
84
+ break unless parsed.length == TAGS_PER_PAGE
85
+ end
86
+
87
+ tags.reverse.map { |obj| obj['name'].to_s[/(?<=\Av)\d.+/] }.compact
88
+ end
89
+ end
90
+ end
91
+ end
@@ -1,7 +1,33 @@
1
1
  module RuboCop
2
2
  module Schema
3
- CopInfo = Struct.new(:name, :description, :attributes, :supports_autocorrect, keyword_init: true)
4
- Attribute = Struct.new(:name, :type, :default, keyword_init: true)
5
- Event = Struct.new(:type, :message, keyword_init: true)
3
+ CopInfo = Struct.new(:name, :description, :attributes, :supports_autocorrect, :enabled_by_default)
4
+ Attribute = Struct.new(:name, :type, :default)
5
+
6
+ Event = Struct.new(:type, :message) do
7
+ def self.dispatch(**kwargs)
8
+ yield new(**kwargs) if block_given?
9
+ end
10
+ end
11
+
12
+ Spec = Struct.new(:name, :version) do
13
+ def short_name
14
+ return nil if name == 'rubocop'
15
+
16
+ name[8..-1]
17
+ end
18
+
19
+ def to_s
20
+ "#{short_name || name}-#{version}"
21
+ end
22
+ end
23
+
24
+ # Support for Ruby 2.4
25
+ module KeywordInitPatch
26
+ def initialize(**attrs)
27
+ super *self.class.members.map { |k| attrs[k] }
28
+ end
29
+ end
30
+
31
+ [CopInfo, Attribute, Event, Spec].each { |klass| klass.include KeywordInitPatch }
6
32
  end
7
33
  end
@@ -1,5 +1,5 @@
1
1
  module RuboCop
2
2
  module Schema
3
- VERSION = -'0.1.0'
3
+ VERSION = -'0.1.5'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-schema-gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil E. Pearson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-27 00:00:00.000000000 Z
11
+ date: 2021-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -24,21 +24,7 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.0.14
27
- - !ruby/object:Gem::Dependency
28
- name: nokogiri
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.11'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.11'
41
- description: Generate JSON schemas for IDE integration with Rubocop
27
+ description: Generate JSON schemas for IDE integration with RuboCop
42
28
  email:
43
29
  - neil@helium.net.au
44
30
  executables:
@@ -46,32 +32,30 @@ executables:
46
32
  extensions: []
47
33
  extra_rdoc_files: []
48
34
  files:
49
- - ".gitignore"
50
- - ".rspec"
51
- - ".rubocop.yml"
52
- - ".ruby-version"
53
- - ".travis.yml"
54
- - CODE_OF_CONDUCT.md
55
- - Gemfile
56
- - LICENSE.txt
35
+ - LICENSE
57
36
  - README.md
58
- - Rakefile
59
37
  - assets/templates/cop_schema.yml
60
38
  - assets/templates/schema.yml
61
- - bin/console
62
- - bin/setup
63
39
  - exe/rubocop-schema-gen
64
40
  - lib/rubocop/schema.rb
65
- - lib/rubocop/schema/cache.rb
41
+ - lib/rubocop/schema/ascii_doc/base.rb
42
+ - lib/rubocop/schema/ascii_doc/cop.rb
43
+ - lib/rubocop/schema/ascii_doc/department.rb
44
+ - lib/rubocop/schema/ascii_doc/index.rb
45
+ - lib/rubocop/schema/ascii_doc/stringifier.rb
46
+ - lib/rubocop/schema/cached_http_client.rb
66
47
  - lib/rubocop/schema/cli.rb
48
+ - lib/rubocop/schema/cop_info_merger.rb
67
49
  - lib/rubocop/schema/cop_schema.rb
68
- - lib/rubocop/schema/lockfile_inspector.rb
69
- - lib/rubocop/schema/scraper.rb
70
- - lib/rubocop/schema/templates.rb
50
+ - lib/rubocop/schema/defaults_ripper.rb
51
+ - lib/rubocop/schema/diff.rb
52
+ - lib/rubocop/schema/document_loader.rb
53
+ - lib/rubocop/schema/extension_spec.rb
54
+ - lib/rubocop/schema/generator.rb
55
+ - lib/rubocop/schema/helpers.rb
56
+ - lib/rubocop/schema/repo.rb
71
57
  - lib/rubocop/schema/value_objects.rb
72
58
  - lib/rubocop/schema/version.rb
73
- - rubocop-schema.gemspec
74
- - rubocop-schema.json
75
59
  homepage: https://github.com/hx/rubocop-schema
76
60
  licenses:
77
61
  - MIT
@@ -87,7 +71,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
71
  requirements:
88
72
  - - ">="
89
73
  - !ruby/object:Gem::Version
90
- version: 3.0.0
74
+ version: 2.4.0
91
75
  required_rubygems_version: !ruby/object:Gem::Requirement
92
76
  requirements:
93
77
  - - ">="
@@ -97,5 +81,5 @@ requirements: []
97
81
  rubygems_version: 3.2.3
98
82
  signing_key:
99
83
  specification_version: 4
100
- summary: Generate JSON schemas for IDE integration with Rubocop
84
+ summary: Generate JSON schemas for IDE integration with RuboCop
101
85
  test_files: []
data/.gitignore DELETED
@@ -1,19 +0,0 @@
1
- # Actual stuff
2
-
3
- /cache
4
- /.cache
5
- /Gemfile.lock
6
-
7
- # Generated by `bundle gem`
8
-
9
- /.bundle/
10
- /.yardoc
11
- /_yardoc/
12
- /coverage/
13
- /doc/
14
- /pkg/
15
- /spec/reports/
16
- /tmp/
17
-
18
- # rspec failure tracking
19
- .rspec_status
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper
data/.rubocop.yml DELETED
@@ -1,38 +0,0 @@
1
- # The behavior of RuboCop can be controlled via the .rubocop.yml
2
- # configuration file. It makes it possible to enable/disable
3
- # certain cops (checks) and to alter their behavior if they accept
4
- # any parameters. The file can be placed either in your home
5
- # directory or in some project directory.
6
- #
7
- # RuboCop will start looking for the configuration file in the directory
8
- # where the inspected file is and continue its way up to the root directory.
9
- #
10
- # See https://docs.rubocop.org/rubocop/configuration
11
-
12
- require:
13
- - rubocop-rspec
14
- - rubocop-rake
15
-
16
- AllCops:
17
- SuggestExtensions: false
18
- NewCops: enable
19
- TargetRubyVersion: 3.0
20
-
21
- Layout/HashAlignment:
22
- EnforcedColonStyle: table
23
- EnforcedHashRocketStyle: table
24
-
25
- Layout/MultilineMethodCallIndentation:
26
- EnforcedStyle: indented
27
-
28
- Style/FrozenStringLiteralComment:
29
- EnforcedStyle: never
30
-
31
- Style/Documentation:
32
- Enabled: false
33
-
34
- Style/StringConcatenation:
35
- Enabled: false
36
-
37
- Style/StderrPuts:
38
- Enabled: false
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 3.0.0
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 3.0.0
6
- before_install: gem install bundler -v 2.1.4
data/CODE_OF_CONDUCT.md DELETED
@@ -1,74 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
16
-
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
22
-
23
- Examples of unacceptable behavior by participants include:
24
-
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- ## Our Responsibilities
35
-
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
39
-
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
45
-
46
- ## Scope
47
-
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
54
-
55
- ## Enforcement
56
-
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at neil.pearson@bigcommerce.com. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
63
-
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
67
-
68
- ## Attribution
69
-
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [https://contributor-covenant.org/version/1/4][version]
72
-
73
- [homepage]: https://contributor-covenant.org
74
- [version]: https://contributor-covenant.org/version/1/4/