lap 0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 67d48053cc0e3fe1a6f28c32b764c69497c2a3416e7c21ee7eeedd36b7768e33
4
+ data.tar.gz: 86b2d87a47f3e77964f14f6b876553a1365207a0bb1522df8f48cae43cbefd21
5
+ SHA512:
6
+ metadata.gz: 1dfe0739b7d757c9d67474b02c2f4c832f217b8a49129c97e068fa048d661dc066883e162462feb5a5b3fd7b8bd60b4f965f4921898a79c374a0db38f299fad4
7
+ data.tar.gz: 8b3f3a348b71222475155bfe7271757dbaf6ab505c0e6166e3c31140794f9a3cc25ba9a06d3ac6886af8f2098130cb8a2b503a148c015933afc143e0c43be939
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.lap.yml ADDED
@@ -0,0 +1 @@
1
+ indent: 2
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.7.1
6
+ before_install: gem install bundler -v 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in cutter.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "rspec", "~> 3.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,46 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ lap (0.1)
5
+ rbs
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ byebug (11.1.3)
11
+ coderay (1.1.3)
12
+ diff-lcs (1.4.4)
13
+ method_source (1.0.0)
14
+ pry (0.13.1)
15
+ coderay (~> 1.1)
16
+ method_source (~> 1.0)
17
+ pry-byebug (3.9.0)
18
+ byebug (~> 11.0)
19
+ pry (~> 0.13.0)
20
+ rake (12.3.3)
21
+ rbs (0.17.0)
22
+ rspec (3.10.0)
23
+ rspec-core (~> 3.10.0)
24
+ rspec-expectations (~> 3.10.0)
25
+ rspec-mocks (~> 3.10.0)
26
+ rspec-core (3.10.0)
27
+ rspec-support (~> 3.10.0)
28
+ rspec-expectations (3.10.0)
29
+ diff-lcs (>= 1.2.0, < 2.0)
30
+ rspec-support (~> 3.10.0)
31
+ rspec-mocks (3.10.0)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.10.0)
34
+ rspec-support (3.10.0)
35
+
36
+ PLATFORMS
37
+ ruby
38
+
39
+ DEPENDENCIES
40
+ lap!
41
+ pry-byebug
42
+ rake (~> 12.0)
43
+ rspec (~> 3.0)
44
+
45
+ BUNDLED WITH
46
+ 2.1.4
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Joseph Johansen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,200 @@
1
+ # Lap
2
+
3
+ Don't write your code, *and* rbs types! Write the rbs types first, then generate a template to
4
+ fill in with business logic.
5
+
6
+ A `lap`idary (or `lap`idist) is someone who cuts, polishes, or engraves precious stones.
7
+
8
+ ## Usage
9
+
10
+ ```sh
11
+ $ lap sig/file.rbs # outputs to stdout
12
+ $ lap sig/file.rbs > lib/file.rb # output into a file
13
+ ```
14
+
15
+ ## Example
16
+
17
+ 0. Plan your project/module/class by writing some blueprints:
18
+ ```ruby
19
+ # sig/lib/bank/account.rbs
20
+ module Bank
21
+ class Account
22
+ attr_reader interest_rate: Float
23
+ attr_reader owner: Bank::Customer
24
+ attr_reader balance: Float
25
+
26
+ type date_or_dt = Date | DateTime
27
+
28
+ # can optionally specify when the transaction should take place
29
+ def deposit: (Float amount, ?when: date_or_dt) -> Float
30
+
31
+ # can optionally specify when the transaction should take place
32
+ def withdraw: (Float amount, ?when: date_or_dt) -> Float
33
+
34
+ # must filter results by specifying `to` and `from` params
35
+ def transactions: (from: date_or_dt, to: date_or_dt) -> Array[Bank::Transaction]
36
+ end
37
+ end
38
+ ```
39
+
40
+ 1. Generate your ruby templates
41
+
42
+ ```sh
43
+ $ lap sig/lib/bank/account.rbs > lib/bank/account.rb
44
+ ```
45
+
46
+ (Generates lib/bank/account.rb)
47
+ ```ruby
48
+ module Bank
49
+ class Account
50
+ attr_reader :interest_rate
51
+ attr_reader :owner
52
+ attr_reader :balance
53
+
54
+ def initialize(owner, interest_rate, balance)
55
+ @owner = owner
56
+ @interest_rate = interest_rate
57
+ @balance = balance
58
+ end
59
+
60
+ # can optionally specify when the transaction should take place
61
+ def deposit(amount, when: nil)
62
+ # TODO: return Float
63
+ end
64
+
65
+ # can optionally specify when the transaction should take place
66
+ def withdraw(amount, when: nil)
67
+ # TODO: return Float
68
+ end
69
+
70
+ # must filter results by specifying `to` and `from` params
71
+ def transactions(to:, from:)
72
+ # TODO: return Array
73
+ end
74
+ end
75
+ end
76
+ ```
77
+
78
+ 2. Fill in your business logic!
79
+
80
+ ```ruby
81
+ module Bank
82
+ class Account
83
+ attr_reader :interest_rate
84
+ attr_reader :owner
85
+ attr_reader :balance
86
+
87
+ def initialize(owner, interest_rate, balance)
88
+ @owner = owner
89
+ @interest_rate = interest_rate
90
+ @balance = balance
91
+ end
92
+
93
+ # can optionally specify when the transaction should take place
94
+ def deposit(amount, when: nil)
95
+ @balance += amount
96
+ end
97
+
98
+ # can optionally specify when the transaction should take place
99
+ def withdraw(amount, when: nil)
100
+ @balance -= amount
101
+ end
102
+
103
+ # must filter results by specifying `to` and `from` params
104
+ def transactions(to:, from:)
105
+ Transaction.where("created_at BETWEEN ? AND ?", from, to)
106
+ end
107
+ end
108
+ end
109
+ ```
110
+
111
+ From here, you now have some ruby code which you can [type check](https://github.com/soutaro/steep)!
112
+
113
+ ## Installation
114
+
115
+ Add this line to your application's Gemfile:
116
+
117
+ ```ruby
118
+ gem 'cutter'
119
+ ```
120
+
121
+ And then execute:
122
+
123
+ $ bundle install
124
+
125
+ Or install it yourself as:
126
+
127
+ $ gem install cutter
128
+
129
+ ## Configuration
130
+
131
+ You can specify preferences in a `.lap.yml` file in your project directory. Example
132
+
133
+ ```yml
134
+ indent: 4 # default is 2
135
+ # this is it for now, more to come
136
+ ```
137
+
138
+ ## Coverage
139
+
140
+ Currently not every feature of RBS is supported - yet! (contributions
141
+ welcome!)
142
+
143
+ Feature|Coverage
144
+ ---|---
145
+ classes (includes nested)|✅
146
+ modules (includes nested)|✅
147
+ class methods|✅
148
+ instance methods|✅
149
+ required positional arguments|✅
150
+ optional positional arguments|✅
151
+ required keyword arguments|✅
152
+ optional keyword arguments|✅
153
+ method comments|✅
154
+ access modifiers|✅
155
+ attr_reader|✅
156
+ attr_writer|✅
157
+ attr_accessor|✅
158
+ include|✅
159
+ extend|✅
160
+ methods with blocks|✅
161
+ method overloading|⚠️
162
+ procs|⚠️
163
+ constants|⚠️
164
+ interfaces|⚠️
165
+
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
+ ## Development
188
+
189
+ 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.
190
+
191
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
192
+
193
+ ## Contributing
194
+
195
+ Bug reports and pull requests are welcome on GitHub at https://github.com/johansenja/lap.
196
+
197
+
198
+ ## License
199
+
200
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "cutter"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/lap ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "lap"
5
+
6
+ pn = ARGV[0]
7
+
8
+ raise "no path specified" unless pn
9
+
10
+ Lap::Output.new(pn).render
data/lap.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ require_relative 'lib/lap/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "lap"
5
+ spec.version = Lap::VERSION
6
+ spec.authors = ["Joseph Johansen"]
7
+ spec.email = ["joe@stotles.com"]
8
+
9
+ spec.summary = %q{Generate ruby from rbs blueprints}
10
+ spec.description = "Don't write your code, and rbs types! Write the rbs types first, then generate a template to fill in with business logic."
11
+ spec.license = "MIT"
12
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
13
+ spec.homepage = "https://github.com/johansenja/lap"
14
+
15
+ # Specify which files should be added to the gem when it is released.
16
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+ spec.add_runtime_dependency "rbs"
24
+ spec.add_development_dependency "pry-byebug"
25
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class String
4
+ def indent(amount)
5
+ gsub(/^/, " " * amount)
6
+ end
7
+ end
data/lib/lap.rb ADDED
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rbs"
4
+ require "pathname"
5
+ require "lap/version"
6
+ require "lap/helpers"
7
+ require "lap/class"
8
+ require "lap/method"
9
+ require "lap/module"
10
+ require "pry-byebug"
11
+ require "core_ext/string"
12
+
13
+ module Lap
14
+ CONFIG_FILENAME = ".lap.yml"
15
+ DEFAULT_CONFIG = {
16
+ indent: 2
17
+ }
18
+ fp = File.join(File.dirname(__FILE__), "..", CONFIG_FILENAME)
19
+ yml_config = Pathname(fp).exist? ? YAML.safe_load(File.read(fp)) : {}
20
+ Config = DEFAULT_CONFIG.merge(yml_config.transform_keys(&:to_sym))
21
+
22
+ class Output
23
+ def initialize(pathname)
24
+ loader = RBS::EnvironmentLoader.new(core_root: nil) # don't pollute the env with ruby stdlib
25
+ loader.add(path: Pathname(pathname))
26
+ @env = RBS::Environment.from_loader(loader).resolve_type_names
27
+ end
28
+
29
+ def render
30
+ output = @env.declarations.map do |decl|
31
+ case decl
32
+ when RBS::AST::Declarations::Class
33
+ Lap::Class.new(decl).render
34
+ when RBS::AST::Declarations::Module
35
+ Lap::Module.new(decl).render
36
+ else
37
+ "TODO: #{decl}"
38
+ end
39
+ end
40
+
41
+ puts output.join("\n")
42
+ end
43
+ end
44
+ end
data/lib/lap/class.rb ADDED
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lap
4
+ class Class
5
+ include Helpers
6
+
7
+ def initialize(node, indent_level = 0)
8
+ @node = node
9
+ @indent_level = indent_level
10
+ @has_contents = !@node.members.empty?
11
+ end
12
+
13
+ def render
14
+ superclass = @node.super_class ? " < #{@node.super_class.name.name}" : ""
15
+ self_indent = " " * (Lap::Config[:indent] * @indent_level)
16
+ comment = get_comment(@node)
17
+ "#{comment}#{self_indent}class #{@node.name.name}#{superclass}#{contents}#{self_indent if @has_contents}end\n"
18
+ end
19
+
20
+ private
21
+
22
+ def contents
23
+ @contents ||= begin
24
+ if @has_contents
25
+ member_indent = Lap::Config[:indent] * (@indent_level + 1)
26
+ members = @node.members.map do |m|
27
+ case m
28
+ when RBS::AST::Members::MethodDefinition
29
+ Lap::Method.new(m, @indent_level + 1).render
30
+ when RBS::AST::Declarations::Class
31
+ self.class.new(m, @indent_level + 1).render
32
+ when RBS::AST::Declarations::Module
33
+ Lap::Module.new(m, @indent_level + 1).render
34
+ when RBS::AST::Members::AttrReader
35
+ with_comment(m, "attr_reader :#{m.name}").indent(member_indent)
36
+ when RBS::AST::Members::AttrWriter
37
+ with_comment(m, "attr_writer :#{m.name}").indent(member_indent)
38
+ when RBS::AST::Members::AttrAccessor
39
+ with_comment(m, "attr_accessor :#{m.name}").indent(member_indent)
40
+ when RBS::AST::Members::Public
41
+ "public\n".indent(member_indent)
42
+ when RBS::AST::Members::Private
43
+ "private\n".indent(member_indent)
44
+ when RBS::AST::Members::Include
45
+ with_comment(m, "include #{m.name}").indent(member_indent)
46
+ when RBS::AST::Members::Extend
47
+ with_comment(m, "extend #{m.name}").indent(member_indent)
48
+ when RBS::AST::Declarations::Alias
49
+ # no-op: not present in ruby
50
+ else
51
+ warn "Unsupported member for classes: #{m}"
52
+ end
53
+ end
54
+ "\n#{members.compact.join("\n")}"
55
+ else
56
+ "; "
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,45 @@
1
+ module Lap
2
+ module Helpers
3
+ CLASS_TO_LITERAL = {
4
+ String: '""',
5
+ Array: '[]',
6
+ Hash: "{}",
7
+ }
8
+
9
+ def args(rp, rkw, op, okw)
10
+ if [rp, rkw, op, okw].any? { |arg| arg.length.positive? }
11
+ 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]}" },
14
+ rkw.map { |name, _| "#{name}:" },
15
+ okw.map { |name, t| "#{name}: #{CLASS_TO_LITERAL[t.type.name.name]}" },
16
+ ].reject(&:empty?).flatten.join(", ")
17
+ "(#{contents})"
18
+ end
19
+ end
20
+
21
+ def with_comment(node, output)
22
+ if (comment = node.comment&.string)
23
+ "#{comment.lines.map { |l| "# #{l}" }.join}#{output}"
24
+ else
25
+ output
26
+ end
27
+ end
28
+
29
+ def get_comment(node)
30
+ return nil unless node.comment
31
+
32
+ lines = node.comment
33
+ .string
34
+ .lines
35
+ comment = []
36
+ lines.each do |l|
37
+ break if l.start_with? "@!begin"
38
+
39
+ comment << "# #{l}"
40
+ end
41
+
42
+ comment.join
43
+ end
44
+ end
45
+ end
data/lib/lap/method.rb ADDED
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lap
4
+ class Method
5
+ include Helpers
6
+
7
+ def initialize(node, indent_level = 0)
8
+ @node = node
9
+ @indent_level = indent_level
10
+ end
11
+
12
+ def render
13
+ comment = get_comment(@node)
14
+ result = <<~METHOD
15
+ #{comment}def #{"self." unless @node.kind == :instance}#{@node.name}#{arguments}
16
+ #{body}
17
+ end
18
+ METHOD
19
+ result.indent(Lap::Config[:indent] * @indent_level)
20
+ end
21
+
22
+ private
23
+
24
+ def return_type(t)
25
+ case t
26
+ when RBS::Types::Literal
27
+ t
28
+ when ->(t) { t.class.to_s.start_with? "RBS::Types::Bases" }
29
+ "# returns #{t}"
30
+ else
31
+ "# TODO: return #{t.name.name}"
32
+ end
33
+ end
34
+
35
+ def arguments
36
+ @arguments ||= begin
37
+ type = @node.types.first.type
38
+ rp = type.required_positionals
39
+ rkw = type.required_keywords
40
+ op = type.optional_positionals
41
+ okw = type.optional_keywords
42
+ args(rp, rkw, op, okw)
43
+ end
44
+ end
45
+
46
+ def body
47
+ @body ||= begin
48
+ comment = @node.comment
49
+ logic = ""
50
+ if comment
51
+ real_comment = []
52
+ logic = []
53
+ has_logic = false
54
+ comment.string.lines.each do |line|
55
+ if has_logic
56
+ break if line.lstrip.start_with? "@!end"
57
+
58
+ logic << line
59
+ elsif line.lstrip.start_with? "@!begin"
60
+ has_logic = true
61
+ else
62
+ real_comment << line
63
+ end
64
+ end
65
+ logic = logic.join
66
+ comment = real_comment.join
67
+ end
68
+ if logic.length.positive?
69
+ logic
70
+ else
71
+ block = @node.types.first.block
72
+ return_type = return_type(@node.types.first.type.return_type)
73
+ yld = if block
74
+ bt = block.type
75
+ a = args(
76
+ bt.required_positionals,
77
+ bt.required_keywords,
78
+ bt.optional_positionals,
79
+ bt.optional_keywords
80
+ )
81
+ "yield#{a}\n"
82
+ end
83
+ "#{yld}#{return_type}"
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
data/lib/lap/module.rb ADDED
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lap
4
+ class Module
5
+ include Helpers
6
+
7
+ def initialize(node, indent_level = 0)
8
+ @node = node
9
+ @indent_level = indent_level
10
+ @has_contents = !@node.members.empty?
11
+ end
12
+
13
+ def render
14
+ self_indent = " " * (Lap::Config[:indent] * @indent_level)
15
+ comment = get_comment(@node)
16
+ "#{comment}#{self_indent}module #{@node.name.name}#{contents}#{self_indent if @has_contents}end\n"
17
+ end
18
+
19
+ private
20
+
21
+ def contents
22
+ @contents ||= begin
23
+ if @has_contents
24
+ members = @node.members.map do |m|
25
+ case m
26
+ when RBS::AST::Members::MethodDefinition
27
+ Lap::Method.new(m, @indent_level + 1).render
28
+ when RBS::AST::Declarations::Class
29
+ Lap::Class.new(m, @indent_level + 1).render
30
+ when RBS::AST::Declarations::Module
31
+ self.class.new(m, @indent_level + 1).render
32
+ when RBS::AST::Declarations::Alias
33
+ # no-op: not present in ruby
34
+ else
35
+ warn "Unsupported member for modules: #{m}"
36
+ end
37
+ end
38
+ "\n#{members.join("\n")}"
39
+ else
40
+ "; "
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,3 @@
1
+ module Lap
2
+ VERSION = "0.1"
3
+ end
data/sample/a.rbs ADDED
@@ -0,0 +1,20 @@
1
+ class A < String
2
+ def self.a: () -> untyped
3
+
4
+ def self.b: (String arg1) -> Integer
5
+
6
+ attr_reader foo: String
7
+
8
+ include Kernel
9
+
10
+ def length: () -> Integer
11
+
12
+ private def c: (?arg: Array) -> void
13
+
14
+ class D
15
+ end
16
+
17
+ module E
18
+ def f: (?Hash options) -> bool
19
+ end
20
+ end
data/sample/bank.rbs ADDED
@@ -0,0 +1,40 @@
1
+ # The top level module for my feature/app
2
+ module Bank
3
+ # This class is responsible for representing Accounts within the Bank
4
+ class Account
5
+ # to 2 decimal places
6
+ attr_reader interest_rate: Float
7
+ # each account has one customer
8
+ attr_reader owner: Bank::Customer
9
+ # how much money in the account
10
+ attr_reader balance: Float
11
+
12
+ # each account needs logic to handle different currencies
13
+ include Currency
14
+ # Query methods to be able to look up different accounts
15
+ extend Query
16
+
17
+ type date_or_dt = Date | DateTime
18
+
19
+ # can optionally specify when the transaction should take place
20
+ def deposit: (Float amount, ?when: date_or_dt) -> Float
21
+
22
+ # can optionally specify when the transaction should take place
23
+ # @!begin
24
+ # @balance += amount
25
+ # @!end
26
+ def withdraw: (Float amount, ?when: date_or_dt) -> Float
27
+
28
+ # must filter results by specifying `to` and `from` params,
29
+ # to prevent the whole transaction history from being loaded!
30
+ def transactions: (from: date_or_dt, to: date_or_dt) -> Array[Bank::Transaction]
31
+
32
+ def with_block: () {(String arg1) -> String } -> void
33
+
34
+ private
35
+
36
+ # TODO:
37
+ # this can probably live elsewhere in due course
38
+ def send_confirmation_email: (String subject) -> void
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lap
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - Joseph Johansen
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-11-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rbs
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry-byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Don't write your code, and rbs types! Write the rbs types first, then
42
+ generate a template to fill in with business logic.
43
+ email:
44
+ - joe@stotles.com
45
+ executables:
46
+ - lap
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - ".gitignore"
51
+ - ".lap.yml"
52
+ - ".rspec"
53
+ - ".travis.yml"
54
+ - Gemfile
55
+ - Gemfile.lock
56
+ - LICENSE.txt
57
+ - README.md
58
+ - Rakefile
59
+ - bin/console
60
+ - bin/setup
61
+ - exe/lap
62
+ - lap.gemspec
63
+ - lib/core_ext/string.rb
64
+ - lib/lap.rb
65
+ - lib/lap/class.rb
66
+ - lib/lap/helpers.rb
67
+ - lib/lap/method.rb
68
+ - lib/lap/module.rb
69
+ - lib/lap/version.rb
70
+ - sample/a.rbs
71
+ - sample/bank.rbs
72
+ homepage: https://github.com/johansenja/lap
73
+ licenses:
74
+ - MIT
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 2.7.0
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubygems_version: 3.1.2
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Generate ruby from rbs blueprints
95
+ test_files: []