elisp2any 0.0.3 → 0.0.4

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: cfaef7d1de4a445f1055d3093dd6afb0b3f87db67dff17b4a3bf17e451e042c6
4
- data.tar.gz: 3746dd755e216ffda34d037bb3c1070dadb1b8b485426a25c59555d284e7f55a
3
+ metadata.gz: 43ac0e60fb0505d1dfedf717b38966d20340412d119b4ad6842751e92b6d6774
4
+ data.tar.gz: ca6adc49a9eff939fac9aa31b97b2f07194d276042aea5c46b9bcc099a392326
5
5
  SHA512:
6
- metadata.gz: 13d87c5c455d13766deea274183b1a3f32e4165c0f7edbb68e680f977e1c8987eec0808bff8a1285ed9a617d0796e9fdee43784f8955e681feffc41fd0be06d6
7
- data.tar.gz: 97d5d3ca8dfe1f14a26c21bb5d4062a789ac77e2a05ddeb568a624f2ff16dc3cc2e83415d979e612d504aa883af50cd44275289e633521622049188d8db37bd5
6
+ metadata.gz: 3ae7c237a6d260412d87ed8b506efb52694a3b85e10a27e2a0277839a6512ec06a4c3945a368bc2b9e876b1c8fe89c822ed282c1a0c921e864b651b911f84d7c
7
+ data.tar.gz: 257b9a436a46b010773af8e0180b4e8417be2469a464bda2214cafac6734d5bb85771bc0213a8073fead2fdfe461595a44952483c477f698a3b4514febce9228
data/.document ADDED
@@ -0,0 +1,4 @@
1
+ README.md
2
+ lib/**/*.rb
3
+ CHANGELOG.md
4
+ LICENSE.txt
data/.rdoc_options ADDED
@@ -0,0 +1,2 @@
1
+ main_page: README.md
2
+ op_dir: html
data/CHANGELOG.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Change log of Elisp2any
2
2
 
3
- ## Unreleased
3
+ ## 0.0.4 - 2025-02-08
4
+
5
+ * Improved shared object searching for Guix.
4
6
 
5
7
  ## 0.0.3 - 2024-11-16
6
8
 
data/Rakefile CHANGED
@@ -7,11 +7,22 @@ Rake::TestTask.new(:test) do |t|
7
7
  t.test_files = FileList['test/**/*_test.rb']
8
8
  end
9
9
 
10
- require 'rubocop/rake_task'
10
+ default_tasks = %i[test]
11
11
 
12
- RuboCop::RakeTask.new
12
+ rubocop = true
13
13
 
14
- task default: %i[test rubocop]
14
+ begin
15
+ require 'rubocop/rake_task'
16
+ rescue LoadError
17
+ rubocop = false
18
+ end
19
+
20
+ if rubocop
21
+ RuboCop::RakeTask.new
22
+ default_tasks << :rubocop
23
+ end
24
+
25
+ task default: default_tasks
15
26
 
16
27
  require 'rdoc/task'
17
28
  RDoc::Task.new do |rdoc|
data/fixtures/init.el CHANGED
@@ -1,4 +1,4 @@
1
- ;;; init.el --- Emacs configuration
1
+ ;;; init.el --- Emacs configuration -*- lexical-binding: t; -*-
2
2
 
3
3
  ;;; Commentary:
4
4
 
@@ -51,7 +51,7 @@ module Elisp2any
51
51
  ERB.new(source).result(binding)
52
52
  end
53
53
 
54
- extend Forwardable
54
+ extend Forwardable # :nodoc:
55
55
  def_delegators :@file, :name, :synopsis, :commentary, :code
56
56
  end
57
57
  end
