scribelite 0.0.1 → 0.2.0

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: 6690bac30dba4368195511bcf9e5f80b00a611ab1b741a2faaec7b1e7bb31823
4
- data.tar.gz: e5eb0fa135f73c92f211039e9a097c92534ab9f8669089527543da21ceeaa72d
3
+ metadata.gz: '0608ffa940a6f65b4432a6e8e494ec2213e20a6fb661e15eafb9f0408f1175be'
4
+ data.tar.gz: 5b019fbe73890c1b20a5c4106a617e2c573431e805b47825fb056f7bd50449aa
5
5
  SHA512:
6
- metadata.gz: 85cc9101a8b0c5b21413ab0df3d9b4b69bf815eb9f29bcc2d6af6e1ee80d14fd69e20c119f8314f8adb9227004e5fb5fb45d45a7854ee5d43827474c3b11e657
7
- data.tar.gz: a2dff1d4aa19b699540cb49b94023718684a06b4939c785cd112049ae76411b18d279ade78943d86a0d47d92a3bcc30625b832694f4a079c360b06bd06f07f81
6
+ metadata.gz: 3a363643f683a32c1ccbd04448d790b6582f5ccc7d8d3176ab65506ff92d826a5b54e37b41add46bb8c8b577a8f76aa9d8ee7800a7d946aa7cf5ce9802fb283b
7
+ data.tar.gz: 491db0258ff4a4dc27974f9e3e8e8147a9437690dfdd2c30bf8d81b8710aee0f7ee4a119cd3657b6d48f1cc3399570e4787ef9fbdc87d17ec4f4115acb79d1e7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,4 @@
1
+ ### 0.2.0
1
2
  ### 0.0.1 / 2023-11-21
2
3
 
3
4
  * Everything is new. First release
data/Manifest.txt CHANGED
@@ -3,3 +3,8 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  lib/scribelite.rb
6
+ lib/scribelite/models/forward.rb
7
+ lib/scribelite/models/scribe.rb
8
+ lib/scribelite/models/tx.rb
9
+ lib/scribelite/schema.rb
10
+ lib/scribelite/version.rb
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Inscription / Inscribe (Ethscription Calldata) SQL Database
1
+ # Scribelite - Inscription / Inscribe (Ethscription Calldata) SQL Database
2
2
 
3
3
  scribelite - inscription / inscribe (ethscription calldata) database for ethereum & co; let's you query via sql and more
4
4
 
