scribelite 0.1.0 → 0.2.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.
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