natspec 0.0.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 (7) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +3 -0
  3. data/Manifest.txt +5 -0
  4. data/README.md +32 -0
  5. data/Rakefile +30 -0
  6. data/lib/natspec.rb +139 -0
  7. metadata +88 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f9c9f2377b94fed29636cb0895bb347c6879af7daf032a0b22c6e1d0c2543bc3
4
+ data.tar.gz: 13269cbe3eb879e217cabbb56128312a0349c4ecb23ce6a0da405eaed4bd671f
5
+ SHA512:
6
+ metadata.gz: 4fbca50fe5cfaa526d94c39b75e9f635b794a3281124a5179343168ddce0f6c2baeb8eb3e45da62457ad32044c397fcb72f37c10198b9ea3c7ba3fdcf4951093
7
+ data.tar.gz: c7dfd9ea9d0e3423b6497db39c74deca392eed8e6b78e3ce8190566ef46ba3c192f7fc12de3040ca69907ee8d8ba8f71a6255e5fa846465d86737c2ca627d3d0
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ### 0.0.1 / 2023-01-13
2
+
3
+ * Everything is new. First release
data/Manifest.txt ADDED
@@ -0,0 +1,5 @@
1
+ CHANGELOG.md
2
+ Manifest.txt
3
+ README.md
4
+ Rakefile
5
+ lib/natspec.rb
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # Natspec - Natural Spec(ification) Documentation Parser
2
+
3
+ natspec - natural specification (comments) parser / machinery; document application binary interfaces (abis) for Ethereum & Co. (blockchain) contracts
4
+
5
+
6
+
7
+ * home :: [github.com/rubycocos/blockchain](https://github.com/rubycocos/blockchain)
8
+ * bugs :: [github.com/rubycocos/blockchain/issues](https://github.com/rubycocos/blockchain/issues)
9
+ * gem :: [rubygems.org/gems/natspec](https://rubygems.org/gems/natspec)
10
+ * rdoc :: [rubydoc.info/gems/natspec](http://rubydoc.info/gems/natspec)
11
+
12
+
13
+
14
+ ## Usage
15
+
16
+ To be done
17
+
18
+
19
+
20
+
21
+ ## License
22
+
23
+ The scripts are dedicated to the public domain.
24
+ Use it as you please with no restrictions whatsoever.
25
+
26
+
27
+ ## Questions? Comments?
28
+
29
+
30
+ Post them on the [D.I.Y. Punk (Pixel) Art reddit](https://old.reddit.com/r/DIYPunkArt). Thanks.
31
+
32
+
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ require 'hoe'
2
+
3
+
4
+ Hoe.spec 'natspec' do
5
+
6
+ self.version = '0.0.1'
7
+
8
+ self.summary = "natspec - natural specification (comments) parser / machinery; document application binary interfaces (abis) for Ethereum & Co. (blockchain) contracts"
9
+ self.description = summary
10
+
11
+ self.urls = { home: 'https://github.com/rubycocos/blockchain' }
12
+
13
+ self.author = 'Gerald Bauer'
14
+ self.email = 'wwwmake@googlegroups.com'
15
+
16
+ # switch extension to .markdown for gihub formatting
17
+ self.readme_file = 'README.md'
18
+ self.history_file = 'CHANGELOG.md'
19
+
20
+ self.extra_deps = [
21
+ ]
22
+
23
+ self.licenses = ['Public Domain']
24
+
25
+ self.spec_extras = {
26
+ required_ruby_version: '>= 2.3'
27
+ }
28
+
29
+ end
30
+
data/lib/natspec.rb ADDED
@@ -0,0 +1,139 @@
1
+ require 'cocos'
2
+
3
+
4
+ module Natspec
5
+
6
+
7
+ class Document
8
+ attr_reader :head, :sections,
9
+ :storage, :functions
10
+ def initialize( head, sections )
11
+ @head = head
12
+ @sections = sections
13
+
14
+ @storage, @functions = _parse_sections( @sections )
15
+ end
16
+
17
+ def _parse_sections( sections )
18
+
19
+ storage = {}
20
+ functions = {}
21
+
22
+ sections.each do |heading, lines|
23
+
24
+ if (m=heading.match(/\Astorage[ ]+(.+)[ ]+(?<id>[_A-Za-z0-9]+)\z/))
25
+ storage[ m[:id] ] = [heading,lines]
26
+ elsif (m=heading.match(/\Afunction[ ]+(?<id>[_A-Za-z0-9]+)([ (]|\z)/))
27
+ functions[ m[:id] ] = [heading,lines]
28
+ else
29
+ puts "!! ERROR - unsupported heading type in line >#{heading}<; sorry"
30
+ exit 1
31
+ end
32
+ end
33
+
34
+ [storage, functions]
35
+ end
36
+ end
37
+
38
+
39
+ class Parser
40
+ def initialize( txt )
41
+ @txt = txt
42
+ end
43
+
44
+ def parse
45
+ head = []
46
+ sections = []
47
+
48
+ section = nil
49
+ @txt.each_line do |line|
50
+
51
+ line = line.rstrip
52
+ if (m=line.match( /\A[ ]*\#{2}[ ]*(?<heading>.+)[ ]*\z/ ))
53
+ puts " found heading >#{m[:heading]}<"
54
+ sections << section if section
55
+ section = [m[:heading],[]]
56
+ elsif (m=line.match(/\A[ ]*\#{1,}/ ))
57
+ puts " !! ERROR - unsupported heading level in line >#{line}<; sorry"
58
+ exit 1
59
+ else
60
+ if section
61
+ section[1] << line
62
+ else
63
+ head << line
64
+ end
65
+ end
66
+ end
67
+
68
+ sections << section if section
69
+
70
+
71
+ ## pre-process sections
72
+ ## remove trailing empty lines
73
+ _strip_empty_leading_lines( head )
74
+ _strip_empty_trailing_lines( head )
75
+ _indent_code_block( head )
76
+
77
+ sections.each do |heading, lines|
78
+ _strip_empty_leading_lines( lines )
79
+ _strip_empty_trailing_lines( lines )
80
+ _strip_code_block( lines )
81
+ end
82
+
83
+
84
+ Document.new( head, sections )
85
+ end
86
+
87
+
88
+ def _strip_code_block( sect )
89
+ sect.reject! { |line| line.start_with?( '```' ) }
90
+ end
91
+
92
+ def _indent_code_block( sect )
93
+ ## step 1: indent code blocks
94
+ inside_block = false
95
+ sect.each_with_index do |line,i|
96
+ if line.start_with?( '```' )
97
+ inside_block = !inside_block
98
+ elsif inside_block
99
+ sect[i] = (' '*4) + sect[i]
100
+ else
101
+ ## regular line; keep going
102
+ end
103
+ end
104
+ ## step 2: remove all code block lines
105
+ _strip_code_block( sect )
106
+ end
107
+
108
+
109
+ def _strip_empty_trailing_lines( sect )
110
+ loop do
111
+ line = sect[-1]
112
+ if line && line.empty?
113
+ sect.pop
114
+ else
115
+ break
116
+ end
117
+ end
118
+ sect
119
+ end
120
+
121
+ def _strip_empty_leading_lines( sect )
122
+ loop do
123
+ line = sect[0]
124
+ if line && line.empty?
125
+ sect.shift
126
+ else
127
+ break
128
+ end
129
+ end
130
+ sect
131
+ end
132
+ end # class Parser
133
+
134
+
135
+ def self.read( path )
136
+ Parser.new( read_text( path ) ).parse
137
+ end
138
+
139
+ end # module Natspec
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: natspec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gerald Bauer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-01-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdoc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7'
33
+ - !ruby/object:Gem::Dependency
34
+ name: hoe
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.23'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.23'
47
+ description: natspec - natural specification (comments) parser / machinery; document
48
+ application binary interfaces (abis) for Ethereum & Co. (blockchain) contracts
49
+ email: wwwmake@googlegroups.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files:
53
+ - CHANGELOG.md
54
+ - Manifest.txt
55
+ - README.md
56
+ files:
57
+ - CHANGELOG.md
58
+ - Manifest.txt
59
+ - README.md
60
+ - Rakefile
61
+ - lib/natspec.rb
62
+ homepage: https://github.com/rubycocos/blockchain
63
+ licenses:
64
+ - Public Domain
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options:
68
+ - "--main"
69
+ - README.md
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '2.3'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubygems_version: 3.3.7
84
+ signing_key:
85
+ specification_version: 4
86
+ summary: natspec - natural specification (comments) parser / machinery; document application
87
+ binary interfaces (abis) for Ethereum & Co. (blockchain) contracts
88
+ test_files: []