scribelite 0.1.0 → 0.2.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: 8f774ffec5b1c7a02d7ff82d92e7dea2ca83aa918f498fb2d24969870e26d819
4
- data.tar.gz: cf9faa2257cb17c595a01685f2dc1b97d4d6fb315f7e65a8e2b6b9663d59872d
3
+ metadata.gz: 8423f47a4a80b7687f04a31e0457500faa3b52e48a40e239377f0877271aface
4
+ data.tar.gz: 86413fdd0e42317307cb97f0989fca3f8b82736539d4333687ff6c9f158f5915
5
5
  SHA512:
6
- metadata.gz: 272471a546baa300468d4dbc0558297930c12f20fd6447366dbd5b02bb6d34ff2aec04090731abcf7259447a389a1a0a20350c2c26659b95e2b9752808479f3d
7
- data.tar.gz: 517b655428b5a043851c3bc0df41689648a9ca51839593d2f3a0284845a207e8570da852d36a165ef65fb6a6892ef1a0a5004490f4816823dd93d13cd977c6bb
6
+ metadata.gz: bfb49887358be1a89b68c855cdce8a0c2dbafa3439f76a0ef0c8dea47ceb00316d73d82577ba01f8112a839d7dc468e312ebcc9c4e0882f7f50fd3c5b560ae9e
7
+ data.tar.gz: d77a2a72689f2e49292edbcb4c02f74b96b1135a2ccf32a33c20c6e3bd79c12288143f8237ef4e06305d9bfa95c9fd5f7934ca36d1f521284d5269c2a8460cc4
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.1.0
1
+ ### 0.2.1
2
2
  ### 0.0.1 / 2023-11-21
3
3
 
4
4
  * Everything is new. First release
data/Manifest.txt CHANGED
@@ -3,8 +3,9 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  lib/scribelite.rb
6
- lib/scribelite/models/calldata.rb
6
+ lib/scribelite/importer.rb
7
7
  lib/scribelite/models/forward.rb
8
- lib/scribelite/models/inscribe.rb
8
+ lib/scribelite/models/scribe.rb
9
+ lib/scribelite/models/tx.rb
9
10
  lib/scribelite/schema.rb
10
11
  lib/scribelite/version.rb
