sord 0.8.0 → 3.0.0.beta.1

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  3. data/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
  4. data/.gitignore +0 -0
  5. data/.parlour +11 -0
  6. data/.rspec +0 -0
  7. data/.travis.yml +6 -0
  8. data/CHANGELOG.md +99 -0
  9. data/CODE_OF_CONDUCT.md +0 -0
  10. data/Gemfile +0 -0
  11. data/LICENSE.txt +0 -0
  12. data/README.md +17 -11
  13. data/Rakefile +87 -12
  14. data/exe/sord +50 -33
  15. data/lib/sord.rb +2 -1
  16. data/lib/sord/generator.rb +592 -0
  17. data/lib/sord/logging.rb +21 -30
  18. data/lib/sord/parlour_plugin.rb +84 -0
  19. data/lib/sord/resolver.rb +9 -2
  20. data/lib/sord/type_converter.rb +88 -42
  21. data/lib/sord/version.rb +1 -1
  22. data/rbi/sord.rbi +279 -68
  23. data/sord.gemspec +3 -3
  24. metadata +23 -38
  25. data/lib/sord/rbi_generator.rb +0 -334
  26. data/sorbet/config +0 -0
  27. data/sorbet/rbi/gems/colorize.rbi +0 -81
  28. data/sorbet/rbi/gems/docile.rbi +0 -31
  29. data/sorbet/rbi/gems/rake.rbi +0 -643
  30. data/sorbet/rbi/gems/rspec-core.rbi +0 -1658
  31. data/sorbet/rbi/gems/rspec-expectations.rbi +0 -389
  32. data/sorbet/rbi/gems/rspec-mocks.rbi +0 -823
  33. data/sorbet/rbi/gems/rspec-support.rbi +0 -268
  34. data/sorbet/rbi/gems/rspec.rbi +0 -14
  35. data/sorbet/rbi/gems/simplecov-html.rbi +0 -30
  36. data/sorbet/rbi/gems/simplecov.rbi +0 -223
  37. data/sorbet/rbi/gems/sorbet-runtime.rbi +0 -647
  38. data/sorbet/rbi/gems/yard.rbi +0 -310
  39. data/sorbet/rbi/hidden-definitions/errors.txt +0 -9353
  40. data/sorbet/rbi/hidden-definitions/hidden.rbi +0 -16640
  41. data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +0 -8547
  42. data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +0 -111
  43. data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +0 -543
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a4302b93ba07124b24e91c6db6a2757d2fe148c573f3b86a918c72155e83d0d5
4
- data.tar.gz: 610ce8222970fb4da8f5d01368a21b1aef4067936f6883b2eb5522e567e8fcce
3
+ metadata.gz: 6cfc03da2fe9815159c9041a5afff2a0e1e089567cb92da25bcec87137f9e747
4
+ data.tar.gz: acd6551c560c205199ec494930f4628c5357a34263b0cce05757033014ba929b
5
5
  SHA512:
6
- metadata.gz: 2a3798003e636dc6baba752bbae52718eefb3f43a5562d7fb3659e39d0a0245c39dd10d297433f05df12f60ac102b93a6ad1b71bc0e1fcb2bf3405233dfb834c
7
- data.tar.gz: 0b9a87eea2db2c948006c89c0970175c98471f0e98358a190c17e6c8e064ff59c5849ea73b0081ef6cd09975488884e333b359a44f8d79a8dac78d6f7f461c3e
6
+ metadata.gz: a3ef67b5162e55af55f81fd056c0a1f232293c021b145fab2054cd482951c9cd22aa2e9f8874687131c65b209f2217488ce6808f9bd88da75a04928720452a34
7
+ data.tar.gz: 719461ac9a36dc5c636c4f1b79c22923da4e1decb25032ec8e0c6eef8df60454c3eba6d275c61f91fec9d637d200631d3c3003b1aff981d6bafac3c91323e323
File without changes
File without changes
data/.gitignore CHANGED
File without changes
@@ -0,0 +1,11 @@
1
+ parser: false
2
+
3
+ output_file:
4
+ rbi: rbi/sord.rbi
5
+
6
+ requires:
7
+ - sord
8
+
9
+ plugins:
10
+ Sord::ParlourPlugin:
11
+ rbi: yes
data/.rspec CHANGED
File without changes
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ dist: trusty
3
+ before_install:
4
+ - gem install bundler
5
+ rvm:
6
+ - 2.6
@@ -3,6 +3,105 @@ All notable changes to this project will be documented in this file.
3
3
 
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
5
5
 