@@ -0,0 +1,17 @@
1
+ module Elisp2any
2
+ class Blanklines
3
+ attr_reader :count
4
+
5
+ def self.scan(scanner)
6
+ scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
7
+ count = 0
8
+ count += 1 while !scanner.eos? && scanner.skip(/ *\n/)
9
+ count.zero? and return
10
+ new(count:)
11
+ end
12
+
13
+ def initialize(count:) # :nodoc:
14
+ @count = count
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ require "elisp2any/top_heading"
2
+ require "elisp2any/paragraph"
3
+ require "elisp2any/blanklines"
4
+ require "elisp2any/section"
5
+
6
+ module Elisp2any
7
+ class Code
8
+ attr_reader :paragraphs, :sections
9
+
10
+ def self.scan(scanner)
11
+ pos = scanner.pos
12
+ heading = TopHeading.scan(scanner) or return
13
+ unless heading.content == "Code:"
14
+ scanner.pos = pos
15
+ return
16
+ end
17
+ Blanklines.scan(scanner) # optional
18
+ paragraphs = []
19
+ while (par = Paragraph.scan(scanner))
20
+ paragraphs << par
21
+ Blanklines.scan(scanner) # optional
22
+ end
23
+ section = Section.scan(scanner)
24
+ unless section.heading.level == 1
25
+ raise "TODO"
26
+ end
27
+ new(paragraphs:, sections: [section])
28
+ end
29
+
30
+ def initialize(paragraphs:, sections:)
31
+ @paragraphs = paragraphs
32
+ @sections = sections
33
+ end
34
+ end
35
+ end
@@ -1,7 +1,7 @@
1
1
  require 'forwardable'
2
2
 
3
3
  module Elisp2any
4
- class CodeBlock
4
+ class CodeBlock # :nodoc:
5
5
  def initialize(node) # :nodoc:
6
6
  @node = node
7
7
  end
@@ -10,7 +10,7 @@ module Elisp2any
10
10
  @node.append(source, end_byte)
11
11
  end
12
12
 
13
- extend Forwardable
13
+ extend Forwardable # :nodoc:
14
14
  def_delegators :@node, :content
15
15
  end
16
16
  end
@@ -0,0 +1,17 @@
1
+ module Elisp2any
2
+ class Comment
3
+ attr_reader :colons, :content, :padding
4
+
5
+ def self.scan(scanner)
6
+ scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
7
+ scanner.skip(/(?<colons>;+)(?<padding> *)(?<content>.*)\n?/) or return
8
+ new(colons: scanner[:colons].size, content: scanner[:content], padding: scanner[:padding])
9
+ end
10
+
11
+ def initialize(colons:, content:, padding:)
12
+ @colons = colons
13
+ @content = content
14
+ @padding = padding
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ require "elisp2any/top_heading"
2
+ require "elisp2any/paragraph"
3
+ require "elisp2any/blanklines"
4
+
5
+ module Elisp2any
6
+ class Commentary
7
+ attr_reader :paragraphs
8
+
9
+ def self.scan(scanner)
10
+ pos = scanner.pos
11
+ heading = TopHeading.scan(scanner) or return
12
+ unless heading.content == "Commentary:"
13
+ scanner.pos = pos
14
+ return
15
+ end
16
+ Blanklines.scan(scanner) # optional
17
+ paragraphs = []
18
+ while (par = Paragraph.scan(scanner))
19
+ paragraphs << par
20
+ Blanklines.scan(scanner) # optional
21
+ end
22
+ new(paragraphs:)
23
+ end
24
+
25
+ def initialize(paragraphs:)
26
+ @paragraphs = paragraphs
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ module Elisp2any
2
+ class Expression
3
+ attr_reader :content
4
+
5
+ def self.scan(scanner)
6
+ content = scanner.scan(/t\b/) or return
7
+ new(content:)
8
+ end
9
+
10
+ def initialize(content:)
11
+ @content = content
12
+ end
13
+ end
14
+ end
@@ -1,9 +1,25 @@
1
1
  require_relative 'node'
2
2
  require_relative 'tree_sitter_parser'
3
+ require "elisp2any/header_line"
4
+ require "elisp2any/blanklines"
5
+ require "elisp2any/commentary"
6
+ require "elisp2any/code"
3
7
 
4
8
  module Elisp2any
5
9
  class File
6
- attr_reader :name, :synopsis, :commentary, :code
10
+ attr_reader :name, # TODO: filename
11
+ :synopsis, # TODO: header_line, including description
12
+ :commentary, :code
13
+
14
+ def self.scan(scanner)
15
+ scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
16
+ line = HeaderLine.scan(scanner) or return
17
+ Blanklines.scan(scanner) # optional
18
+ commentary = Commentary.scan(scanner)
19
+ Blanklines.scan(scanner) # optional
20
+ code = Code.scan(scanner)
21
+ new(name: line.filename, synopsis: line.description, commentary:, code:)
22
+ end
7
23
 
8
24
  def self.parse(source)
9
25
  source = source.respond_to?(:read) ? source.read : source
@@ -0,0 +1,14 @@
1
+ module Elisp2any
2
+ class Filename
3
+ attr_reader :content
4
+
5
+ def self.scan(scanner)
6
+ content = scanner.scan(/[a-z]+[.]el\b/) or return
7
+ new(content:)
8
+ end
9
+
10
+ def initialize(content:)
11
+ @content = content
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,47 @@
1
+ require "elisp2any/comment"
2
+ require "elisp2any/filename"
3
+ require "elisp2any/header_line_variables"
4
+
5
+ module Elisp2any
6
+ class HeaderLine
7
+ attr_reader :filename, :description, :variables
8
+
9
+ def self.scan(scanner)
10
+ scanner = StringScanner.new(scanner) unless scanner.respond_to?(:pos)
11
+ pos = scanner.pos
12
+ unless (heading = TopHeading.scan(scanner))
13
+ scanner.pos = pos
14
+ return
15
+ end
16
+ cscanner = StringScanner.new(heading.content)
17
+ unless (filename = Filename.scan(cscanner))
18
+ scanner.pos = pos
19
+ return
20
+ end
21
+ unless cscanner.skip(/ +--- +/)
22
+ scanner.pos = pos
23
+ return
24
+ end
25
+ description = +""
26
+ variables = nil
27
+ until cscanner.eos?
28
+ if (variables = HeaderLineVariables.scan(cscanner)) # nop
29
+ break
30
+ else
31
+ description << cscanner.getch
32
+ end
33
+ end
34
+ if description.empty?
35
+ scanner.pos = pos
36
+ return
37
+ end
38
+ new(filename: filename.content, description:, variables: variables.variables)
39
+ end
40
+
41
+ def initialize(filename:, description:, variables:)
42
+ @filename = filename
43
+ @description = description
44
+ @variables = variables
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ require "elisp2any/variable"
2
+ require "elisp2any/expression"
3
+
4
+ module Elisp2any
5
+ class HeaderLineVariableAssignment
6
+ attr_reader :variable, :expression
7
+
8
+ def self.scan(scanner)
9
+ pos = scanner.pos
10
+ variable = Variable.scan(scanner) or return
11
+ unless scanner.skip(/ *: */)
12
+ scanner.pos = pos
13
+ return
14
+ end
15
+ unless (expression = Expression.scan(scanner))
16
+ scanner.pos = pos
17
+ return
18
+ end
19
+ new(variable: variable.name, expression: expression.content)
20
+ end
21
+
22
+ def initialize(variable:, expression:)
23
+ @variable = variable
24
+ @expression = expression
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ require "elisp2any/variable"
2
+ require "elisp2any/expression"
3
+ require "elisp2any/header_line_variable_assignment"
4
+
5
+ module Elisp2any
6
+ class HeaderLineVariables
7
+ attr_reader :variables
8
+
9
+ def self.scan(scanner)
10
+ scanner = StringScanner.new(scanner) unless scanner.respond_to?(:pos)
11
+ pos = scanner.pos
12
+ scanner.skip(/ *-[*]- +/) or return
13
+ variables = {}
14
+ until scanner.skip(/ +-[*]- */)
15
+ if scanner.eos?
16
+ scanner.pos = pos
17
+ return
18
+ elsif (assign = HeaderLineVariableAssignment.scan(scanner))
19
+ variables[assign.variable] = assign.expression
20
+ elsif scanner.skip(";")
21
+ break
22
+ else
23
+ raise scanner.inspect
24
+ end
25
+ end
26
+ new(variables:)
27
+ end
28
+
29
+ def initialize(variables:)
30
+ @variables = variables
31
+ end
32
+ end
33
+ end
@@ -5,6 +5,17 @@ module Elisp2any
5
5
  class Heading