data/README.md CHANGED
@@ -19,11 +19,121 @@ See [Introducing Ethscriptions - A new way of creating and sharing digital artif
19
19
 
20
20
  ## Usage
21
21
 
22
+ The work-in-progess database schema looks like:
23
+
24
+ ``` ruby
25
+ ActiveRecord::Schema.define do
26
+
27
+ create_table :scribes, :id => :string do |t|
28
+ t.integer :num, null: false, index: { unique: true, name: 'scribe_nums' }
29
+ t.integer :bytes
30
+ t.string :content_type
31
+ ## add allow duplicate opt-in protocol flag e.g. esip6
32
+ t.boolean :duplicate ## allows duplicates flag
33
+ t.boolean :flagged, null: false, default: false ## censored flag / removed on request
34
+ t.string :sha, null: false ## sha hash as hexstring (but no leading 0)
35
+ end
36
+
37
+ create_table :txs, :id => :string do |t|
38
+ t.binary :data # , null: false
39
+ t.datetime :date, null: false
40
+ t.integer :block, null: false
41
+ t.integer :idx, null: false ## transaction index (number)
42
+
43
+ t.string :from, null: false
44
+ t.string :to, null: false
45
+
46
+ t.integer :fee
47
+ t.integer :value
48
+ end
49
+ end
50
+ ```
51
+
52
+
53
+ and to setup use it like:
54
+
55
+ ``` ruby
56
+ require 'scribelite'
57
+
58
+ ScribeDb.connect( adapter: 'sqlite3',
59
+ database: './scribe.db' )
60
+
61
+ ScribeDb.create_all ## build schema
62
+ ```
63
+
64
+ and lets import the first hundred (page size is 25) ethscriptions on mainnet (via the ethscriptions.com api):
65
+
66
+
67
+ ``` ruby
68
+ require 'scribelite'
69
+
70
+ ScribeDb.open( './scribe.db' )
71
+
72
+ (1..4).each do |page|
73
+ ScribeDb.import_ethscriptions( page: page )
74
+ end
75
+ ```
76
+
77
+
78
+
79
+ and to query use it like:
80
+
81
+ ``` ruby
82
+ require 'scribelite'
83
+
84
+ ScribeDb.open( './scribe.db' )
85
+
86
+ puts
87
+ puts " #{Scribe.count} scribe(s)"
88
+ puts " #{Tx.count} tx(s)"
89
+
90
+
91
+ ## how many flagged in top 100?
92
+ limit = 100
93
+
94
+ flagged_count = Scribe.order( :num ).limit(limit).where( flagged: true ).count
95
+ pp flagged_count #=> 75 !!!!!!!!!
96
+ unflagged_count = Scribe.order( :num).limit(limit).where( flagged: false ).count
97
+ pp unflagged_count #=> 25
98
+
99
+
100
+ Scribe.order( :num ).limit(limit).each do |scribe|
101
+ if scribe.flagged?
102
+ print " xx "
103
+ else
104
+ print "==> "
105
+ end
106
+ print "#{scribe.num} / #{scribe.content_type} - #{scribe.tx.date} @ #{scribe.tx.block}"
107
+ print "\n"
108
+ end
109
+
110
+
111
+ ## Let's query for all inscriptions grouped by date (day)
112
+ ## and dump the results:
113
+ pp Scribe.counts_by_day
114
+ pp Scribe.counts_by_year
115
+ pp Scribe.counts_by_month
116
+ pp Scribe.counts_by_hour
117
+
118
+
119
+ ## Let's query for all content types and group by count (descending)
120
+ ## and dump the results:
121
+ pp Scribe.counts_by_content_type
122
+
123
+ pp Scribe.counts_by_block
124
+ pp Scribe.counts_by_block_with_timestamp
125
+
126
+ pp Scribe.counts_by_address # from (creator/minter) address
127
+
128
+ # ...
129
+ ```
130
+
22
131
  To be continued...
23
132
 
24
133
 
25
134
 
26
135
 
136
+
27
137
  ## Bonus - More Blockchain (Crypto) Tools, Libraries & Scripts In Ruby
28
138
 
29
139
  See [**/blockchain**](https://github.com/rubycocos/blockchain)
data/Rakefile CHANGED
@@ -18,7 +18,8 @@ Hoe.spec 'scribelite' do
18
18
  self.history_file = 'CHANGELOG.md'
19
19
 
20
20
  self.extra_deps = [
21
- ['ethscribe'],
21
+ ['ethscribe'],
22
+ ['calldata'], ## todo - check if included via ethscribe in the future?
22
23
  ['activerecord'],
23
24
  ['activerecord-utils'],
24
25
  ['logutils'],
@@ -0,0 +1,91 @@
1
+
2
+
3
+ module ScribeDb
4
+
5
+ ## note: by default - sort asc(ending) - oldest first (0,1,2,3, .etc.)
6
+ def self.import_ethscriptions( page: 1, sort_order: 'asc' )
7
+ net = Ethscribe::Api.mainnet
8
+ recs = net.ethscriptions( page: page, sort_order: sort_order )
9
+
10
+ recs.each_with_index do |rec,i|
11
+ puts "==> page #{page}/#{i+1} - #{rec['transaction_hash']}..."
12
+
13
+ txid = rec['transaction_hash']
14
+ block = rec['block_number']
15
+ idx = rec['transaction_index']
16
+
17
+ from = rec['creator']
18
+ to = rec['initial_owner']
19
+
20
+ ## todo - double check if daylight saving time (dst) breaks timestamp == utc identity/conversion?
21
+ ## 2001-02-03T04:05:06+07:00
22
+ ## 2016-05-29T22:28:15.000Z
23
+ ## check if %z can handle .000Z ??
24
+ ## DateTime.strptime( '2016-05-29T22:28:15.000Z', '%Y-%m-%dT%H:%M:%S%z' )
25
+ ## pp rec['creation_timestamp']
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
77
+
78
+ tx = Tx.find_by( id: txid )
79
+ if tx
80
+ ## skip for now - found id db
81
+ else
82
+ puts "tx_attribs:"
83
+ pp tx_attribs
84
+ Tx.create!( **tx_attribs )
85
+ end
86
+ end
87
+
88
+ end # method import_ethscriptions
89
+
90
+ end # module ScribeDb
91
+
@@ -10,8 +10,8 @@ module Model
10
10
  Prop = ConfDb::Model::Prop
11
11
 
12
12
 
13
- class Inscribe < ActiveRecord::Base ; end
14
- class Calldata < ActiveRecord::Base ; end
13
+ class Scribe < ActiveRecord::Base ; end
14
+ class Tx < ActiveRecord::Base ; end
15
15
 
16
16
 
17
17
  end # module Model
@@ -2,8 +2,8 @@
2
2
  module ScribeDb
3
3
  module Model
4
4
 
5
- class Inscribe < ActiveRecord::Base
6
- has_one :calldata, foreign_key: 'id'
5
+ class Scribe < ActiveRecord::Base
6
+ has_one :tx, foreign_key: 'id'
7
7
 
8
8
  ## convernience helper
9
9
  ## forward to blob.content
@@ -17,7 +17,8 @@ module ScribeDb
17
17
  ### scope like helpers
18
18
  def self.png() where( content_type: 'image/png' ); end
19
19
  def self.gif() where( content_type: 'image/gif' ); end
20
- def self.jpg() where( content_type: 'image/jpeg' ); end
20
+ def self.jpg() where( content_type: ['image/jpeg',
21
+ 'image/jpg'] ); end
21
22
  def self.webp() where( content_type: 'image/webp' ); end
22
23
  def self.svg() where( content_type: 'image/svg+xml' ); end
23
24
  def self.avif() where( content_type: 'image/avif' ); end
@@ -31,6 +32,7 @@ module ScribeDb
31
32
  where( content_type: [
32
33
  'image/png',
33
34
  'image/jpeg',
35
+ 'image/jpg',
34
36
  'image/gif',
35
37
  'image/webp',
36
38
  'image/svg+xml',
@@ -98,91 +100,64 @@ module ScribeDb
98
100
  .order( Arel.sql( 'COUNT(*) DESC, content_type')).count
99
101
  end
100
102
 
101
- class << self
102
- alias_method :biggest, :largest
103
- alias_method :counts_by_content_type, :content_type_counts
103
+
104
+ def self.block_counts
105
+ joins(:tx).group( 'block' )
106
+ .order( 'block').count
107
+ end
108
+
109
+ def self.block_with_timestamp_counts
110
+ joins(:tx).group( Arel.sql( "block || ' @ ' || date" ))
111
+ .order( 'block' ).count
112
+ end
113
+
114
+
115
+ def self.date_counts
116
+ ## note: strftime is SQLite specific/only!!!
117
+ joins(:tx).group( Arel.sql("strftime('%Y-%m-%d', date)"))
118
+ .order( Arel.sql("strftime('%Y-%m-%d', date)")).count
119
+ end
120
+
121
+ def self.month_counts
122
+ ## note: strftime is SQLite specific/only!!!
123
+ joins(:tx).group( Arel.sql("strftime('%Y-%m', date)"))
124
+ .order( Arel.sql("strftime('%Y-%m', date)")).count
104
125
  end
105
126
 
106
- ###
107
- # instance methods
108
- def extname
109
- ## map mime type to file extname
110
- ## see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
111
- ## for real-world usage, see https://dune.com/dgtl_assets/bitcoin-ordinals-analysis
112
- ## https://github.com/casey/ord/blob/master/src/media.rs
113
-
114
- if content_type.start_with?( 'text/plain' )
115
- '.txt'
116
- elsif content_type.start_with?( 'text/markdown' )
117
- '.md'
118
- elsif content_type.start_with?( 'text/html' )
119
- '.html'
120
- elsif content_type.start_with?( 'text/javascript' ) ||
121
- content_type.start_with?( 'application/javascript' )
122
- ## note: application/javascript is considered bad practice/legacy
123
- '.js'
124
- elsif content_type.start_with?( 'image/png' )
125
- ## Portable Network Graphics (PNG)
126
- '.png'
127
- elsif content_type.start_with?( 'image/jpeg' )
128
- ## Joint Photographic Expert Group image (JPEG)
129
- '.jpg' ## use jpeg - why? why not?
130
- elsif content_type.start_with?( 'image/webp' )
131
- ## Web Picture format (WEBP)
132
- '.webp' ## note: no three-letter extension available
133
- elsif content_type.start_with?( 'image/svg' )
134
- ## Scalable Vector Graphics (SVG)
135
- '.svg'
136
- elsif content_type.start_with?( 'image/gif' )
137
- ## Graphics Interchange Format (GIF)
138
- '.gif'
139
- elsif content_type.start_with?( 'image/avif' )
140
- ## AV1 Image File Format (AVIF)
141
- '.avif'
142
- elsif content_type.start_with?( 'application/epub' )
143
- '.epub'
144
- elsif content_type.start_with?( 'application/pdf' )
145
- '.pdf'
146
- elsif content_type.start_with?( 'application/json' )
147
- '.json'
148
- elsif content_type.start_with?( 'application/pgp-signature' )
149
- '.sig'
150
- elsif content_type.start_with?( 'audio/mpeg' )
151
- '.mp3'
152
- elsif content_type.start_with?( 'audio/midi' )
153
- '.midi'
154
- elsif content_type.start_with?( 'video/mp4' )
155
- '.mp4'
156
- elsif content_type.start_with?( 'video/webm' )
157
- '.wepm'
158
- elsif content_type.start_with?( 'audio/mod' )
159
- ## is typo? possible? only one inscription in 20m?
160
- '.mod' ## check/todo/fix if is .wav??
161
- else
162
- puts "!! ERROR - no file extension configured for content type >#{content_type}<; sorry:"
163
- pp self
164
- exit 1
127
+ def self.year_counts
128
+ ## note: strftime is SQLite specific/only!!!
129
+ joins(:tx).group( Arel.sql("strftime('%Y', date)"))
130
+ .order( Arel.sql("strftime('%Y', date)")).count
165
131
  end
166
- end
167
-
168
- =begin
169
- def export_path ## default export path
170
- numstr = "%08d" % num ### e.g. 00000001
171
- "./tmp/#{numstr}#{extname}"
172
- end
173
- def export( path=export_path )
174
- if blob
175
- write_blob( path, blob.content )
176
- else
177
- ## todo/fix: raise exception - no content
178
- puts "!! ERROR - inscribe has no content (blob); sorry:"
179
- pp self
180
- exit 1
132
+
133
+ def self.hour_counts
134
+ ## note: strftime is SQLite specific/only!!!
135
+ joins(:tx).group( Arel.sql("strftime('%Y-%m-%d %Hh', date)"))
136
+ .order( Arel.sql("strftime('%Y-%m-%d %Hh', date)")).count
181
137
  end
182
- end
183
- =end
184
138
 
185
- end # class Inscribe
139
+
140
+ def self.from_counts
141
+ ## note: from is sql keyword!!!
142
+ ## wrap in [] for sqlite - check if works for others!!!
143
+ joins(:tx).group( '[from]' )
144
+ .order( Arel.sql( 'COUNT(*) DESC')).count
145
+ end
146
+
147
+
148
+ class << self
149
+ alias_method :biggest, :largest
150
+ alias_method :counts_by_content_type, :content_type_counts
151
+ alias_method :counts_by_date, :date_counts
152
+ alias_method :counts_by_day, :date_counts
153
+ alias_method :counts_by_month, :month_counts
154
+ alias_method :counts_by_year, :year_counts
155
+ alias_method :counts_by_hour, :hour_counts
156
+ alias_method :counts_by_block, :block_counts
157
+ alias_method :counts_by_block_with_timestamp, :block_with_timestamp_counts
158
+ alias_method :counts_by_address, :from_counts
159
+ end
160
+ end # class Scribe
186
161
 
187
162
  end # module Model
188
163
  end # module ScribeDb
@@ -2,17 +2,16 @@
2
2
  module ScribeDb
3
3
  module Model
4
4
 
5
- class Calldata < ActiveRecord::Base
6
- self.table_name = 'calldatas' ## check if infers data? why? why not?
5
+ class Tx < ActiveRecord::Base
6
+ self.table_name = 'txs' ## note auto-infers txes change to txs
7
7
 
8
8
  belongs_to :inscribe, foreign_key: 'id'
9
-
10
9
  =begin
11
10
  def text
12
11
  content.force_encoding(Encoding::UTF_8)
13
12
  end
14
13
  =end
15
- end # class Calldata
14
+ end # class Tx
16
15
 
17
16
  end # module Model
18
17
  end # module ScribeDb
@@ -8,15 +8,15 @@ def up
8
8
 
9
9
  ActiveRecord::Schema.define do
10
10
 
11
- create_table :inscribes, :id => :string do |t|
11
+ create_table :scribes, :id => :string do |t|
12
12
  ## "id": "0a3a4dbf6630338bc4df8e36bd081f8f7d2dee9441131cb03a18d43eb4882d5ci0",
13
13
  ## note: change to uuid (universally unique id) - why? why not?
14
14
  ## id gets used by row_id (internal orm db machinery) and is int
15
- ## t.string :uuid, null: false, index: { unique: true, name: 'inscribe_uuids' }
15
+ ## t.string :uuid, null: false, index: { unique: true, name: 'scribe_uuids' }
16
16
 
17
17
  ## "title": "Inscription 10371414",
18
18
  ## note: use num/no. from title only - why? why not?
19
- t.integer :num, null: false, index: { unique: true, name: 'inscribe_nums' }
19
+ t.integer :num, null: false, index: { unique: true, name: 'scribe_nums' }
20
20
 
21
21
  ## "content length": "85 bytes",
22
22
  ## note: extract bytes as integer!!!
@@ -25,11 +25,14 @@ create_table :inscribes, :id => :string do |t|
25
25
  ## "content type": "text/plain;charset=utf-8",
26
26
  ## note: make sure always lower/down case!!!
27
27
  t.string :content_type
28
-
29
-
28
+
30
29
  ## add allow duplicate opt-in protocol flag e.g. esip6
31
- ## t.boolean :duplicate -
32
-
30
+ t.boolean :duplicate ## allows duplicates flag - make duplicate the default - why? why not?
31
+ t.boolean :flagged, null: false, default: false ## censored flag / removed on request
32
+
33
+ ## move sha to tx - why? why not?
34
+ t.string :sha # , null: false ## sha hash as hexstring
35
+
33
36
  ## timestamp last
34
37
  t.timestamps
35
38
  end
@@ -37,14 +40,13 @@ end
37
40
 
38
41
  ## change to tx/txs or txn/txns - why? why not?
39
42
 
40
- create_table :calldatas, :id => :string do |t|
43
+ create_table :txs, :id => :string do |t|
41
44
  ## "id": "0a3a4dbf6630338bc4df8e36bd081f8f7d2dee9441131cb03a18d43eb4882d5ci0",
42
45
  ## note: change to uuid (universally unique id) - why? why not?
43
46
  ## id gets used by row_id (internal orm db machinery) and is int
44
47
  ## t.string :id, null: false, index: { unique: true, name: 'blob_uuids' }
45
48
 
46
- t.binary :data # , null: false
47
- t.string :sha # , null: false ## sha hash as hexstring
49
+ t.binary :data # , null: false
48
50
 
49
51
  ## "timestamp": "2023-06-01 05:00:57 UTC"
50
52
  ## or use date_utc ???
@@ -52,19 +54,16 @@ create_table :calldatas, :id => :string do |t|
52
54
  t.datetime :date, null: false
53
55
 
54
56
  t.integer :block, null: false
55
- t.integer :fee
56
- t.integer :value
57
+ t.integer :idx, null: false ## transaction index (number)
57
58
 
58
- ###
59
- ## "address": "bc1p3h4eecuxjj2g72sq38gyva732866u5w29lhxgeqfe6c0sg8xmagsuau63k",
60
- ## is this minter/inscriber addr???
61
- ## change to minter?? or such - why? why not?
62
- ## creator
63
59
  t.string :from, null: false
60
+ t.string :to, null: false
64
61
 
65
- ## add to address too - why? why not?
66
- t.string :to
67
- ## timestamp last
62
+ t.integer :fee
63
+ t.integer :value
64
+
65
+
66
+ ## timestamp last
68
67
  t.timestamps
69
68
  end
70
69
 
@@ -1,8 +1,8 @@
1
1
 
2
2
  module Scribelite
3
3
  MAJOR = 0 ## todo: namespace inside version or something - why? why not??
4
- MINOR = 1
5
- PATCH = 0
4
+ MINOR = 2
5
+ PATCH = 1
6
6
  VERSION = [MAJOR,MINOR,PATCH].join('.')
7
7
 
8
8
  def self.version
data/lib/scribelite.rb CHANGED
@@ -1,10 +1,11 @@
1
1
 
2
2
  # core and stlibs
3
3
  require 'ethscribe' ## will pull-in cocos & friends
4
-
4
+ require 'calldata'
5
5
 
6
6
 
7
7
  require 'logger' # Note: use for ActiveRecord::Base.logger -- remove/replace later w/ LogUtils::Logger ???
8
+ require 'date' ## check if date & datetime required ??
8
9
 
9
10
 
10
11
  # 3rd party gems / libs
@@ -27,14 +28,12 @@ require_relative 'scribelite/version' # always goes first
27
28
 
28
29
  require_relative 'scribelite/models/forward'
29
30
 
30
- require_relative 'scribelite/models/inscribe'
31
- require_relative 'scribelite/models/calldata'
31
+ require_relative 'scribelite/models/scribe'
32
+ require_relative 'scribelite/models/tx'
32
33
 
33
34
 
34
35
  require_relative 'scribelite/schema'
35
36
 
36
- # require_relative 'cache'
37
- # require_relative 'importer' ## note: require (soft dep) ordinals gems!!!
38
37
 
39
38
 
40
39
 
@@ -66,7 +65,7 @@ module ScribeDb
66
65
  ConfDb.create # add props table
67
66
  end
68
67
 
69
- unless ScribeDb::Model::Inscribe.table_exists?
68
+ unless ScribeDb::Model::Scribe.table_exists?
70
69
  ScribeDb.create
71
70
  end
72
71
  end # method auto_migrate!
@@ -133,11 +132,23 @@ end # module ScribeDb
133
132
 
134
133
 
135
134
 
135
+ # add ethscriptions / ethscripe importer - why? why not?
136
+ require_relative 'scribelite/importer'
137
+
138
+
139
+
136
140
 
137
141
 
138
142
  ## add convenience helpers
139
- Inscribe = ScribeDb::Model::Inscribe
140
- Calldata = ScribeDb::Model::Calldata
143
+ Scribe = ScribeDb::Model::Scribe
144
+ Tx = ScribeDb::Model::Tx
145
+
146
+
147
+
148
+ require 'active_support/number_helper'
149
+ include ActiveSupport::NumberHelper ## e.g. number_to_human_size
150
+
151
+
141
152
 
142
153
 
143
154
  # say hello
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.1.0
4
+ version: 0.2.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: 2023-11-21 00:00:00.000000000 Z
11
+ date: 2023-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ethscribe
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: calldata
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: activerecord
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -171,9 +185,10 @@ files:
171
185
  - README.md
172
186
  - Rakefile
173
187
  - lib/scribelite.rb
174
- - lib/scribelite/models/calldata.rb
188
+ - lib/scribelite/importer.rb
175
189
  - lib/scribelite/models/forward.rb
176
- - lib/scribelite/models/inscribe.rb
190
+ - lib/scribelite/models/scribe.rb
191
+ - lib/scribelite/models/tx.rb
177
192
  - lib/scribelite/schema.rb
178
193
  - lib/scribelite/version.rb
179
194
  homepage: https://github.com/s6ruby/rubidity