lap 0.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2175fa843ad4fa64403068441af0c6ca2be15b930746aa3af383dab7ed670822
4
- data.tar.gz: d28106befda1f37218423c1ba046934cc31e73025fdd60a1c96e45db646913f1
3
+ metadata.gz: ea16dd85703fad45b818f07cd284255e743d266f56e63bc77467b2194a79ca08
4
+ data.tar.gz: cb063132aa918f79858f1724fe05b43549778ae0d77c7b95e6b90f7e69d6b6e0
5
5
  SHA512:
6
- metadata.gz: 355d4a32d74d86d51cfa2dd9a263c6f72301486a53012fa1873c66e6054d8a90080d1c7b75a6fb9ad1818767f00c72972f880a62979f8c8e14f9e1d26f515b61
7
- data.tar.gz: 1f63b97bc3a9c19ca9d5f45d159a6166c842ad19bb2f95f04f6b217165a3d9fdc428fa2ea05aa761a2e46100e13b9aaae28a7067b37accab85d849390959f436
6
+ metadata.gz: ddc0a9ce6cedb86d32bc7bf8028fd97f43400fe2bcb0ad0f5bdc4ebc5f4afbc2d19c21ee998cccbf6d81b556968438eb9e652bcdc0a92caac105fa67c4064336
7
+ data.tar.gz: d4e403af9411531c95fb10379ff4e6fc1c3fcd96efb141e3f3b143d2e191ef971631434fb3443db74b914d4c55bd5b872fd312bbf2f7a19b28e58165d3a4411b
@@ -1,23 +1,48 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lap (0.2)
4
+ lap (0.2.1)
5
5
  rbs
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ activesupport (6.0.3.4)
11
+ concurrent-ruby (~> 1.0, >= 1.0.2)
12
+ i18n (>= 0.7, < 2)
13
+ minitest (~> 5.1)
14
+ tzinfo (~> 1.1)
15
+ zeitwerk (~> 2.2, >= 2.2.2)
16
+ ast (2.4.1)
17
+ ast_utils (0.3.0)
18
+ parser (~> 2.4)
19
+ thor (>= 0.19)
10
20
  byebug (11.1.3)
11
21
  coderay (1.1.3)
22
+ concurrent-ruby (1.1.7)
12
23
  diff-lcs (1.4.4)
24
+ ffi (1.13.1)
25
+ i18n (1.8.5)
26
+ concurrent-ruby (~> 1.0)
27
+ language_server-protocol (3.15.0.1)
28
+ listen (3.3.3)
29
+ rb-fsevent (~> 0.10, >= 0.10.3)
30
+ rb-inotify (~> 0.9, >= 0.9.10)
13
31
  method_source (1.0.0)
32
+ minitest (5.14.2)
33
+ parser (2.7.2.0)
34
+ ast (~> 2.4.1)
14
35
  pry (0.13.1)
15
36
  coderay (~> 1.1)
16
37
  method_source (~> 1.0)
17
38
  pry-byebug (3.9.0)
18
39
  byebug (~> 11.0)
19
40
  pry (~> 0.13.0)
41
+ rainbow (3.0.0)
20
42
  rake (12.3.3)
43
+ rb-fsevent (0.10.4)
44
+ rb-inotify (0.10.1)
45
+ ffi (~> 1.0)
21
46
  rbs (0.17.0)
22
47
  rspec (3.10.0)
23
48
  rspec-core (~> 3.10.0)
@@ -32,6 +57,19 @@ GEM
32
57
  diff-lcs (>= 1.2.0, < 2.0)
33
58
  rspec-support (~> 3.10.0)
34
59
  rspec-support (3.10.0)