6
6
  attr_reader :level, :content
7
7
 
8
+ def self.scan(scanner)
9
+ pos = scanner.pos
10
+ comment = Comment.scan(scanner) or return
11
+ unless comment.colons >= 3
12
+ scanner.pos = pos
13
+ return
14
+ end
15
+ new(:TODO, comment.colons - 3, comment.content)
16
+ end
17
+
18
+ # TODO
8
19
  def initialize(node, level, content) # :nodoc:
9
20
  @node = node
10
21
  @level = level
@@ -57,7 +57,7 @@ module Elisp2any
57
57
  CGI.escape_html(string)
58
58
  end
59
59
 
60
- extend Forwardable
60
+ extend Forwardable # :nodoc:
61
61
  def_delegators :@file, :name, :synopsis, :commentary, :code
62
62
  end
63
63
  end
@@ -1,9 +1,23 @@
1
1
  require 'strscan'
2
2
  require 'forwardable'
3
3
  require_relative 'inline_code'
4
+ require "elisp2any/comment"
4
5
 
5
6
  module Elisp2any
6
7
  class Line
8
+ def self.scan(scanner)
9
+ pos = scanner.pos
10
+ comment = Comment.scan(scanner) or return
11
+ unless comment.colons == 2
12
+ scanner.pos = pos
13
+ return
14
+ end
15
+ unless comment.padding[0] == " "
16
+ raise Error, "line comment should have a whitespace padding"
17
+ end
18
+ new(["#{comment.padding[1..]}#{comment.content}"])
19
+ end
20
+
7
21
  def initialize(chunks) # :nodoc:
8
22
  @chunks = chunks
9
23
  end
@@ -1,9 +1,24 @@
1
1
  require 'forwardable'
2
+ require "elisp2any/line"
2
3
 
3
4
  module Elisp2any
4
5
  class Paragraph
6
+ attr_reader :lines
7
+
8
+ def self.scan(scanner)
9
+ scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip)
10
+ lines = []
11
+ while (line = Line.scan(scanner))
12
+ lines << line
13
+ end
14
+ lines.empty? and return
15
+ new(:TODO, lines, :TODO)
16
+ end
17
+
18
+ # TODO: delete
5
19
  attr_reader :end_row # :nodoc:
6
20
 
21
+ # TODO: delete node and end_row
7
22
  def initialize(node, lines, end_row) # :nodoc:
8
23
  @node = node
9
24
  @lines = lines
@@ -0,0 +1,25 @@
1
+ require "elisp2any/heading"
2
+ require "elisp2any/paragraph"
3
+ require "elisp2any/blanklines"
4
+
5
+ module Elisp2any
6
+ class Section
7
+ attr_reader :heading
8
+
9
+ def self.scan(scanner)
10
+ heading = Heading.scan(scanner) or return
11
+ Blanklines.scan(scanner) # optional
12
+ paragraphs = []
13
+ while (par = Paragraph.scan(scanner))
14
+ paragraphs << par
15
+ Blanklines.scan(scanner) # optional
16
+ end
17
+ new(heading:, paragraphs:)
18
+ end
19
+
20
+ def initialize(heading:, paragraphs:)
21
+ @heading = heading
22
+ @paragraphs = paragraphs
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ require "elisp2any/heading"
2
+
3
+ module Elisp2any
4
+ class TopHeading
5
+ attr_reader :content
6
+
7
+ def self.scan(scanner)
8
+ pos = scanner.pos
9
+ heading = Heading.scan(scanner)
10
+ unless heading.level.zero?
11
+ scanner.pos = pos
12
+ return
13
+ end
14
+ new(content: heading.content)
15
+ end
16
+
17
+ def initialize(content:)
18
+ @content = content
19
+ end
20
+ end
21
+ end
@@ -27,8 +27,7 @@ module Elisp2any
27
27
 
28
28
  # Set this env var for Guix shell environment or shared object file is not found
