scribelite 0.2.1 → 1.0.0
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 +4 -4
- data/CHANGELOG.md +1 -0
- data/README.md +5 -3
- data/Rakefile +1 -1
- data/lib/scribelite/importer.rb +139 -75
- data/lib/scribelite/models/scribe.rb +6 -0
- data/lib/scribelite/version.rb +3 -3
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2a98f4c256e13196f739fb4f538a954f50f51b85ed4bd3fedb3041e66dd3580
|
4
|
+
data.tar.gz: 5e9009cef8b739e5e02d630f0e751528a93665d81ba08cecb6ac0e50f8739875
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b920e7a86fe0c47a4b75870c2ae1d27805210b82511bab685cca55af763a93f4f7c9b3124d449eb350b2f22953a920119749b389f6cb357ce5b5750f5282633
|
7
|
+
data.tar.gz: 69177a203454d697914a49bf9cfc1b7bc94e00cb149b4a012d01e808433fe7ab0c6d6b3748de8222860d9860a265d2e7d82dc7dcb7c30f246001646aa0a39ec0
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -4,8 +4,8 @@ scribelite - inscription / inscribe (ethscription calldata) database for ethereu
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
* home :: [github.com/
|
8
|
-
* bugs :: [github.com/
|
7
|
+
* home :: [github.com/0xCompute/ethscribe](https://github.com/0xCompute/ethscribe)
|
8
|
+
* bugs :: [github.com/0xCompute/ethscribe/issues](https://github.com/0xCompute/ethscribe/issues)
|
9
9
|
* gem :: [rubygems.org/gems/scribelite](https://rubygems.org/gems/scribelite)
|
10
10
|
* rdoc :: [rubydoc.info/gems/scribelite](http://rubydoc.info/gems/scribelite)
|
11
11
|
|
@@ -142,7 +142,9 @@ at the ruby code commons (rubycocos) org.
|
|
142
142
|
|
143
143
|
## Questions? Comments?
|
144
144
|
|
145
|
-
Join us in the [
|
145
|
+
Join us in the [0xCompute discord (chat server)](https://discord.gg/3JRnDUap6y)
|
146
|
+
(or in the more general Ethscription discord).
|
147
|
+
Yes you can.
|
146
148
|
Your questions and commentary welcome.
|
147
149
|
|
148
150
|
Or post them over at the [Help & Support](https://github.com/geraldb/help) page. Thanks.
|
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ Hoe.spec 'scribelite' do
|
|
8
8
|
self.summary = "scribelite gem - inscription / inscribe (ethscription calldata) database for ethereum & co; let's you query via sql and more"
|
9
9
|
self.description = summary
|
10
10
|
|
11
|
-
self.urls = { home: 'https://github.com/
|
11
|
+
self.urls = { home: 'https://github.com/0xCompute/ethscribe' }
|
12
12
|
|
13
13
|
self.author = 'Gerald Bauer'
|
14
14
|
self.email = 'gerald.bauer@gmail.com'
|
data/lib/scribelite/importer.rb
CHANGED
@@ -2,90 +2,154 @@
|
|
2
2
|
|
3
3
|
module ScribeDb
|
4
4
|
|
5
|
+
|
6
|
+
|
5
7
|
## note: by default - sort asc(ending) - oldest first (0,1,2,3, .etc.)
|
6
|
-
def self.import_ethscriptions( page: 1,
|
7
|
-
|
8
|
-
|
8
|
+
def self.import_ethscriptions( page: 1,
|
9
|
+
per_page: 50,
|
10
|
+
sort_order: 'asc' )
|
11
|
+
net = Ethscribe.config.client
|
12
|
+
recs = net.ethscriptions( page: page,
|
13
|
+
per_page: per_page,
|
14
|
+
sort_order: sort_order )
|
15
|
+
|
16
|
+
puts " #{recs.size} record(s)"
|
9
17
|
|
10
18
|
recs.each_with_index do |rec,i|
|
11
19
|
puts "==> page #{page}/#{i+1} - #{rec['transaction_hash']}..."
|
20
|
+
_import_ethscription( rec )
|
21
|
+
end
|
12
22
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
date = DateTime.strptime( rec['creation_timestamp'], '%Y-%m-%dT%H:%M:%S.000Z' )
|
27
|
-
|
28
|
-
|
29
|
-
num = rec['ethscription_number']
|
30
|
-
content_type = rec['mimetype']
|
31
|
-
data = rec['content_uri']
|
32
|
-
sha = rec['sha']
|
33
|
-
|
34
|
-
duplicate = rec['esip6']
|
35
|
-
flagged = rec['image_removed_by_request_of_rights_holder']
|
36
|
-
|
37
|
-
### check - if flagged
|
38
|
-
## content_type always set to text/plain
|
39
|
-
## and data to data:, ???
|
40
|
-
## (re)set to nil/null - why? why not?
|
41
|
-
if flagged
|
42
|
-
data = nil
|
43
|
-
content_type = nil
|
44
|
-
end
|
45
|
-
|
46
|
-
tx_attribs = {
|
47
|
-
id: txid,
|
48
|
-
block: block,
|
49
|
-
idx: idx,
|
50
|
-
date: date,
|
51
|
-
from: from,
|
52
|
-
to: to,
|
53
|
-
data: data, ## note: for now saved as utf8 string (not hex!!!!)
|
54
|
-
}
|
55
|
-
|
56
|
-
scribe_attribs = {
|
57
|
-
id: txid,
|
58
|
-
num: num,
|
59
|
-
content_type: content_type,
|
60
|
-
duplicate: duplicate,
|
61
|
-
flagged: flagged,
|
62
|
-
sha: sha,
|
63
|
-
bytes: data ? data.length : nil ## auto-add/calc bytes (content length)
|
64
|
-
}
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
scribe = Scribe.find_by( id: txid )
|
70
|
-
if scribe
|
71
|
-
## skip for now - found id db
|
72
|
-
else
|
73
|
-
puts "scribe_attribs:"
|
74
|
-
pp scribe_attribs
|
75
|
-
Scribe.create!( **scribe_attribs )
|
76
|
-
end
|
23
|
+
recs.size ## return number of records fetched for now
|
24
|
+
end # method import_ethscriptions
|
25
|
+
|
26
|
+
|
27
|
+
def self.sync_facet_txs
|
28
|
+
net = Ethscribe.config.client
|
29
|
+
|
30
|
+
## add block argument - why? why not?
|
31
|
+
## get count by block e.g.
|
32
|
+
## our_count = Scribe.joins(:tx).where( 'block < ?', new_block_number).count
|
33
|
+
|
34
|
+
|
35
|
+
count = Scribe.count
|
77
36
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
37
|
+
block = if count > 0
|
38
|
+
last_scribe = Scribe.where( num: Scribe.maximum(:num) ).first
|
39
|
+
last_scribe.tx.block + 1
|
40
|
+
else
|
41
|
+
0
|
42
|
+
end
|
43
|
+
|
44
|
+
loop do
|
45
|
+
res = net.newer_facet_txs( block, max: 2500, count: count )
|
46
|
+
|
47
|
+
break if res['blocks'].size == 0
|
48
|
+
|
49
|
+
first_block = res['blocks'][0]['block_number']
|
50
|
+
last_block = res['blocks'][-1]['block_number']
|
51
|
+
puts "==> #{res['blocks'].size} block(s) - #{first_block} to #{last_block}..."
|
52
|
+
puts " total_future_ethscriptions: #{res['total_future_ethscriptions']}"
|
53
|
+
|
54
|
+
batch_count = 0
|
55
|
+
res['blocks'].each do |block_rec|
|
56
|
+
block_rec['ethscriptions'].each do |rec|
|
57
|
+
_import_ethscription( rec )
|
58
|
+
count += 1
|
59
|
+
batch_count += 1
|
85
60
|
end
|
86
61
|
end
|
62
|
+
puts " #{batch_count} record(s) added"
|
87
63
|
|
88
|
-
|
64
|
+
block = last_block + 1
|
65
|
+
|
66
|
+
break if res['total_future_ethscriptions'] == 0
|
67
|
+
end
|
68
|
+
end # method sync_facet_txs
|
69
|
+
class << self
|
70
|
+
alias_method :sync_facet_txns, :sync_facet_txs
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
def self._import_ethscription( rec )
|
76
|
+
txid = rec['transaction_hash']
|
77
|
+
block = rec['block_number']
|
78
|
+
idx = rec['transaction_index']
|
79
|
+
|
80
|
+
from = rec['creator']
|
81
|
+
to = rec['initial_owner']
|
82
|
+
|
83
|
+
## todo - double check if daylight saving time (dst) breaks timestamp == utc identity/conversion?
|
84
|
+
## 2001-02-03T04:05:06+07:00
|
85
|
+
## 2016-05-29T22:28:15.000Z
|
86
|
+
## check if %z can handle .000Z ??
|
87
|
+
## DateTime.strptime( '2016-05-29T22:28:15.000Z', '%Y-%m-%dT%H:%M:%S%z' )
|
88
|
+
## pp rec['creation_timestamp']
|
89
|
+
date = DateTime.strptime( rec['creation_timestamp'], '%Y-%m-%dT%H:%M:%S.000Z' )
|
90
|
+
|
91
|
+
|
92
|
+
num = rec['ethscription_number']
|
93
|
+
content_type = rec['mimetype']
|
94
|
+
data = rec['content_uri']
|
95
|
+
sha = rec['sha']
|
96
|
+
|
97
|
+
duplicate = rec['esip6']
|
98
|
+
flagged = rec['image_removed_by_request_of_rights_holder']
|
99
|
+
|
100
|
+
### check - if flagged
|
101
|
+
## content_type always set to text/plain
|
102
|
+
## and data to data:, ???
|
103
|
+
## (re)set to nil/null - why? why not?
|
104
|
+
if flagged
|
105
|
+
data = nil
|
106
|
+
content_type = nil
|
107
|
+
end
|
108
|
+
|
109
|
+
tx_attribs = {
|
110
|
+
id: txid,
|
111
|
+
block: block,
|
112
|
+
idx: idx,
|
113
|
+
date: date,
|
114
|
+
from: from,
|
115
|
+
to: to,
|
116
|
+
data: data, ## note: for now saved as utf8 string (not hex!!!!)
|
117
|
+
}
|
118
|
+
|
119
|
+
scribe_attribs = {
|
120
|
+
id: txid,
|
121
|
+
num: num,
|
122
|
+
content_type: content_type,
|
123
|
+
duplicate: duplicate,
|
124
|
+
flagged: flagged,
|
125
|
+
sha: sha,
|
126
|
+
bytes: data ? data.length : nil ## auto-add/calc bytes (content length)
|
127
|
+
}
|
128
|
+
|
129
|
+
if num.nil?
|
130
|
+
puts "!! skipping unconfirmed / unassigned inscribe - no. num"
|
131
|
+
return
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
scribe = Scribe.find_by( id: txid )
|
136
|
+
if scribe
|
137
|
+
## skip for now - found id db
|
138
|
+
else
|
139
|
+
# puts "scribe_attribs:"
|
140
|
+
# pp scribe_attribs
|
141
|
+
Scribe.create!( **scribe_attribs )
|
142
|
+
end
|
143
|
+
|
144
|
+
tx = Tx.find_by( id: txid )
|
145
|
+
if tx
|
146
|
+
## skip for now - found id db
|
147
|
+
else
|
148
|
+
# puts "tx_attribs:"
|
149
|
+
# pp tx_attribs
|
150
|
+
Tx.create!( **tx_attribs )
|
151
|
+
end
|
152
|
+
end
|
89
153
|
|
90
154
|
end # module ScribeDb
|
91
155
|
|
@@ -23,6 +23,12 @@ module ScribeDb
|
|
23
23
|
def self.svg() where( content_type: 'image/svg+xml' ); end
|
24
24
|
def self.avif() where( content_type: 'image/avif' ); end
|
25
25
|
|
26
|
+
def self.pdf() where( content_type: 'application/pdf' ); end
|
27
|
+
|
28
|
+
def self.facet() where( content_type: 'application/vnd.facet.tx+json' ); end
|
29
|
+
|
30
|
+
|
31
|
+
|
26
32
|
class << self
|
27
33
|
alias_method :jpeg, :jpg
|
28
34
|
end
|
data/lib/scribelite/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
module Scribelite
|
3
|
-
MAJOR =
|
4
|
-
MINOR =
|
5
|
-
PATCH =
|
3
|
+
MAJOR = 1 ## todo: namespace inside version or something - why? why not??
|
4
|
+
MINOR = 0
|
5
|
+
PATCH = 0
|
6
6
|
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
7
7
|
|
8
8
|
def self.version
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scribelite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ethscribe
|
@@ -162,14 +162,14 @@ dependencies:
|
|
162
162
|
requirements:
|
163
163
|
- - "~>"
|
164
164
|
- !ruby/object:Gem::Version
|
165
|
-
version: '4.
|
165
|
+
version: '4.1'
|
166
166
|
type: :development
|
167
167
|
prerelease: false
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
169
|
requirements:
|
170
170
|
- - "~>"
|
171
171
|
- !ruby/object:Gem::Version
|
172
|
-
version: '4.
|
172
|
+
version: '4.1'
|
173
173
|
description: scribelite gem - inscription / inscribe (ethscription calldata) database
|
174
174
|
for ethereum & co; let's you query via sql and more
|
175
175
|
email: gerald.bauer@gmail.com
|
@@ -191,7 +191,7 @@ files:
|
|
191
191
|
- lib/scribelite/models/tx.rb
|
192
192
|
- lib/scribelite/schema.rb
|
193
193
|
- lib/scribelite/version.rb
|
194
|
-
homepage: https://github.com/
|
194
|
+
homepage: https://github.com/0xCompute/ethscribe
|
195
195
|
licenses:
|
196
196
|
- Public Domain
|
197
197
|
metadata: {}
|