ordlite 0.2.1 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f1f6f768a785a0badc768db45c1c8ca831958f983b673fe48990846f3d4260e
4
- data.tar.gz: 234d31cabdc7ed109144487792da9f77c39821f935e3d7d91a151b91e817d511
3
+ metadata.gz: 44ca59e7026e8b717d26f8ae42ed7050d08abd44047dca6de505582253e2f22b
4
+ data.tar.gz: f2728433967a7d58612e68d0402a3d9c9c9b644e71bdfe6c4aeca2e103cd116f
5
5
  SHA512:
6
- metadata.gz: 403e1addf0b974af179de293a26c5f1f47da8d0f665da1ca1a44a89cbcfb025a642a04930f49f6df35681527b2cbcaae855f87de4b7ce09e6cd88b4cffab1472
7
- data.tar.gz: ab359d39d1dcdf307e8b3239ed61e2f10f8fc6bfc4316c3f9f5554a9fbc2d88b0d1c24f120afcab9b035c675d82d22e0292c6d1202db7219d64f5e8f2c214b54
6
+ metadata.gz: 6dfd8030275128218b5057c0ed7a585f5a1688acfe894da4183e7e788b26b239565f84ac25bead42cf144d393a1e04ee68c900b918d15b8d4202267d2cad4815
7
+ data.tar.gz: af1eab5bb9c6e88b698ccd485ef6d8fc08bcd0f2c714faed0ee66d30c834d9ecc2c250c2792285f772a705a33cf5d13fa558965207d6d237b161de6e9c2ff3dc
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ### 0.2.1
1
+ ### 0.3.0
2
2
  ### 0.0.1 / 2023-07-01
3
3
 
4
4
  * Everything is new. First release
@@ -125,17 +125,70 @@ def import_csv( path, content: true )
125
125
  end
126
126
  end # method import_csv
127
127
 
128
+
128
129
  def import( id_or_ids, content: true )
130
+ ## note: support (integer) numbers too (e.g. 0/1/2, etc.)
129
131
  if id_or_ids.is_a?( String )
130
132
  id = id_or_ids
131
133
  _import( id, content: content )
132
- else ## assume array
133
- ids = id_or_ids
134
- ids.each do |id|
135
- _import( id, content: content )
134
+ elsif id_or_ids.is_a?( Integer )
135
+ num = id_or_ids
136
+ _import_by_num( num, content: content )
137
+ elsif id_or_ids.is_a?( Array )
138
+ if id_or_ids.empty? ## id_or_ids.size == 0
139
+ ## do nothing; empty array
140
+ else
141
+ first = id_or_ids[0]
142
+ if first.is_a?( String )
143
+ ids = id_or_ids
144
+ ids.each do |id|
145
+ _import( id, content: content )
146
+ end
147
+ elsif first.is_a?( Integer )
148
+ nums = id_or_ids
149
+ nums.each do |num|
150
+ _import_by_num( num, content: content )
151
+ end
152
+ elsif first.is_a?( Hash ) && first.has_key?( 'id' )
153
+ ## try to get ids with records
154
+ recs = id_or_ids
155
+ ids = recs.map {|rec| rec['id'] }
156
+ ids.each do |id|
157
+ _import( id, content: content )
158
+ end
159
+ elsif first.is_a?( Hash ) && first.has_key?( 'num' )
160
+ ## try to get nums with records
161
+ recs = id_or_ids
162
+ nums = recs.map {|rec| rec['num'] }
163
+ nums.each do |num|
164
+ ## note: support numbers as strings too
165
+ num = num.to_i(10) if num.is_a?( String )
166
+ _import_by_num( num, content: content )
167
+ end
168
+ else
169
+ raise ArgumentError, "expected Array of String|Integer or Hash (with keys id|num); got #{first.class.name}"
170
+ end
136
171
  end
172
+ else
173
+ raise ArgumentError, "expected String or Array; got #{id_or_ids.class.name}"
137
174
  end
138
- end
175
+ end # method import
176
+
177
+
178
+ def _import_content( id )
179
+ ## check if (content) blob is already in db?
180
+ blob = Blob.find_by( id: id )
181
+ if blob ## already in db; do nothing
182
+ else ## fetch via ordinals.com api and update db
183
+ content = Ordinals.content( id )
184
+
185
+ puts " content-type: #{content.type}"
186
+ puts " content-length: #{content.length}"
187
+
188
+ Blob.create( id: id, content: content.data )
189
+ end
190
+ end
191
+
139
192
 