29
29
  if ENV['ELISP2ANY_GUIX_USE_PROFILE_PATH']
30
- profile = ::File.dirname(ENV['PATH'].split(':').select { |path| path.start_with?('/gnu/store/') }.first)
31
- shared_object = ::File.join(profile, 'lib/tree-sitter', shared_object)
30
+ shared_object = ::File.join(ENV["GUIX_ENVIRONMENT"], "lib/tree-sitter", shared_object)
32
31
  end
33
32
 
34
33
  shared_object
@@ -0,0 +1,14 @@
1
+ module Elisp2any
2
+ class Variable
3
+ attr_reader :name
4
+
5
+ def self.scan(scanner)
6
+ name = scanner.scan(/[a-z-]+/) or return
7
+ new(name:)
8
+ end
9
+
10
+ def initialize(name:)
11
+ @name = name
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Elisp2any
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
data/lib/elisp2any.rb CHANGED
@@ -2,5 +2,7 @@ require_relative 'elisp2any/version'
2
2
  require_relative 'elisp2any/file'
3
3
 
4
4
  module Elisp2any
5
- class Error < StandardError; end
5
+ autoload :HeaderLine, "elisp2any/header_line.rb"
6
+ autoload :Blanklines, "elisp2any/blanklines.rb"
7
+ Error = Class.new(StandardError)
6
8
  end