6
+ ## [3.0.0.beta.1] - 2020-09-16
7
+ ### Added
8
+ - Sord now uses the Parlour 5 beta's RBS generation to generate RBS files!
9
+ - Added `--rbi` and `--rbs` to select an output format to use (if neither given,
10
+ tries to infer from file extension).
11
+
12
+ ### Changed
13
+ - `RbiGenerator` has been renamed to `Generator`.
14
+ - `TypeConverter#yard_to_sorbet` is now `TypeConverter#yard_to_parlour`, and
15
+ returns `Parlour::Types::Type` instances rather than strings.
16
+
17
+ ### Fixed
18
+ - `#return [nil]` no longer produces a union of zero types, instead becoming
19
+ `void` for method returns or `untyped` for attributes.
20
+
21
+ ## [2.0.0] - 2020-03-16
22
+ ### Added
23
+ - Sord now supports generating `attr_accessor`, `attr_reader` and `attr_writer`
24
+ and will do so automatically when these are used in your code.
25
+ - Depending on what you're doing with Sord, this is **potentially breaking**,
26
+ as for example attributes which would previously generate two `foo` and `foo=`
27
+ methods in Sord will now just generate an `attr_accessor`.
28
+ - `#initialize` is now always typed as returning `void`, which is
29
+ **potentially breaking** if you directly call `#initialize` in code.
30
+ - The `--use-original-initialize-return` flag restores the old behaviour of
31
+ using whatever return type is provided, like any other method.
32
+
33
+ ## [1.0.0] - 2020-02-16
34
+ ### Added
35
+ - Added the `--skip-constants` flag to avoid generating RBIs for constants.
36
+
37
+ ### Changed
38
+ - Parlour 2.0.0 is now being used.
39
+
40
+ ### Fixed
41
+ - Fixed a bug where blank parameters were sometimes treated like non-blank
42
+ parameters.
43
+ - Fixed parameter order sometimes being incorrect.
44
+ - Fixed multiline parameter lists sometimes generating invalid RBIs.
45
+ - Multiline comments are now generated correctly.
46
+ - Fixed an incorrect README link.
47
+
48
+ ## [0.10.0] - 2019-09-14
49
+ ### Added
50
+ - Comments in RBIs are now converted from YARD into Markdown format, making them
51
+ look much better when viewed in an IDE. (To restore the old behaviour of copying
52
+ the YARD comments verbatim, use the `--keep-original-comments` flag.)
53
+
54
+ ### Changed
55
+ - Parlour 0.8.0 is now being used.
56
+ - References to `self` as a type in YARD docs are now generated as
57
+ `T.self_type`, rather than a fixed self type determined by Sord.
58
+
59
+ ## [0.9.0] - 2019-08-09
60
+ ### Added
61
+ - Add the `--replace-constants-with-untyped` flag, which generates `T.untyped` instead of `SORD_ERROR` constants.
62
+ - Added an option to clean the `sord_examples` directory when seeding or reseeding.
63
+ - Added a Rake task to typecheck the `sord_examples` directory.
64
+ - Added a `.parlour` file to the project for generating Sord's RBIs.
65
+ - Added CI with Travis.
66
+
67
+ ### Changed
68
+ - Code generation has been broken out into the Parlour gem, and Sord is now a Parlour plugin.
69
+ - Rainbow is now used for coloured output instead of colorize.
70
+ - Duplicate type signatures are no longer generated for inherited methods.
71
+ - The Resolver can now resolve more objects.
72
+ - If a parameter has `nil` as its default, it now has a nilable type.
73
+ - Generation of constants has been improved.
74
+ - Superclass names are now generated as fully-qualified identifiers.
75
+
76
+ ### Fixed
77
+ - Fixed `T::Hash` and `T::Array` syntax being generated incorrectly.
78
+ - Fix a bug where the `--no-comments` or `--no-generate` flags were ignored.
79
+ - Collections of `T.untyped` now have signatures generated correctly.
80
+ - Fix generation of hashes when they are given too few parameters.
81
+ - YARD no longer prints irrelevant error messages when running rake.
82
+
83
+ ## [0.8.0] - 2019-07-07
84
+ ### Added
85
+ - Block types can now be generated using `@yieldparam` and `@yieldreturn`.
86
+ - Long lists of parameters (at least 4) are now broken onto multiple lines. The threshold can be altered with the `--break-params` option.
87
+ - If a constant used is not found, Sord will now attempt to locate it and fully-qualify its name.
88
+ - Add the `--replace-errors-with-untyped` flag; when present, `T.untyped` is used instead of `SORD_ERROR_` constants.
89
+ - Add the `--include/exclude-messages` flags, which can be used to suppress certain log message kinds.
90
+ - Add support for the `Class<...>` generic becoming `T.class_of(...)`. (#44)
91
+ - Add YARD array (`<...>`) and hash (`{... => ...}`) shorthands. (#43)
92
+ - Sord now has an `examples` set of Rake tasks to test Sord on a large number of repos.
93
+ - Sord now bundles an RBI for itself.
94
+
95
+ ### Changed
96
+ - Methods without any YARD documentation are now typed as `T.untyped` rather than `void`.
97
+
98
+ ### Fixed
99
+ - Duck types in the form of setters (`#foo=`) are now interpreted properly.
100
+ - Fix some cases where indentation was incorrect. (#30, #46)
101
+ - Fix `include` and `extend` calls being swapped, and give them proper blank lines.
102
+ - Fix incorrect blank lines inside empty namespaces.
103
+ - Fix a crash when a `@param` has no name given.
104
+
6
105
  ## [0.7.1] - 2019-06-24
7
106
  ### Fixed
8
107
  - Fix bug where `--no-regenerate` flag was ignored.
File without changes
data/Gemfile CHANGED
File without changes
File without changes
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- Sord is a [**So**rbet](https://sorbet.org) and [YA**RD**](https://sorbet.org)
5
+ Sord is a [**So**rbet](https://sorbet.org) and [YA**RD**](https://yardoc.org/)
6
6
  crossover. It can automatically generate Sorbet type signatures files by
7
7
  looking at the types specified in YARD documentation comments.
8
8
 
@@ -52,14 +52,16 @@ where the maintainer is unwilling to ship type signatures with the gem itself.
52
52
 
53
53
  Sord also takes some flags to alter the generated `.rbi` file:
54
54
 
55
- - `--no-comments`: Generates the `.rbi` file without any comments about
56
- warnings/inferences/errors.
55
+ - `--no-sord-comments`: Generates the `.rbi` file without any Sord comments
56
+ about warnings/inferences/errors. (The original file's comments will still
57
+ be included.)
57
58
  - `--no-regenerate`: By default, Sord will regenerate a repository's YARD
58
59
  docs for you. This option skips regenerating the YARD docs.
59
60
  - `--break-params`: Determines how many parameters are necessary before
60
61
  the signature is changed from a single-line to a multi-line block.
61
62
  (Default: 4)
62
63
  - `--replace-errors-with-untyped`: Uses `T.untyped` instead of `SORD_ERROR_*` constants.
64
+ - `--replace-unresolved-with-untyped`: Uses `T.untyped` when Sord is unable to resolve a constant.
63
65
  - `--include-messages` and `--exclude-messages`: Used to filter the logging
64
66
  messages given by Sord. `--include-messages` acts as a whitelist, printing
65
67
  only messages of the specified logging kinds, whereas `--exclude-messages`
@@ -75,22 +77,22 @@ Say we have this file, called `test.rb`:
75
77
  ```ruby
76
78
  module Example
77
79
  class Person
78
- # @param [String] name
79
- # @param [Integer] age
80
+ # @param name [String] The name of the Person to create.
81
+ # @param age [Integer] The age of the Person to create.
80
82
  # @return [Example::Person]
81
83
  def initialize(name, age)
82
84
  @name = name
83
85
  @age = age
84
86
  end
85
87
 
86
- # @return [String] name
88
+ # @return name [String]
87
89
  attr_accessor :name
88
90
 
89
- # @return [Integer] age
91
+ # @return age [Integer]
90
92
  attr_accessor :age
91
93
 
92
- # @param [Array<String>] possible_names
93
- # @param [Array<Integer>] possible_ages
94
+ # @param possible_names [Array<String>] An array of potential names to choose from.
95
+ # @param possible_ages [Array<Integer>] An array of potential ages to choose from.
94
96
  # @return [Example::Person]
95
97
  def self.construct_randomly(possible_names, possible_ages)
96
98
  Person.new(possible_names.sample, possible_ages.sample)
@@ -115,23 +117,27 @@ The `test.rbi` file then contains a complete RBI file for `test.rb`:
115
117
  # typed: strong
116
118
  module Example
117
119
  class Person
120
+ # @param `name` — The name of the Person to create.
121
+ # @param `age` — The age of the Person to create.
118
122
  sig { params(name: String, age: Integer).returns(Example::Person) }
119
123
  def initialize(name, age); end
120
124
 
121
125
  sig { returns(String) }
122
- def name(); end
126
+ def name; end
123
127
 
124
128
  # sord infer - inferred type of parameter "value" as String using getter's return type
125
129
  sig { params(value: String).returns(String) }
126
130
  def name=(value); end
127
131
 
128
132
  sig { returns(Integer) }
129
- def age(); end
133
+ def age; end
130
134
 
131
135
  # sord infer - inferred type of parameter "value" as Integer using getter's return type
132
136
  sig { params(value: Integer).returns(Integer) }
133
137
  def age=(value); end
134
138
 
139
+ # @param `possible_names` — An array of potential names to choose from.
140
+ # @param `possible_ages` — An array of potential ages to choose from.
135
141
  sig { params(possible_names: T::Array[String], possible_ages: T::Array[Integer]).returns(Example::Person) }
136
142
  def self.construct_randomly(possible_names, possible_ages); end
137
143
  end
data/Rakefile CHANGED
@@ -10,6 +10,7 @@ REPOS = {
10
10
  bundler: 'https://github.com/bundler/bundler',
11
11
  discordrb: 'https://github.com/meew0/discordrb',
12
12
  gitlab: 'https://github.com/NARKOZ/gitlab',
13
+ 'graphql-ruby': 'https://github.com/rmosolgo/graphql-ruby',
13
14
  haml: 'https://github.com/haml/haml',
14
15
  oga: 'https://gitlab.com/yorickpeterse/oga',
15
16
  rouge: 'https://github.com/rouge-ruby/rouge',
@@ -20,12 +21,21 @@ REPOS = {
20
21
 
21
22
  namespace :examples do
22
23
  require 'fileutils'
23
- require 'colorize'
24
+ require 'rainbow'
24
25
 
25
26
  desc "Clone git repositories and run Sord on them as examples"
26
- task :seed do
27
+ task :seed, [:mode, :clean] do |t, args|
27
28
  if File.directory?('sord_examples')
28
- puts 'sord_examples directory already exists, please delete the directory or run a reseed!'.red
29
+ puts Rainbow('sord_examples directory already exists, please delete the directory or run a reseed!').red
30
+ exit
31
+ end
32
+
33
+ if args[:mode] == 'rbi'
34
+ mode_arg = '--rbi'
35
+ elsif args[:mode] == 'rbs'
36
+ mode_arg = '--rbs'
37
+ else
38
+ puts Rainbow('please specify \'rbi\' or \'rbs\'!').red
29
39
  exit
30
40
  end
31
41
 
@@ -44,35 +54,100 @@ namespace :examples do
44
54
  system('bundle install')
45
55
  # Generate sri
46
56
  puts "Generating rbi for #{name}..."
47
- system("bundle exec sord ../#{name}.rbi")
48
- puts "#{name}.rbi generated!"
57
+ if args[:clean]
58
+ system("bundle exec sord ../#{name}.#{args[:mode]} #{mode_arg} --no-sord-comments --replace-errors-with-untyped --replace-unresolved-with-untyped")
59
+ else
60
+ system("bundle exec sord ../#{name}.#{args[:mode]} #{mode_arg}")
61
+ end
62
+ puts "#{name}.#{args[:mode]} generated!"
49
63
  FileUtils.cd '..'
50
64
  end
51
65
  end
52
66
 
53
- puts "Seeding complete!".green
67
+ puts Rainbow("Seeding complete!").green
54
68
  end
55
69
 
56
70
  desc 'Regenerate the rbi files in sord_examples.'
57
- task :reseed do
58
- FileUtils.cd 'sord_examples'
71
+ task :reseed, [:mode, :clean] do |t, args|
72
+ if Dir.exist?('sord_examples')
73
+ FileUtils.cd 'sord_examples'
74
+ else
75
+ raise Rainbow("The sord_examples directory does not exist. Have you run the seed task?").red.bold
76
+ end
77
+
78
+ if args[:mode] == 'rbi'
79
+ mode_arg = '--rbi'
80
+ elsif args[:mode] == 'rbs'
81
+ mode_arg = '--rbs'
82
+ else
83
+ puts Rainbow('please specify \'rbi\' or \'rbs\'!').red
84
+ exit
85
+ end
59
86
 
60
87
  REPOS.keys.each do |name|
61
88
  FileUtils.cd name.to_s
62
89
  puts "Regenerating rbi file for #{name}..."
63
90
  Bundler.with_clean_env do
64
- system("bundle exec sord ../#{name}.rbi --no-regenerate")
91
+ if args[:clean]
92
+ system("bundle exec sord ../#{name}.#{args[:mode]} #{mode_arg} --no-regenerate --no-sord-comments --replace-errors-with-untyped --replace-unresolved-with-untyped")
93
+ else
94
+ system("bundle exec sord ../#{name}.#{args[:mode]} #{mode_arg} --no-regenerate")
95
+ end
65
96
  end
66
97
  FileUtils.cd '..'
67
98
  end
68
99
 
69
- puts "Re-seeding complete!".green
100
+ puts Rainbow("Re-seeding complete!").green
70
101
  end
71
102
 
72
103
  desc 'Delete the sord_examples directory to allow the seeder to run again.'
73
104
  task :reset do
74
105
  FileUtils.rm_rf 'sord_examples' if File.directory?('sord_examples')
75
- puts 'Reset complete.'.green
106
+ puts Rainbow('Reset complete.').green
76
107
  end
77
- end
78
108
 
109
+ desc 'Typecheck each of the sord_examples rbi files.'
110
+ task :typecheck, [:verbose] do |t, args|
111
+ results_hash = {}
112
+ REPOS.each do |name, url|
113
+ Bundler.with_clean_env do
114
+ puts "srb tc sord_examples/#{name}.rbi --ignore sord.rbi 2>&1"
115
+ if args[:verbose]
116
+ output = system("srb tc sord_examples/#{name}.rbi --ignore sord.rbi 2>&1")
117
+ else
118
+ output = `srb tc sord_examples/#{name}.rbi --ignore sord.rbi 2>&1`.split("\n").last
119
+ results_hash[:"#{name}"] = output
120
+ end
121
+ end
122
+ end
123
+
124
+ unless args[:verbose]
125
+ puts Rainbow("Errors").bold
126
+ longest_name = results_hash.keys.map { |name| name.length }.max
127
+
128
+ # Replace all values in results_hash with integer by parsing it.
129
+ results_hash.each do |name, result|
130
+ result.scan(/Errors\: (\d+)/) { |match| result = match.first.to_i }
131
+ results_hash[name] = (result == "No errors! Great job.") ? 0 : result
132
+ end
133
+
134
+ # Print the right-aligned name and the number of errors, with different colors depending on the number of errors.
135
+ results_hash.each do |name, result|
136
+ spaces_needed = longest_name - name.length
137
+ output = "#{' ' * spaces_needed}#{name}: #{result}"
138
+ case result
139
+ when 0..5
140
+ puts Rainbow(output).green.bright
141
+ when 6..25
142
+ puts Rainbow(output).green
143
+ when 26..50
144
+ puts Rainbow(output).red
145
+ else
146
+ puts Rainbow(output).red.bright
147
+ end
148
+ end
149
+ # Report the Total.
150
+ puts Rainbow("#{' ' * (longest_name - 'Total'.length)}Total: #{results_hash.values.inject(0, :+)}").bold
151
+ end
152
+ end
153
+ end
data/exe/sord CHANGED
@@ -10,64 +10,81 @@ program :description, 'Generate Sorbet RBIs from YARD documentation'
10
10
  default_command :gen
11
11
  command :gen do |c|
12
12
  c.syntax = 'sord gen <output-file> [options]'
13
- c.description = 'Generates an RBI file from this directory\'s YARD docs'
14
- c.option '--[no-]comments', 'Controls informational/warning comments in the RBI file'
13
+ c.description = 'Generates a type signature file from this directory\'s YARD docs'
14
+ c.option '--rbi', 'Use Sorbet\'s RBI format'
15
+ c.option '--rbs', 'Use Steep/Ruby 3\'s RBS format'
16
+ c.option '--[no-]sord-comments', 'Controls informational/warning comments in the file'
15
17
  c.option '--[no-]regenerate', 'Controls whether YARD is executed before Sord runs'
16
18
  c.option '--break-params INTEGER', Integer, 'Break params onto their own lines if there are this many'
17
19
  c.option '--replace-errors-with-untyped', 'Uses T.untyped rather than SORD_ERROR_ constants'
20
+ c.option '--replace-unresolved-with-untyped', 'Uses T.untyped when Sord is unable to resolve a constant'
18
21
  c.option '--exclude-messages STRING', String, 'Blacklists a comma-separated string of log message types'
19
22
  c.option '--include-messages STRING', String, 'Whitelists a comma-separated string of log message types'
23
+ c.option '--keep-original-comments', 'Retains original YARD comments rather than converting them to Markdown'
24
+ c.option '--skip-constants', 'Excludes constants from generated file'
25
+ c.option '--use-original-initialize-return', 'Uses the specified return type for #initialize rather than void'
20
26
 
21
27
  c.action do |args, options|
22
28
  options.default(
23
- comments: true,
29
+ rbi: false,
30
+ rbs: false,
31
+ sord_comments: true,
24
32
  regenerate: true,
25
33
  break_params: 4,
26
34
  replace_errors_with_untyped: false,
35
+ replace_unresolved_with_untyped: false,
27
36
  exclude_messages: nil,
28
37
  include_messages: nil,
38
+ keep_original_comments: false,
39
+ skip_constants: false,
40
+ use_original_initialize_return: false,
29
41
  )
30
42
 
31
43
  if args.length != 1
32
44
  Sord::Logging.error('Must specify filename')
33
45
  exit 1
34
46
  end
47
+
48
+ plugin_options = options.__hash__
49
+ plugin_options[:exclude_options] = plugin_options[:exclude_options]&.split(',')
50
+ plugin_options[:include_options] = plugin_options[:include_options]&.split(',')
35
51
 
36
- if options.include_messages && options.exclude_messages
37
- Sord::Logging.error('Please specify only one of --include-messages and --exclude-messages.')
38
- exit 1
39
- elsif options.include_messages
40
- whitelist = options.include_messages.split(',').map { |x| x.downcase.to_sym }
41
- unless Sord::Logging.valid_types?(whitelist)
42
- Sord::Logging.error('Not all types on your --include-messages list are valid.')
43
- Sord::Logging.error("Valid options are: #{Sord::Logging::AVAILABLE_TYPES.map(&:to_s).join(', ')}")
44
- exit 1
45
- end
46
- Sord::Logging.enabled_types = whitelist | [:done]
47
- elsif options.exclude_messages
48
- blacklist = options.exclude_messages.split(',').map { |x| x.downcase.to_sym }
49
- unless Sord::Logging.valid_types?(blacklist)
50
- Sord::Logging.error('Not all types on your --include-messages list are valid.')
51
- Sord::Logging.error("Valid options are: #{Sord::Logging::AVAILABLE_TYPES.map(&:to_s).join(', ')}")
52
+ if !(plugin_options[:rbi] || plugin_options[:rbs])
53
+ if args.first
54
+ if args.first.end_with?('.rbi')
55
+ Sord::Logging.infer('Assuming from filename you wish to generate in RBI format')
56
+ plugin_options[:rbi] = true
57
+ elsif args.first.end_with?('.rbs')
58
+ Sord::Logging.infer('Assuming from filename you wish to generate in RBS format')
59
+ plugin_options[:rbs] = true
60
+ else
61
+ Sord::Logging.error('An output format could not be inferred from your filename; please specify --rbi or --rbs')
62
+ exit 1
63
+ end
64
+ else
65
+ Sord::Logging.error('No output format given; please specify --rbi or --rbs')
52
66
  exit 1
53
67
  end
54
- Sord::Logging.enabled_types = Sord::Logging::AVAILABLE_TYPES - blacklist
55
68
  end
56
69
 
57
- if options.regenerate
58
- begin
59
- Sord::Logging.info('Running YARD...')
60
- Bundler.with_clean_env do
61
- system('bundle exec yard')
62
- end
63
- rescue Errno::ENOENT
64
- Sord::Logging.error('The YARD tool could not be found on your PATH.')
65
- Sord::Logging.error('You may need to run \'gem install yard\'.')
66
- Sord::Logging.error('If documentation has already been generated, pass --no-regenerate to Sord.')
67
- exit 1
68
- end
70
+ if (plugin_options[:rbi] && plugin_options[:rbs])
71
+ Sord::Logging.error('You cannot specify both --rbi and --rbs; please use only one')
72
+ exit 1
73
+ end
74
+
75
+ plugin = Sord::ParlourPlugin.new(plugin_options)
76
+
77
+ if plugin_options[:rbi]
78
+ klass = Parlour::RbiGenerator
79
+ generator_method = :rbi
80
+ elsif plugin_options[:rbs]
81
+ klass = Parlour::RbsGenerator
82
+ generator_method = :rbs
69
83
  end
70
84
 
71
- Sord::RbiGenerator.new(options.__hash__).run(args.first)
85
+ plugin.parlour = klass.new(break_params: plugin_options[:break_params])
86
+ plugin.generate(plugin.parlour.root)
87
+
88
+ File.write(args.first, plugin.parlour.send(generator_method))
72
89
  end
73
90
  end