60
+ steep (0.36.0)
61
+ activesupport (>= 5.1)
62
+ ast_utils (~> 0.3.0)
63
+ language_server-protocol (~> 3.15.0.1)
64
+ listen (~> 3.0)
65
+ parser (~> 2.7.0)
66
+ rainbow (>= 2.2.2, < 4.0)
67
+ rbs (~> 0.17.0)
68
+ thor (1.0.1)
69
+ thread_safe (0.3.6)
70
+ tzinfo (1.2.8)
71
+ thread_safe (~> 0.1)
72
+ zeitwerk (2.4.2)
35
73
 
36
74
  PLATFORMS
37
75
  ruby
@@ -41,6 +79,7 @@ DEPENDENCIES
41
79
  pry-byebug
42
80
  rake (~> 12.0)
43
81
  rspec (~> 3.0)
82
+ steep
44
83
 
45
84
  BUNDLED WITH
46
85
  2.1.4
data/README.md CHANGED
@@ -23,6 +23,8 @@ module Bank
23
23
  attr_reader owner: Bank::Customer
24
24
  attr_reader balance: Float
25
25
 
26
+ def initialize: (Bank::Customer owner, Float interest_rate, ?Float balance) -> void
27
+
26
28
  type date_or_dt = Date | DateTime
27
29
 
28
30
  # can optionally specify when the transaction should take place
@@ -51,10 +53,8 @@ module Bank
51
53
  attr_reader :owner
52
54
  attr_reader :balance
53
55
 
54
- def initialize(owner, interest_rate, balance)
55
- @owner = owner
56
- @interest_rate = interest_rate
57
- @balance = balance
56
+ def initialize(owner, interest_rate, balance = nil)
57
+ # returns void
58
58
  end
59
59
 
60
60
  # can optionally specify when the transaction should take place
@@ -84,7 +84,7 @@ module Bank
84
84
  attr_reader :owner
85
85
  attr_reader :balance
86
86
 
87
- def initialize(owner, interest_rate, balance)
87
+ def initialize(owner, interest_rate, balance = 0)
88
88
  @owner = owner
89
89
  @interest_rate = interest_rate
90
90
  @balance = balance
@@ -110,12 +110,33 @@ end
110
110
 
111
111
  From here, you now have some ruby code which you can [type check](https://github.com/soutaro/steep)!
112
112
 
113
+ ### Experimental:
114
+
115
+ There is an experimental feature which allows you to specify some ruby logic *within* your rbs files
116
+ for your methods. You specify it between `@!begin` and `@!end`, eg.:
117
+
118
+ ```ruby
119
+ # take some moeny out of the customers account
120
+ # @!begin
121
+ # @balance -= amount
122
+ # @!end
123
+ def withdraw(Float amount) -> Float
124
+ ```
125
+ This would produce:
126
+
127
+ ```ruby
128
+ # take some moeny out of the customers account
129
+ def withdraw(amount)
130
+ @balance -= amount
131
+ end
132
+ ```
133
+
113
134
  ## Installation
114
135
 
115
136
  Add this line to your application's Gemfile:
116
137
 
117
138
  ```ruby
118
- gem 'cutter'
139
+ gem 'lap'
119
140
  ```
120
141
 
121
142
  And then execute:
@@ -124,7 +145,7 @@ And then execute:
124
145
 
125
146
  Or install it yourself as:
126
147
 
127
- $ gem install cutter
148
+ $ gem install lap
128
149
 
129
150
  ## Configuration
130
151
 
@@ -132,7 +153,9 @@ You can specify preferences in a `.lap.yml` file in your project directory. Exam
132
153
 
133
154
  ```yml
134
155
  indent: 4 # default is 2
135
- # this is it for now, more to come
156
+ frozen_string_literals: false # add 'frozen_string_literal: true' to top of file; default is true
157
+ # preferred line length in characters; default is 100. Note "preferred" - not always a guarantee
158
+ preferred_line_length: 80
136
159
  ```
137
160
 
138
161
  ## Coverage
@@ -163,27 +186,6 @@ procs|⚠️
163
186
  constants|⚠️
164
187
  interfaces|⚠️
165
188
 
166
- ### Experimental:
167
-
168
- There is an experimental feature which allows you to specify some ruby logic *within* your rbs files
169
- for your methods. You specify it between `@!begin` and `@!end`, eg.:
170
-
171
- ```ruby
172
- # take some moeny out of the customers account
173
- # @!begin
174
- # @balance -= amount
175
- # @!end
176
- def withdraw(Float amount) -> Float
177
- ```
178
- This would produce:
179
-
180
- ```ruby
181
- # take some moeny out of the customers account
182
- def withdraw(amount)
183
- @balance -= amount
184
- end
185
- ```
186
-
187
189
  ## Development
188
190
 
189
191
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -0,0 +1,10 @@
1
+ target :app do
2
+ signature "sig"
3
+
4
+ library "rbs"
5
+ library "pathname"
6
+ library "set"
7
+ library "logger"
8
+
9
+ check "lib"
10
+ end
@@ -22,4 +22,5 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
  spec.add_runtime_dependency "rbs"
24
24
  spec.add_development_dependency "pry-byebug"
25
+ spec.add_development_dependency "steep"
25
26
  end
data/lib/lap.rb CHANGED
@@ -44,7 +44,9 @@ module Lap
44
44
  end
45
45
 
46
46
  puts FROZEN_STRING_COMMENT if Lap::Config[:frozen_string_literals]
47
- puts output.join("\n")
47
+ out = output.join("\n")
48
+ puts out
49
+ out
48
50
  end
49
51
  end
50
52
  end
@@ -22,35 +22,35 @@ module Lap
22
22
  def contents
23
23
  @contents ||= begin
24
24
  if @has_contents
25
- member_indent = Lap::Config[:indent] * (@indent_level + 1)
26
- members = @node.members.map do |m|
27
- case m
25
+ member_indent = (Lap::Config[:indent] * (@indent_level + 1)).to_i
26
+ members = @node.members.map do |member|
27
+ case member
28
28
  when RBS::AST::Members::MethodDefinition
29
- Lap::Method.new(m, @indent_level + 1).render
29
+ Lap::Method.new(member, @indent_level + 1).render
30
30
  when RBS::AST::Declarations::Class
31
- self.class.new(m, @indent_level + 1).render
31
+ self.class.new(member, @indent_level + 1).render
32
32
  when RBS::AST::Declarations::Module
33
- Lap::Module.new(m, @indent_level + 1).render
33
+ Lap::Module.new(member, @indent_level + 1).render
34
34
  when RBS::AST::Members::AttrReader
35
- with_comment(m, "attr_reader :#{m.name}").indent(member_indent)
35
+ with_comment(member, "attr_reader :#{member.name}").indent(member_indent)
36
36
  when RBS::AST::Members::AttrWriter
37
- with_comment(m, "attr_writer :#{m.name}").indent(member_indent)
37
+ with_comment(member, "attr_writer :#{member.name}").indent(member_indent)
38
38
  when RBS::AST::Members::AttrAccessor
39
- with_comment(m, "attr_accessor :#{m.name}").indent(member_indent)
39
+ with_comment(member, "attr_accessor :#{member.name}").indent(member_indent)
40
40
  when RBS::AST::Members::Public
41
41
  "public\n".indent(member_indent)
42
42
  when RBS::AST::Members::Private
43
43
  "private\n".indent(member_indent)
44
44
  when RBS::AST::Members::Include
45
- with_comment(m, "include #{m.name}").indent(member_indent)
45
+ with_comment(member, "include #{member.name}").indent(member_indent)
46
46
  when RBS::AST::Members::Extend
47
- with_comment(m, "extend #{m.name}").indent(member_indent)
47
+ with_comment(member, "extend #{member.name}").indent(member_indent)
48
48
  when RBS::AST::Declarations::Constant
49
- Lap::Constant.new(m, @indent_level + 1).render
49
+ Lap::Constant.new(member, @indent_level + 1).render
50
50
  when RBS::AST::Declarations::Alias
51
51
  # no-op: not present in ruby
52
52
  else
53
- warn "Unsupported member for classes: #{m}"
53
+ warn "Unsupported member for classes: #{member}"
54
54
  end
55
55
  end
56
56
  "\n#{members.compact.join("\n")}"
@@ -8,7 +8,7 @@ module Lap
8
8
  end
9
9
 
10
10
  def render
11
- "#{name} = #{value}\n".indent(Lap::Config[:indent] * @indent_level)
11
+ "#{name} = #{value}\n".indent((Lap::Config[:indent] * @indent_level).to_i)
12
12
  end
13
13
 
14
14
  private
@@ -8,11 +8,36 @@ module Lap
8
8
 
9
9
  def args(rp, rkw, op, okw)
10
10
  if [rp, rkw, op, okw].any? { |arg| arg.length.positive? }
11
+ arg_counter = 1
11
12
  contents = [
12
- rp.map { |pos| pos.name || pos.type.name.name.downcase },
13
- op.map { |pos| "#{pos.name || pos.type.name.name.downcase} = #{CLASS_TO_LITERAL[pos.type.name.name] || "nil"}" },
13
+ rp.map do |pos|
14
+ arg_counter += 1
15
+ pos.name || begin
16
+ if pos.type.respond_to?(:name)
17
+ pos.type.name.name.downcase
18
+ else
19
+ "arg#{arg_counter}"
20
+ end
21
+ end
22
+ end,
23
+ op.map do |pos|
24
+ name = nil
25
+ value = "nil"
26
+ if pos.name
27
+ name = pos.name
28
+ elsif pos.type.respond_to?(:name)
29
+ name = pos.type.name.name.downcase
30
+ value = CLASS_TO_LITERAL[pos.type.name.name]
31
+ else
32
+ name = "arg#{arg_counter}"
33
+ end
34
+ "#{name} = #{value}"
35
+ end,
14
36
  rkw.map { |name, _| "#{name}:" },
15
- okw.map { |name, t| "#{name}: #{CLASS_TO_LITERAL[t.type.name.name]}" },
37
+ okw.map do |name, tipe|
38
+ value = tipe.type.respond_to?(:name) ? CLASS_TO_LITERAL[tipe.type.name.name] : "nil"
39
+ "#{name}: #{value}"
40
+ end,
16
41
  ].reject(&:empty?).flatten.join(", ")
17
42
  "(#{contents})"
18
43
  end
@@ -20,7 +45,7 @@ module Lap
20
45
 
21
46
  def with_comment(node, output)
22
47
  if (comment = node.comment&.string)
23
- "#{comment.lines.map { |l| "# #{l}" }.join}#{output}"
48
+ "#{comment.lines.map { |line| "# #{line}" }.join}#{output}"
24
49
  else
25
50
  output
26
51
  end
@@ -33,10 +58,10 @@ module Lap
33
58
  .string
34
59
  .lines
35
60
  comment = []
36
- lines.each do |l|
37
- break if l.start_with? "@!begin"
61
+ lines.each do |line|
62
+ break if line.start_with? "@!begin"
38
63
 
39
- comment << "# #{l}"
64
+ comment << "# #{line}"
40
65
  end
41
66
 
42
67
  comment.join
@@ -16,19 +16,19 @@ module Lap
16
16
  #{body}
17
17
  end
18
18
  METHOD
19
- result.indent(Lap::Config[:indent] * @indent_level)
19
+ result.indent((Lap::Config[:indent] * @indent_level).to_i)
20
20
  end
21
21
 
22
22
  private
23
23
 
24
- def return_type(t)
25
- case t
24
+ def return_type(tipe)
25
+ case tipe
26
26
  when RBS::Types::Literal
27
- t
28
- when ->(t) { t.class.to_s.start_with? "RBS::Types::Bases" }
29
- "# returns #{t}"
27
+ tipe.inspect
28
+ when ->(tp) { tp.class.to_s.start_with? "RBS::Types::Bases" }
29
+ "# returns #{tipe}"
30
30
  else
31
- "# TODO: return #{t.name.name}"
31
+ "# TODO: return #{tipe.name.name}"
32
32
  end
33
33
  end
34
34
 
@@ -48,7 +48,6 @@ module Lap
48
48
  comment = @node.comment
49
49
  logic = ""
50
50
  if comment
51
- real_comment = []
52
51
  logic = []
53
52
  has_logic = false
54
53
  comment.string.lines.each do |line|
@@ -58,12 +57,9 @@ module Lap
58
57
  logic << line
59
58
  elsif line.lstrip.start_with? "@!begin"
60
59
  has_logic = true
61
- else
62
- real_comment << line
63
60
  end
64
61
  end
65
62
  logic = logic.join
66
- comment = real_comment.join
67
63
  end
68
64
  if logic.length.positive?
69
65
  logic
@@ -21,20 +21,20 @@ module Lap
21
21
  def contents
22
22
  @contents ||= begin
23
23
  if @has_contents
24
- members = @node.members.map do |m|
25
- case m
24
+ members = @node.members.map do |member|
25
+ case member
26
26
  when RBS::AST::Members::MethodDefinition
27
- Lap::Method.new(m, @indent_level + 1).render
27
+ Lap::Method.new(member, @indent_level + 1).render
28
28
  when RBS::AST::Declarations::Class
29
- Lap::Class.new(m, @indent_level + 1).render
29
+ Lap::Class.new(member, @indent_level + 1).render
30
30
  when RBS::AST::Declarations::Module
31
- self.class.new(m, @indent_level + 1).render
31
+ self.class.new(member, @indent_level + 1).render
32
32
  when RBS::AST::Declarations::Constant
33
- Lap::Constant.new(m, @indent_level + 1).render
33
+ Lap::Constant.new(member, @indent_level + 1).render
34
34
  when RBS::AST::Declarations::Alias
35
35
  # no-op: not present in ruby
36
36
  else
37
- warn "Unsupported member for modules: #{m}"
37
+ warn "Unsupported member for modules: #{member}"
38
38
  end
39
39
  end
40
40
  "\n#{members.join("\n")}"
@@ -1,3 +1,3 @@
1
1
  module Lap
2
- VERSION = "0.2"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -1,23 +1,26 @@
1
- require "rbs"
2
- require "pathname"
3
- require "yaml"
4
- require "lap/version"
5
- require "lap/helpers"
6
- require "lap/class"
7
- require "lap/method"
8
- require "lap/module"
9
- require "lap/constant"
10
- require "core_ext/string"
1
+ # require "rbs"
2
+ # require "pathname"
3
+ # require "yaml"
4
+ # require "lap/version"
5
+ # require "lap/helpers"
6
+ # require "lap/class"
7
+ # require "lap/method"
8
+ # require "lap/module"
9
+ # require "lap/constant"
10
+ # require "core_ext/string"
11
11
 
12
12
  module Lap
13
- CONFIG_FILENAME = ".lap.yml"
14
- DEFAULT_CONFIG = {
15
- indent: 2,
16
- frozen_string_literals: true,
17
- preferred_line_length: 100
13
+ CONFIG_FILENAME: ".lap.yml"
14
+ type config = {
15
+ indent: Integer,
16
+ frozen_string_literals: bool,
17
+ preferred_line_length: Integer
18
18
  }
19
- FROZEN_STRING_COMMENT = "# frozen_string_literal: true\n\n"
20
- Config = DEFAULT_CONFIG
19
+ DEFAULT_CONFIG: config
20
+ FROZEN_STRING_COMMENT: "# frozen_string_literal: true
21
+
22
+ "
23
+ Config: config
21
24
 
22
25
  class Output
23
26
  # @!begin
@@ -0,0 +1,15 @@
1
+ module Lap
2
+ class Constant
3
+ def initialize: (RBS::AST::Declarations::Constant node, Integer indent_level) -> void
4
+
5
+ def render: () -> String
6
+
7
+ private
8
+
9
+ def name: () -> String
10
+
11
+ def value: () -> String
12
+
13
+ def record_contents: (Hash[Symbol, untyped] hsh) -> String
14
+ end
15
+ end
@@ -22,7 +22,20 @@ module Lap
22
22
  Hash[Symbol, RBS::Types::Function::Param] rkw,
23
23
  Array[RBS::Types::Function::Param] op,
24
24
  Hash[Symbol, RBS::Types::Function::Param] okw
25
- ) -> String
25
+ ) -> (String | nil)
26
+
27
+ type commentable = RBS::AST::Declarations::t |
28
+ RBS::AST::Members::InstanceVariable |
29
+ RBS::AST::Members::ClassInstanceVariable |
30
+ RBS::AST::Members::ClassVariable |
31
+ RBS::AST::Members::Include |
32
+ RBS::AST::Members::Extend |
33
+ RBS::AST::Members::Prepend |
34
+ RBS::AST::Members::MethodDefinition |
35
+ RBS::AST::Members::AttrReader |
36
+ RBS::AST::Members::AttrWriter |
37
+ RBS::AST::Members::AttrAccessor |
38
+ RBS::AST::Members::Alias
26
39
 