@@ -19,11 +19,89 @@ 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
+ ## move sha to tx - why? why not?
35
+ t.string :sha, null: false ## sha hash as hexstring (but no leading 0)
36
+ end
37
+
38
+ create_table :txs, :id => :string do |t|
39
+ t.binary :data # , null: false
40
+ t.datetime :date, null: false
41
+ t.integer :block, null: false
42
+ t.integer :idx, null: false ## transaction index (number)
43
+
44
+ t.string :from, null: false
45
+ t.string :to, null: false
46
+
47
+ t.integer :fee
48
+ t.integer :value
49
+ end
50
+ end
51
+ ```
52
+
53
+
54
+ and to setup use it like:
55
+
56
+ ``` ruby
57
+ require 'scribelite'
58
+
59
+ ScribeDb.connect( adapter: 'sqlite3',
60
+ database: './scribe.db' )
61
+
62
+ ScribeDb.create_all ## build schema
63
+ ```
64
+
65
+
66
+ and to query use it like:
67
+
68
+ ``` ruby
69
+ require 'scribelite'
70
+
71
+ ScribeDb.open( './scribe.db' )
72
+
73
+ puts
74
+ puts " #{Scribe.count} scribe(s)"
75
+ puts " #{Tx.count} tx(s)"
76
+
77
+
78
+ ## how many flagged in top 100?
79
+ limit = 100
80
+
81
+ flagged_count = Scribe.order( :num ).limit(limit).where( flagged: true ).count
82
+ pp flagged_count #=> 75 !!!!!!!!!
83
+ unflagged_count = Scribe.order( :num).limit(limit).where( flagged: false ).count
84
+ pp unflagged_count #=> 25
85
+
86
+
87
+ Scribe.order( :num ).limit(limit).each do |scribe|
88
+ if scribe.flagged?
89
+ print " xx "
90
+ else
91
+ print "==> "
92
+ end
93
+ print "#{scribe.num} / #{scribe.content_type} - #{scribe.tx.date} @ #{scribe.tx.block}"
94
+ print "\n"
95
+ end
96
+ ```
97
+
98
+
22
99
  To be continued...
23
100
 
24
101
 
25
102
 
26
103
 
104
+
27
105
  ## Bonus - More Blockchain (Crypto) Tools, Libraries & Scripts In Ruby
28
106
 
29
107
  See [**/blockchain**](https://github.com/rubycocos/blockchain)
data/Rakefile CHANGED
@@ -1,11 +1,11 @@
1
1
  require 'hoe'
2
- # require './lib/scribelite/version.rb'
2
+ require './lib/scribelite/version.rb'
3
3
 
4
4
 
5
5
  Hoe.spec 'scribelite' do
6
- self.version = '0.0.1' # Scribelite::VERSION
6
+ self.version = Scribelite::VERSION
7
7
 
8
- self.summary = "scribelite - inscription / inscribe (ethscription calldata) database for ethereum & co; let's you query via sql and more"
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
11
  self.urls = { home: 'https://github.com/s6ruby/rubidity' }
@@ -18,7 +18,15 @@ 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?
23
+ ['activerecord'],
24
+ ['activerecord-utils'],
25
+ ['logutils'],
26
+ ['logutils-activerecord'],
27
+ ['props'],
28
+ ['props-activerecord'],
29
+ ['sqlite3'],
22
30
  ]
23
31
 
24
32
  self.licenses = ['Public Domain']
@@ -0,0 +1,24 @@
1
+
2
+ ### forward references
3
+ ## require first to resolve circular references
4
+
5
+ module ScribeDb
6
+ module Model
7
+
8
+ #############
9
+ # ConfDb
10
+ Prop = ConfDb::Model::Prop
11
+
12
+
13
+ class Scribe < ActiveRecord::Base ; end
14
+ class Tx < ActiveRecord::Base ; end
15
+
16
+
17
+ end # module Model
18
+
19
+ # note: convenience alias for Model
20
+ # lets you use include ScribeDb::Models
21
+ Models = Model
22
+ end # module ScribeDb
23
+
24
+
@@ -0,0 +1,189 @@
1
+
2
+ module ScribeDb
3
+ module Model
4
+
5
+ class Scribe < ActiveRecord::Base
6
+ has_one :tx, foreign_key: 'id'
7
+
8
+ ## convernience helper
9
+ ## forward to blob.content
10
+ ## blob.content - encoding is BINARY (ASCII-7BIT)
11
+ ## blob.text - force_encoding is UTF-8 (return a copy)
12
+ # def content() blob.content; end
13
+ # def text() blob.text; end
14
+
15
+
16
+ ################################
17
+ ### scope like helpers
18
+ def self.png() where( content_type: 'image/png' ); end
19
+ def self.gif() where( content_type: 'image/gif' ); end
20
+ def self.jpg() where( content_type: 'image/jpeg' ); end
21
+ def self.webp() where( content_type: 'image/webp' ); end
22
+ def self.svg() where( content_type: 'image/svg+xml' ); end
23
+ def self.avif() where( content_type: 'image/avif' ); end
24
+
25
+ class << self
26
+ alias_method :jpeg, :jpg
27
+ end
28
+
29
+ def self.image
30
+ ## change to/or add alias e.g. image/images - why? why not
31
+ where( content_type: [
32
+ 'image/png',
33
+ 'image/jpeg',
34
+ 'image/gif',
35
+ 'image/webp',
36
+ 'image/svg+xml',
37
+ 'image/avif',
38
+ ])
39
+ end
40
+
41
+ def self.html
42
+ where( content_type: [
43
+ 'text/html;charset=utf-8',
44
+ 'text/html',
45
+ ])
46
+ end
47
+
48
+ def self.js
49
+ where( content_type: [
50
+ 'text/javascript',
51
+ 'application/javascript',
52
+ ])
53
+ end
54
+
55
+ class << self
56
+ alias_method :javascript, :js
57
+ end
58
+
59
+ def self.text
60
+ ## change to/or add alias e.g. text/texts - why? why not
61
+ ## include html or svg in text-only inscription - why? why not?
62
+ ## include markdown in text-only inscription - why? why not?
63
+ ## make content_type lower case with lower() - why? why not?
64
+ where( content_type: [
65
+ 'text/plain',
66
+ 'text/plain;charset=utf-8',
67
+ 'text/plain;charset=us-ascii',
68
+ 'application/json',
69
+ ])
70
+ end
71
+
72
+ =begin
73
+ def self.search( q ) ## "full-text" search helper
74
+ ## rename to text_search - why? why not?
75
+ ## auto-sort by num - why? why not?
76
+ joins(:blob).text.where( "content LIKE '%#{q}%'" ).order('num')
77
+ end
78
+ =end
79
+
80
+ def self.sub1k() where( 'num < 1000' ); end
81
+ def self.sub2k() where( 'num < 2000' ); end
82
+ def self.sub10k() where( 'num < 10000' ); end
83
+ def self.sub20k() where( 'num < 20000' ); end
84
+ def self.sub100k() where( 'num < 100000' ); end
85
+ def self.sub1m() where( 'num < 1000000' ); end
86
+ def self.sub2m() where( 'num < 2000000' ); end
87
+ def self.sub10m() where( 'num < 10000000' ); end
88
+ def self.sub20m() where( 'num < 20000000' ); end
89
+ def self.sub21m() where( 'num < 21000000' ); end
90
+
91
+
92
+ def self.largest
93
+ order( 'bytes DESC' )
94
+ end
95
+
96
+ def self.content_type_counts
97
+ group( 'content_type' )
98
+ .order( Arel.sql( 'COUNT(*) DESC, content_type')).count
99
+ end
100
+
101
+ class << self
102
+ alias_method :biggest, :largest
103
+ alias_method :counts_by_content_type, :content_type_counts
104
+ end
105
+
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
165
+ 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
181
+ end
182
+ end
183
+ =end
184
+
185
+ end # class Scribe
186
+
187
+ end # module Model
188
+ end # module ScribeDb
189
+
@@ -0,0 +1,18 @@
1
+
2
+ module ScribeDb
3
+ module Model
4
+
5
+ class Tx < ActiveRecord::Base
6
+ self.table_name = 'txs' ## note auto-infers txes change to txs
7
+
8
+ belongs_to :inscribe, foreign_key: 'id'
9
+ =begin
10
+ def text
11
+ content.force_encoding(Encoding::UTF_8)
12
+ end
13
+ =end
14
+ end # class Tx
15
+
16
+ end # module Model
17
+ end # module ScribeDb
18
+
@@ -0,0 +1,75 @@
1
+
2
+
3
+ module ScribeDb
4
+
5
+ class CreateDb
6
+
7
+ def up
8
+
9
+ ActiveRecord::Schema.define do
10
+
11
+ create_table :scribes, :id => :string do |t|
12
+ ## "id": "0a3a4dbf6630338bc4df8e36bd081f8f7d2dee9441131cb03a18d43eb4882d5ci0",
13
+ ## note: change to uuid (universally unique id) - why? why not?
14
+ ## id gets used by row_id (internal orm db machinery) and is int
15
+ ## t.string :uuid, null: false, index: { unique: true, name: 'scribe_uuids' }
16
+
17
+ ## "title": "Inscription 10371414",
18
+ ## note: use num/no. from title only - why? why not?
19
+ t.integer :num, null: false, index: { unique: true, name: 'scribe_nums' }
20
+
21
+ ## "content length": "85 bytes",
22
+ ## note: extract bytes as integer!!!
23
+ ## change to bytes - why? why not?
24
+ t.integer :bytes
25
+ ## "content type": "text/plain;charset=utf-8",
26
+ ## note: make sure always lower/down case!!!
27
+ t.string :content_type
28
+
29
+ ## add allow duplicate opt-in protocol flag e.g. esip6
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
+
36
+ ## timestamp last
37
+ t.timestamps
38
+ end
39
+
40
+
41
+ ## change to tx/txs or txn/txns - why? why not?
42
+
43
+ create_table :txs, :id => :string do |t|
44
+ ## "id": "0a3a4dbf6630338bc4df8e36bd081f8f7d2dee9441131cb03a18d43eb4882d5ci0",
45
+ ## note: change to uuid (universally unique id) - why? why not?
46
+ ## id gets used by row_id (internal orm db machinery) and is int
47
+ ## t.string :id, null: false, index: { unique: true, name: 'blob_uuids' }
48
+
49
+ t.binary :data # , null: false
50
+
51
+ ## "timestamp": "2023-06-01 05:00:57 UTC"
52
+ ## or use date_utc ???
53
+ ## or change to t.integer AND timestamp or time or epoch(time) - why? why not?
54
+ t.datetime :date, null: false
55
+
56
+ t.integer :block, null: false
57
+ t.integer :idx, null: false ## transaction index (number)
58
+
59
+ t.string :from, null: false
60
+ t.string :to, null: false
61
+
62
+ t.integer :fee
63
+ t.integer :value
64
+
65
+
66
+ ## timestamp last
67
+ t.timestamps
68
+ end
69
+
70
+ end # block Schema.define
71
+
72
+ end # method up
73
+ end # class CreateDb
74
+
75
+ end # module ScribeDb
@@ -0,0 +1,19 @@
1
+
2
+ module Scribelite
3
+ MAJOR = 0 ## todo: namespace inside version or something - why? why not??
4
+ MINOR = 2
5
+ PATCH = 0
6
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
7
+
8
+ def self.version
9
+ VERSION
10
+ end
11
+
12
+ def self.banner
13
+ "scribelite/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in >#{root}<"
14
+ end
15
+
16
+ def self.root
17
+ File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
18
+ end
19
+ end
data/lib/scribelite.rb CHANGED
@@ -1,4 +1,146 @@
1
1
 
2
+ # core and stlibs
3
+ require 'ethscribe' ## will pull-in cocos & friends
4
+ require 'calldata'
2
5
 
3
- puts "Hello, Scribelite!"
6
+
7
+ require 'logger' # Note: use for ActiveRecord::Base.logger -- remove/replace later w/ LogUtils::Logger ???
8
+ require 'date' ## check if date & datetime required ??
9
+
10
+
11
+ # 3rd party gems / libs
12
+ require 'props' # see github.com/rubylibs/props
13
+ require 'logutils' # see github.com/rubylibs/logutils
14
+
15
+
16
+ require 'active_record' ## todo: add sqlite3? etc.
17
+
18
+ ## add more activerecords addons/utils
19
+ # require 'tagutils'
20
+ require 'activerecord/utils'
21
+ require 'props/activerecord' # includes ConfDb (ConfDb::Model::Prop, etc.)
22
+ require 'logutils/activerecord' # includes LogDb (LogDb::Model::Log, etc.)
23
+
24
+
25
+
26
+ # our own code
27
+ require_relative 'scribelite/version' # always goes first
28
+
29
+ require_relative 'scribelite/models/forward'
30
+
31
+ require_relative 'scribelite/models/scribe'
32
+ require_relative 'scribelite/models/tx'
33
+
34
+
35
+ require_relative 'scribelite/schema'
36
+
37
+ # require_relative 'cache'
38
+ # require_relative 'importer' ## note: require (soft dep) ordinals gems!!!
39
+
40
+
41
+
42
+
43
+ module ScribeDb
44
+
45
+ def self.create
46
+ CreateDb.new.up
47
+ ConfDb::Model::Prop.create!( key: 'db.schema.scribe.version',
48
+ value: Scribelite::VERSION )
49
+ end
50
+
51
+ def self.create_all
52
+ LogDb.create # add logs table
53
+ ConfDb.create # add props table
54
+ ScribeDb.create
55
+ end
56
+
57
+ def self.auto_migrate!
58
+ ### todo/fix:
59
+ ## check props table and versions!!!!!
60
+
61
+ # first time? - auto-run db migratation, that is, create db tables
62
+ unless LogDb::Model::Log.table_exists?
63
+ LogDb.create # add logs table
64
+ end
65
+
66
+ unless ConfDb::Model::Prop.table_exists?
67
+ ConfDb.create # add props table
68
+ end
69
+
70
+ unless ScribeDb::Model::Scribe.table_exists?
71
+ ScribeDb.create
72
+ end
73
+ end # method auto_migrate!
74
+
75
+
76
+ def self.open( database='./scribe.db' ) ## convenience helper for sqlite only
77
+ connect( adapter: 'sqlite3',
78
+ database: database )
79
+
80
+ ## build schema if database new/empty
81
+ auto_migrate!
82
+ end
83
+
84
+
85
+
86
+ def self.connect( config={} )
87
+
88
+ if config.empty?
89
+ puts "ENV['DATBASE_URL'] - >#{ENV['DATABASE_URL']}<"
90
+
91
+ ### change default to ./scribe.db ?? why? why not?
92
+ db = URI.parse( ENV['DATABASE_URL'] || 'sqlite3:///scribe.db' )
93
+
94
+ if db.scheme == 'postgres'
95
+ config = {
96
+ adapter: 'postgresql',
97
+ host: db.host,
98
+ port: db.port,
99
+ username: db.user,
100
+ password: db.password,
101
+ database: db.path[1..-1],
102
+ encoding: 'utf8'
103
+ }
104
+ else # assume sqlite3
105
+ config = {
106
+ adapter: db.scheme, # sqlite3
107
+ database: db.path[1..-1] # scribe.db (NB: cut off leading /, thus 1..-1)
108
+ }
109
+ end
110
+ end
111
+
112
+ puts "Connecting to db using settings: "
113
+ pp config
114
+ ActiveRecord::Base.establish_connection( config )
115
+ # ActiveRecord::Base.logger = Logger.new( STDOUT )
116
+ end
117
+
118
+
119
+ def self.setup_in_memory_db
120
+
121
+ # Database Setup & Config
122
+ ActiveRecord::Base.logger = Logger.new( STDOUT )
123
+ ## ActiveRecord::Base.colorize_logging = false - no longer exists - check new api/config setting?
124
+
125
+ self.connect( adapter: 'sqlite3',
126
+ database: ':memory:' )
127
+
128
+ ## build schema
129
+ ScribeDb.create_all
130
+ end # setup_in_memory_db (using SQLite :memory:)
131
+
132
+ end # module ScribeDb
133
+
134
+
135
+
136
+
137
+
138
+
139
+ ## add convenience helpers
140
+ Scribe = ScribeDb::Model::Scribe
141
+ Tx = ScribeDb::Model::Tx
142
+
143
+
144
+ # say hello
145
+ puts Scribelite.banner ## if defined?($RUBYCOCOS_DEBUG) && $RUBCOCOS_DEBUG
4
146
 
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.0.1
4
+ version: 0.2.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: 2023-11-21 00:00:00.000000000 Z
11
+ date: 2023-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ethscribe
@@ -24,6 +24,118 @@ 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'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activerecord-utils
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: logutils
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: logutils-activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: props
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: props-activerecord
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sqlite3
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
27
139
  - !ruby/object:Gem::Dependency
28
140
  name: rdoc
29
141
  requirement: !ruby/object:Gem::Requirement
@@ -58,7 +170,7 @@ dependencies:
58
170
  - - "~>"
59
171
  - !ruby/object:Gem::Version
60
172
  version: '4.0'
61
- description: scribelite - inscription / inscribe (ethscription calldata) database
173
+ description: scribelite gem - inscription / inscribe (ethscription calldata) database
62
174
  for ethereum & co; let's you query via sql and more
63
175
  email: gerald.bauer@gmail.com
64
176
  executables: []
@@ -73,6 +185,11 @@ files:
73
185
  - README.md
74
186
  - Rakefile
75
187
  - lib/scribelite.rb
188
+ - lib/scribelite/models/forward.rb
189
+ - lib/scribelite/models/scribe.rb
190
+ - lib/scribelite/models/tx.rb
191
+ - lib/scribelite/schema.rb
192
+ - lib/scribelite/version.rb
76
193
  homepage: https://github.com/s6ruby/rubidity
77
194
  licenses:
78
195
  - Public Domain
@@ -97,6 +214,6 @@ requirements: []
97
214
  rubygems_version: 3.4.10
98
215
  signing_key:
99
216
  specification_version: 4
100
- summary: scribelite - inscription / inscribe (ethscription calldata) database for
101
- ethereum & co; let's you query via sql and more
217
+ summary: scribelite gem - inscription / inscribe (ethscription calldata) database
218
+ for ethereum & co; let's you query via sql and more
102
219
  test_files: []