abidoc 0.0.1 → 0.1.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: e04cd527574913ca48d6b137779994b1b8591e5f6fef541eb15bf8e3b6189b2c
4
- data.tar.gz: f7ad37ae9775b095d34f74907fee9b84f6af5e574ff939de34090fe654ce98cf
3
+ metadata.gz: 63f3e9a48dff69f7a1b40cfdb0576a6780c80a7e789969996a93987263769c8c
4
+ data.tar.gz: 934f1f64b48b26106b16511f775b7353356128cc6236a9e8cde97747ccb207d7
5
5
  SHA512:
6
- metadata.gz: 9c60fab097d3b48c02367f98a4f64690c7679467b7c68ab0f7d50631d9da65a75b1546c03cba5644da23fd671643cfef9f9ba8ea89aa832d7926f623495b5aeb
7
- data.tar.gz: c9aa02b3c23cc0b0bc147138726f352d70dedb5e9ecd09b6f4e0be479379d61522b5f15af1c3bccbc75d16ed0e36dded8fcc77356499266e1458928d7d234e12
6
+ metadata.gz: 2cc8363ca326724f2afd6f950f2a4556f8fbff67682f05ddbf400ef5bd3a8cc160e498816483c0b2ffb5115dd3a86c9164009382b8dcb9e36409299623315dda
7
+ data.tar.gz: c72388140e2e625c264817fafab023a80b5ee4641fa70c1b6285e2149b3bcb1e23cba42593f04a2cdc4542bc8fc169a252964683e7546c3f1df92bf86f283f64
data/Manifest.txt CHANGED
@@ -3,4 +3,6 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  lib/abidoc.rb
6
+ lib/abidoc/generate.rb
7
+ lib/abidoc/model.rb
6
8
  lib/abidoc/version.rb