27
40
  # @!begin
28
41
  # if (comment = node.comment&.string)
@@ -31,7 +44,7 @@ module Lap
31
44
  # output
32
45
  # end
33
46
  # @!end
34
- def with_comment: (RBS::AST node, String output) -> String
47
+ def with_comment: (commentable node, String output) -> String
35
48
 
36
49
  # @!begin
37
50
  # return nil unless node.comment
@@ -48,6 +61,6 @@ module Lap
48
61
  #
49
62
  # comment.join
50
63
  # @!end
51
- def get_comment: (RBS::AST node) -> String
64
+ def get_comment: (commentable node) -> (String | nil)
52
65
  end
53
66
  end
@@ -31,7 +31,7 @@ module Lap
31
31
  # "# TODO: return #{t.name.name}"
32
32
  # end
33
33
  # @!end
34
- def return_type: (RBS::Types type) -> String
34
+ def return_type: (RBS::Types::t t) -> String
35
35
 
36
36
  # @!begin
37
37
  # @arguments ||= begin
@@ -43,7 +43,7 @@ module Lap
43
43
  # args(rp, rkw, op, okw)
44
44
  # end
45
45
  # @!end
46
- def arguments: () -> String
46
+ def arguments: () -> (String | nil)
47
47
 
48
48
  # @!begin
49
49
  # @body ||= begin
@@ -1,3 +1,3 @@
1
1
  module Lap
2
- VERSION: "0.2"
2
+ VERSION: "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lap
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph Johansen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-30 00:00:00.000000000 Z
11
+ date: 2020-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rbs
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: steep
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: Don't write your code, and rbs types! Write the rbs types first, then
42
56
  generate a template to fill in with business logic.
43
57
  email:
@@ -56,6 +70,7 @@ files:
56
70
  - LICENSE.txt
57
71
  - README.md
58
72
  - Rakefile
73
+ - Steepfile
59
74
  - bin/console
60
75
  - bin/setup
61
76
  - exe/lap
@@ -73,6 +88,7 @@ files:
73
88
  - sig/core_ext/string.rbs
74
89
  - sig/lap.rbs
75
90
  - sig/lap/class.rbs
91
+ - sig/lap/constant.rbs
76
92
  - sig/lap/helpers.rbs
77
93
  - sig/lap/method.rbs
78
94
  - sig/lap/module.rbs