140
193
  def _import( id, content: true )
141
194
  ## check if inscription / inscribe is already in db?
@@ -149,19 +202,22 @@ def _import( id, content: true )
149
202
  Inscribe.create_from_api( data )
150
203
  end
151
204
 
152
- if content
153
- ## check if (content) blob is already in db?
154
- blob = Blob.find_by( id: id )
155
- if blob ## already in db; do nothing
156
- else ## fetch via ordinals.com api and update db
157
- content = Ordinals.content( id )
205
+ _import_content( id ) if content
206
+ end
158
207
 
159
- puts " content-type: #{content.type}"
160
- puts " content-length: #{content.length}"
161
-
162
- Blob.create( id: id, content: content.data )
163
- end
164
- end
208
+ def _import_by_num( num, content: true )
209
+ ## check if inscription / inscribe is already in db?
210
+ inscribe = Inscribe.find_by( num: num )
211
+ if inscribe ## already in db; dump record
212
+ ## pp inscribe
213
+ else ## fetch via ordinals.com api and update db
214
+ data = Ordinals.inscription( num )
215
+
216
+ pp data
217
+ inscribe = Inscribe.create_from_api( data )
218
+ end
219
+
220
+ _import_content( inscribe.id ) if content
165
221
  end
166
222
 
167
223
  end # class Importer
@@ -18,6 +18,68 @@ module OrdDb
18
18
 
19
19
  ################################
20
20
  ### scope like helpers
21
+ def self.png() where( content_type: 'image/png' ); end
22
+ def self.gif() where( content_type: 'image/gif' ); end
23
+ def self.jpg() where( content_type: 'image/jpeg' ); end
24
+ def self.webp() where( content_type: 'image/webp' ); end
25
+ def self.svg() where( content_type: 'image/svg+xml' ); end
26
+ def self.avif() where( content_type: 'image/avif' ); end
27
+
28
+ class << self
29
+ alias_method :jpeg, :jpg
30
+ end
31
+
32
+ def self.image
33
+ ## change to/or add alias e.g. image/images - why? why not
34
+ where( content_type: [
35
+ 'image/png',
36
+ 'image/jpeg',
37
+ 'image/gif',
38
+ 'image/webp',
39
+ 'image/svg+xml',
40
+ 'image/avif',
41
+ ])
42
+ end
43
+
44
+ def self.html
45
+ where( content_type: [
46
+ 'text/html;charset=utf-8',
47
+ 'text/html',
48
+ ])
49
+ end
50
+
51
+ def self.js
52
+ where( content_type: [
53
+ 'text/javascript',
54
+ 'application/javascript',
55
+ ])
56
+ end
57
+
58
+ class << self
59
+ alias_method :javascript, :js
60
+ end
61
+
62
+ def self.text
63
+ ## change to/or add alias e.g. text/texts - why? why not
64
+ ## include html or svg in text-only inscription - why? why not?
65
+ ## include markdown in text-only inscription - why? why not?
66
+ ## make content_type lower case with lower() - why? why not?
67
+ where( content_type: [
68
+ 'text/plain',
69
+ 'text/plain;charset=utf-8',
70
+ 'text/plain;charset=us-ascii',
71
+ 'application/json',
72
+ ])
73
+ end
74
+
75
+ def self.search( q ) ## "full-text" search helper
76
+ ## rename to text_search - why? why not?
77
+ ## auto-sort by num - why? why not?
78
+ joins(:blob).text.where( "content LIKE '%#{q}%'" ).order('num')
79
+ end
80
+
81
+
82
+
21
83
  def self.deploys
22
84
  where_clause =<<SQL
23
85
  content LIKE '%deploy%'
@@ -25,7 +87,7 @@ AND ( content LIKE '%orc-721%'
25
87
  OR content LIKE '%og%')
26
88
  SQL
27
89
 
28
- joins(:blob).where( where_clause ).order( 'num' )
90
+ joins(:blob).text.where( where_clause ).order( 'num' )
29
91
  end
30
92
 
31
93
  def self.deploys_by( slug: )