data/README.md CHANGED
@@ -9,9 +9,123 @@ abidoc - application binary interface (abi) documentation generator for Ethereum
9
9
  * rdoc :: [rubydoc.info/gems/abidoc](http://rubydoc.info/gems/abidoc)
10
10
 
11
11
 
12
+
12
13
  ## Usage
13
14
 
14
15
 
16
+ Let's try to generate the contract abi docs
17
+ for punks v1 (anno 2017):
18
+
19
+ ``` ruby
20
+ require 'abidoc'
21
+
22
+ punks_v1 = '0x6ba6f2207e343923ba692e5cae646fb0f566db8d'
23
+
24
+ abi = ABI.read( "./abis/#{punks_v1}.json" )
25
+ buf = abi.generate_doc( title: 'Contract ABI for Punks V1' )
26
+ write_text( "./o/punks_v1.md", buf )
27
+ ```
28
+
29
+ resulting in:
30
+
31
+
32
+ ---
33
+
34
+ # Contract ABI for Punks V1
35
+
36
+
37
+ **Constructor**
38
+
39
+ - constructor()
40
+
41
+ **1 Payable Function(s)**
42
+
43
+ - function buyPunk(uint256 punkIndex) _payable_
44
+
45
+ **7 Transact Functions(s)**
46
+
47
+ - function reservePunksForOwner(uint256 maxForThisRun)
48
+ - function withdraw()
49
+ - function transferPunk(address to, uint256 punkIndex)
50
+ - function offerPunkForSaleToAddress(uint256 punkIndex, uint256 minSalePriceInWei, address toAddress)
51
+ - function offerPunkForSale(uint256 punkIndex, uint256 minSalePriceInWei)
52
+ - function getPunk(uint256 punkIndex)
53
+ - function punkNoLongerForSale(uint256 punkIndex)
54
+
55
+ **14 Query Functions(s)**
56
+
57
+ - function name() ⇒ (string _) _readonly_
58
+ - function punksOfferedForSale(uint256 _) ⇒ (bool isForSale, uint256 punkIndex, address seller, uint256 minValue, address onlySellTo) _readonly_
59
+ - function totalSupply() ⇒ (uint256 _) _readonly_
60
+ - function decimals() ⇒ (uint8 _) _readonly_
61
+ - function imageHash() ⇒ (string _) _readonly_
62
+ - function nextPunkIndexToAssign() ⇒ (uint256 _) _readonly_
63
+ - function punkIndexToAddress(uint256 _) ⇒ (address _) _readonly_
64
+ - function standard() ⇒ (string _) _readonly_
65
+ - function balanceOf(address _) ⇒ (uint256 _) _readonly_
66
+ - function symbol() ⇒ (string _) _readonly_
67
+ - function numberOfPunksToReserve() ⇒ (uint256 _) _readonly_
68
+ - function numberOfPunksReserved() ⇒ (uint256 _) _readonly_
69
+ - function punksRemainingToAssign() ⇒ (uint256 _) _readonly_
70
+ - function pendingWithdrawals(address _) ⇒ (uint256 _) _readonly_
71
+
72
+ ---
73
+
74
+
75
+ Let's try to generate the contract abi docs
76
+ for punk blocks (anno 2022):
77
+
78
+ ``` ruby
79
+ punk_blocks = '0x58e90596c2065befd3060767736c829c18f3474c'
80
+
81
+ abi = ABI.read( "./address/#{punk_blocks}.json" )
82
+
83
+ buf = abi.generate_doc( title: 'Contract ABI for Punk Blocks' )
84
+ write_text( "./punk_blocks.md", buf )
85
+ ```
86
+
87
+ resulting in:
88
+
89
+ ---
90
+
91
+ # Contract ABI for Punk Blocks
92
+
93
+
94
+ **Constructor**
95
+
96
+ - constructor()
97
+
98
+ **1 Transact Functions(s)**
99
+
100
+ - function registerBlock(bytes _dataMale, bytes _dataFemale, uint8 _layer, string _name)
101
+
102
+ **8 Query Functions(s)**
103
+
104
+ - function blocks(bytes32 _) ⇒ (uint8 layer, bytes dataMale, bytes dataFemale) _readonly_
105
+ - function getBlocks(uint256 _fromID, uint256 _count) ⇒ (tuple[] _, uint256 _) _readonly_
106
+ - function index(uint256 _) ⇒ (bytes32 _) _readonly_
107
+ - function nextId() ⇒ (uint256 _) _readonly_
108
+ - function svgFromIDs(uint256[] _ids) ⇒ (string _) _readonly_
109
+ - function svgFromKeys(bytes32[] _attributeKeys) ⇒ (string _) _readonly_
110
+ - function svgFromNames(string[] _attributeNames) ⇒ (string _) _readonly_
111
+ - function svgFromPunkID(uint256 _tokenID) ⇒ (string _) _readonly_
112
+
113
+ ---
114
+
115
+ and so on.
116
+
117
+
118
+
119
+
120
+ ## Bonus - Awesome Contracts
121
+
122
+ See the [**Awesome (Ethereum) Contracts / Blockchain Services @ Open Blockchains**](https://github.com/openblockchains/awesome-contracts) repo.
123
+ that is a cache of (ethereum) contract ABIs (application binary interfaces)
124
+ and open source code (if verified / available)
125
+ with auto-generated docs via abidoc & friends.
126
+
127
+
128
+
15
129
 
16
130
 
17
131
  ## License
@@ -0,0 +1,85 @@
1
+ module ABI
2
+ class Contract
3
+
4
+
5
+ def generate_doc( title: 'Contract ABI',
6
+ natspec: nil )
7
+ buf = ''
8
+ buf << "# #{title}\n\n"
9
+
10
+ if natspec && natspec.head.size > 0
11
+ natspec.head.each do |line|
12
+ buf << (line.empty? ? "\n" : "#{line}\n")
13
+ end
14
+ end
15
+ buf << "\n\n"
16
+
17
+
18
+ if events.size > 0
19
+ buf << "\n"
20
+ buf << "**#{events.size} Event Log Type(s)**\n\n"
21
+ events.each do |event|
22
+ buf << "- #{event.doc}\n"
23
+ end
24
+ end
25
+
26
+
27
+
28
+ if @ctor
29
+ buf << "\n"
30
+ buf << "**Constructor**\n\n"
31
+ buf << "- #{@ctor.doc}\n"
32
+ ## buf << " - sig #{@ctor.sig} => 0x#{sig(@ctor.sig).hexdigest}\n"
33
+ end
34
+
35
+ if payable_functions.size > 0
36
+ buf << "\n"
37
+ buf << "**#{payable_functions.size} Payable Function(s)**\n\n"
38
+ payable_functions.each do |func|
39
+ buf << "- #{func.doc} _payable_\n"
40
+ ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
41
+ end
42
+ end
43
+
44
+ if transact_functions.size > 0
45
+ buf << "\n"
46
+ buf << "**#{transact_functions.size} Transact Functions(s)**\n\n"
47
+ transact_functions.each do |func|
48
+ buf << "- #{func.doc}\n"
49
+ ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
50
+ end
51
+ end
52
+
53
+
54
+ if query_functions.size > 0
55
+ buf << "\n"
56
+ buf << "**#{query_functions.size} Query Functions(s)**\n\n"
57
+ query_functions.each do |func|
58
+ if natspec && (natspec.storage[ func.name] || natspec.functions[ func.name ])
59
+ sect = natspec.storage[ func.name ] || natspec.functions[ func.name ]
60
+ buf << "- #{sect[0]}"
61
+ sect[1].each do |line|
62
+ buf << (line.empty? ? " <br>" : " <br> #{line}")
63
+ end
64
+ buf << "\n"
65
+ else
66
+ buf << "- #{func.doc} _readonly_\n"
67
+ ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
68
+ end
69
+ end
70
+ end
71
+
72
+ if helper_functions.size > 0
73
+ buf << "\n"
74
+ buf << "**#{helper_functions.size} Helper Functions(s)**\n\n"
75
+ helper_functions.each do |func|
76
+ buf << "- #{func.doc}\n"
77
+ ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
78
+ end
79
+ end
80
+
81
+ buf
82
+ end
83
+
84
+ end ## class Contract
85
+ end ## module ABI
@@ -0,0 +1,67 @@
1
+ module ABI
2
+
3
+ class Param
4
+ def doc
5
+ buf = ''
6
+ if @internal_type && @internal_type != sig
7
+ buf << "#{@internal_type} "
8
+ else
9
+ buf << "#{sig} "
10
+ end
11
+ buf << (@name ? @name : '_')
12
+ buf
13
+ end
14
+ end
15
+
16
+
17
+ class Constructor
18
+ def doc
19
+ buf = "constructor"
20
+ if @inputs.empty?
21
+ buf << "()"
22
+ else
23
+ params = @inputs.map {|param| param.doc }
24
+ buf << "(#{params.join(', ')})"
25
+ end
26
+ buf
27
+ end
28
+ end ## class Constructor
29
+
30
+ class Function
31
+ def doc
32
+ ## note: text with markdown formatting
33
+ buf = "function **#{@name}**"
34
+ if @inputs.empty?
35
+ buf << "()"
36
+ else
37
+ params = @inputs.map {|param| param.doc }
38
+ buf << "(#{params.join(', ')})"
39
+ end
40
+ if @outputs.empty?
41
+ ## do nothing
42
+ else
43
+ buf << " ⇒ "
44
+ params = @outputs.map {|param| param.doc }
45
+ buf << "(#{params.join(', ')})"
46
+ end
47
+ buf
48
+ end
49
+ end ## class Function
50
+
51
+
52
+ class Event
53
+ def doc
54
+ ## note: text with markdown formatting
55
+ buf = "event **#{@name}**"
56
+ if @inputs.empty?
57
+ buf << "()"
58
+ else
59
+ params = @inputs.map {|param| param.doc }
60
+ buf << "(#{params.join(', ')})"
61
+ end
62
+ buf
63
+ end
64
+ end ## class Event
65
+
66
+
67
+ end ## module ABI
@@ -2,7 +2,7 @@
2
2
  module ABIDoc
3
3
 
4
4
  MAJOR = 0
5
- MINOR = 0
5
+ MINOR = 1
6
6
  PATCH = 1
7
7
  VERSION = [MAJOR,MINOR,PATCH].join('.')
8
8
 
data/lib/abidoc.rb CHANGED
@@ -1,64 +1,11 @@
1
1
  require 'abiparser'
2
+ require 'natspec'
2
3
 
3
4
 
4
5
  ## our own code
5
6
  require_relative 'abidoc/version' # note: let version always go first
7
+ require_relative 'abidoc/model'
8
+ require_relative 'abidoc/generate'
6
9
 
7
10
 
8
11
 
9
- module ABI
10
- class Contract
11
-
12
-
13
- def generate_doc( title: 'Contract ABI' )
14
- buf = ''
15
- buf << "# #{title}\n\n"
16
-
17
- if @ctor
18
- buf << "\n"
19
- buf << "**Constructor**\n\n"
20
- buf << "- #{@ctor.doc}\n"
21
- ## buf << " - sig #{@ctor.sig} => 0x#{sig(@ctor.sig).hexdigest}\n"
22
- end
23
-
24
- if payable_functions.size > 0
25
- buf << "\n"
26
- buf << "**#{payable_functions.size} Payable Function(s)**\n\n"
27
- payable_functions.each do |func|
28
- buf << "- #{func.doc} _payable_\n"
29
- ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
30
- end
31
- end
32
-
33
- if transact_functions.size > 0
34
- buf << "\n"
35
- buf << "**#{transact_functions.size} Transact Functions(s)**\n\n"
36
- transact_functions.each do |func|
37
- buf << "- #{func.doc}\n"
38
- ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
39
- end
40
- end
41
-
42
- if query_functions.size > 0
43
- buf << "\n"
44
- buf << "**#{query_functions.size} Query Functions(s)**\n\n"
45
- query_functions.each do |func|
46
- buf << "- #{func.doc} _readonly_\n"
47
- ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
48
- end
49
- end
50
-
51
- if helper_functions.size > 0
52
- buf << "\n"
53
- buf << "**#{helper_functions.size} Helper Functions(s)**\n\n"
54
- helper_functions.each do |func|
55
- buf << "- #{func.doc}\n"
56
- ## buf << " - sig #{func.sig} => 0x#{sig(func.sig).hexdigest}\n"
57
- end
58
- end
59
-
60
- buf
61
- end
62
-
63
- end ## class Contract
64
- end ## module ABI
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abidoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-26 00:00:00.000000000 Z
11
+ date: 2023-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: abiparser
@@ -73,6 +73,8 @@ files:
73
73
  - README.md
74
74
  - Rakefile
75
75
  - lib/abidoc.rb
76
+ - lib/abidoc/generate.rb
77
+ - lib/abidoc/model.rb
76
78
  - lib/abidoc/version.rb
77
79
  homepage: https://github.com/rubycocos/blockchain
78
80
  licenses: