lap 0.2 → 0.2.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.
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