@@ -36,7 +98,7 @@ AND ( content LIKE '%orc-721%'
36
98
  AND content LIKE '%#{slug}%'
37
99
  SQL
38
100
 
39
- joins(:blob).where( where_clause ).order( 'num' )
101
+ joins(:blob).text.where( where_clause ).order( 'num' )
40
102
  end
41
103
 
42
104
  def self.mints
@@ -46,7 +108,7 @@ AND ( content LIKE '%orc-721%'
46
108
  OR content LIKE '%og%')
47
109
  SQL
48
110
 
49
- joins(:blob).where( where_clause ).order( 'num' )
111
+ joins(:blob).text.where( where_clause ).order( 'num' )
50
112
  end
51
113
 
52
114
  def self.mints_by( slug: )
@@ -57,9 +119,10 @@ AND ( content LIKE '%orc-721%'
57
119
  AND content LIKE '%#{slug}%'
58
120
  SQL
59
121
 
60
- joins(:blob).where( where_clause ).order( 'num' )
122
+ joins(:blob).text.where( where_clause ).order( 'num' )
61
123
  end
62
124
 
125
+
63
126
  def self.sub1k() where( 'num < 1000' ); end
64
127
  def self.sub2k() where( 'num < 2000' ); end
65
128
  def self.sub10k() where( 'num < 10000' ); end
@@ -129,23 +192,12 @@ SQL
129
192
  end
130
193
 
131
194
 
132
- def self.text
133
- ## note: for now include:
134
- ## - text/plain (all variants)
135
- ## - text/json (all variants)
136
- ## - text/markdown
137
- where( content_type:
138
- ['text/plain',
139
- 'text/plain;charset=utf-8',
140
- 'text/markdown',
141
- 'application/json',
142
- ]
143
- )
144
- end
145
- def self.png() where( content_type: 'image/png' ); end
195
+
146
196
 
147
197
  ###
148
198
  ## add support for ordinals.com api txt (headers format)
199
+ ##
200
+ ## todo/fix: move to importer!!! - why? why not?
149
201
 
150
202
 
151
203
  def self.create_from_api( data ) create( _parse_api( data )); end
@@ -56,6 +56,7 @@ create_table :inscribes, :id => :string do |t|
56
56
 
57
57
  ## "timestamp": "2023-06-01 05:00:57 UTC"
58
58
  ## or use date_utc ???
59
+ ## or change to t.integer AND timestamp or time or epoch(time) - why? why not?
59
60
  t.datetime :date, null: false
60
61
 
61
62
  ##
@@ -99,8 +100,8 @@ create_table :blobs, :id => :string do |t|
99
100
  ## t.string :id, null: false, index: { unique: true, name: 'blob_uuids' }
100
101
 
101
102
  t.binary :content, null: false
102
- t.string :sha256 ## sha256 hash
103
- t.string :md5 ## md5 hash - add why? why not?
103
+ t.string :sha256 ## sha256 hash as hexstring
104
+ t.string :md5 ## md5 hash as hexstring - add why? why not?
104
105
 
105
106
  ## timestamp last
106
107
  t.timestamps
@@ -193,23 +194,5 @@ end # block Schema.define
193
194
 
194
195
  end # method up
195
196
  end # class CreateDb
196
-
197
- ###
198
- # migrations helpers
199
- class AddGeneratives
200
-
201
- def up
202
- ActiveRecord::Schema.define do
203
- create_table :generatives, :id => :string do |t|
204
- t.string :factory_id, null: false
205
- t.string :g, null: false ## use space separated numbers - why? why not?
206
- t.binary :content ### optional for now - why? why not?
207
-
208
- ## timestamp last
209
- t.timestamps
210
- end
211
- end # block Schema.define
212
- end # method up
213
- end # class AddGeneratives
214
197
 
215
198
  end # module OrdDb
@@ -3,8 +3,8 @@ module Ordlite
3
3
 
4
4
  # sync version w/ sport.db n friends - why? why not?
5
5
  MAJOR = 0 ## todo: namespace inside version or something - why? why not??
6
- MINOR = 2
7
- PATCH = 1
6
+ MINOR = 3
7
+ PATCH = 0
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
10
10
  def self.version
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ordlite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.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-08-07 00:00:00.000000000 Z
11
+ date: 2023-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ordinals