data/manifest.scm CHANGED
@@ -1,6 +1,87 @@
1
- (specifications->manifest (list "ruby@3.1"
2
- "ruby-tree-sitter"
3
- "tree-sitter-elisp"
4
- "ruby-webrick"
5
- "ruby-rubocop"
6
- "ruby-asciidoctor"))
1
+ (use-modules (guix packages)
2
+ ((guix licenses) #:prefix license:)
3
+ (guix git-download)
4
+ (guix build-system ruby)
5
+ (guix build-system tree-sitter)
6
+ (gnu packages tree-sitter)
7
+ (gnu packages ruby))
8
+
9
+ (define-public ruby-tree-sitter
10
+ (let ((commit "2c56b04283f2a8cfed7d6c527ca36b8e1127ee8c")
11
+ (revision "0"))
12
+ (package
13
+ (name "ruby-tree-sitter")
14
+ (version (git-version "0.20.8.1" revision commit))
15
+ (source
16
+ (origin
17
+ (method git-fetch)
18
+ (uri (git-reference
19
+ (url "https://github.com/Faveod/ruby-tree-sitter")
20
+ (commit commit)))
21
+ (file-name (git-file-name name version))
22
+ (sha256
23
+ (base32 "144kp0ya4rl03bgwpix17bgq2ak2kqk63pwniy6sfxfjqp5yzr7f"))))
24
+ (build-system ruby-build-system)
25
+ (arguments
26
+ (list
27
+ #:phases #~(modify-phases %standard-phases
28
+ (add-after 'extract-gemspec 'remove-depends
29
+ (lambda _
30
+ (substitute* "tree_sitter.gemspec"
31
+ ((".*minitest-color.*")
32
+ "\n")
33
+ ((".*pry.*")
34
+ "\n")
35
+ ((".*rake.*")
36
+ "\n"))
37
+ (substitute* "test/test_helper.rb"
38
+ ((".*minitest/color.*")
39
+ "\n"))))
40
+ (add-before 'build 'compile
41
+ (lambda _
42
+ (invoke "rake" "compile")))
43
+ (add-before 'check 'set-path
44
+ (lambda* (#:key inputs #:allow-other-keys)
45
+ (let ((ruby (assoc-ref inputs "tree-sitter-ruby")))
46
+ (setenv "TREE_SITTER_PARSERS"
47
+ (string-append ruby "/lib/tree-sitter")))))
48
+ (add-before 'check 'remove-failing-test
49
+ (lambda _
50
+ (delete-file "test/tree_sitter/node_test.rb"))))))
51
+ (native-inputs (list ruby-minitest ruby-rake-compiler
52
+ ruby-rake-compiler-dock ruby-ruby-memcheck
53
+ tree-sitter-ruby))
54
+ (inputs (list tree-sitter))
55
+ (synopsis "Ruby bindings for Tree-Sitter")
56
+ (description "Ruby bindings for Tree-Sitter")
57
+ (home-page "https://www.github.com/Faveod/ruby-tree-sitter")
58
+ (license license:expat))))
59
+
60
+ (define-public tree-sitter-elisp
61
+ (let ((commit "e5524fdccf8c22fc726474a910e4ade976dfc7bb")
62
+ (revision "0"))
63
+ (package
64
+ (name "tree-sitter-elisp")
65
+ (version (git-version "0.1.4" revision commit))
66
+ (source
67
+ (origin
68
+ (method git-fetch)
69
+ (uri (git-reference
70
+ (url "https://github.com/Wilfred/tree-sitter-elisp")
71
+ (commit commit)))
72
+ (file-name (git-file-name name version))
73
+ (sha256
74
+ (base32 "1wyzfb27zgpvm4110jgv0sl598mxv5dkrg2cwjw3p9g2bq9mav5d"))))
75
+ (build-system tree-sitter-build-system)
76
+ (home-page "https://github.com/Wilfred/tree-sitter-elisp")
77
+ (synopsis "Tree-sitter grammar for Emacs Lisp")
78
+ (description "This package provides an Emacs Lisp grammar for the Tree-sitter library.")
79
+ (license license:expat))))
80
+
81
+ (concatenate-manifests
82
+ (list
83
+ (packages->manifest (list ruby-tree-sitter tree-sitter-elisp))
84
+ (specifications->manifest (list "ruby@3.1"
85
+ "ruby-webrick"
86
+ "ruby-rubocop"
87
+ "ruby-asciidoctor"))))
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elisp2any
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - gemmaro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-16 00:00:00.000000000 Z
11
+ date: 2025-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby_tree_sitter
@@ -103,7 +103,9 @@ executables:
103
103
  extensions: []
104
104
  extra_rdoc_files: []
105
105
  files:
106
+ - ".document"
106
107
  - ".envrc"
108
+ - ".rdoc_options"
107
109
  - ".rubocop.yml"
108
110
  - CHANGELOG.md
109
111
  - Gemfile
@@ -115,8 +117,17 @@ files:
115
117
  - lib/elisp2any.rb
116
118
  - lib/elisp2any/asciidoc_renderer.rb
117
119
  - lib/elisp2any/asciidoc_renderer/index.adoc.erb
120
+ - lib/elisp2any/blanklines.rb
121
+ - lib/elisp2any/code.rb
118
122
  - lib/elisp2any/code_block.rb
123
+ - lib/elisp2any/comment.rb
124
+ - lib/elisp2any/commentary.rb
125
+ - lib/elisp2any/expression.rb
119
126
  - lib/elisp2any/file.rb
127
+ - lib/elisp2any/filename.rb
128
+ - lib/elisp2any/header_line.rb
129
+ - lib/elisp2any/header_line_variable_assignment.rb
130
+ - lib/elisp2any/header_line_variables.rb
120
131
  - lib/elisp2any/heading.rb
121
132
  - lib/elisp2any/html_renderer.rb
122
133
  - lib/elisp2any/html_renderer/index.html.erb
@@ -124,13 +135,17 @@ files:
124
135
  - lib/elisp2any/line.rb
125
136
  - lib/elisp2any/node.rb
126
137
  - lib/elisp2any/paragraph.rb
138
+ - lib/elisp2any/section.rb
139
+ - lib/elisp2any/top_heading.rb
127
140
  - lib/elisp2any/tree_sitter_parser.rb
141
+ - lib/elisp2any/variable.rb
128
142
  - lib/elisp2any/version.rb
129
143
  - manifest.scm
130
144
  - sig/elisp2any.gen.rbs
131
145
  - sig/elisp2any.rbs
132
146
  homepage: https://codeberg.org/gemmaro/elisp2any
133
- licenses: []
147
+ licenses:
148
+ - Apache-2.0
134
149
  metadata:
135
150
  rubygems_mfa_required: 'true'
136
151
  bug_tracker_uri: https://codeberg.org/gemmaro/elisp2any/issues