steem_api 1.1.2pre3 → 1.1.2
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/README.md +14 -0
- data/Rakefile +37 -17
- data/lib/steem_api.rb +3 -0
- data/lib/steem_api/models/account.rb +2 -0
- data/lib/steem_api/models/block.rb +2 -0
- data/lib/steem_api/models/comment.rb +8 -0
- data/lib/steem_api/models/transaction.rb +51 -4
- data/lib/steem_api/models/tx/account_witness_vote.rb +3 -1
- data/lib/steem_api/version.rb +1 -1
- data/steem_api.gemspec +8 -0
- metadata +144 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1e08e8cc01361b2d9423d34becd77e7134857ebdc1f8e0d465cd3df15a64559
|
4
|
+
data.tar.gz: 2613695550d654ce35829cd3a18eb64795c20317c865e5ebf68285ef7cd64755
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac450071a0985546724ecee5e42f08d26a8c131dabd44581171535c47c1404c7a226d6673e630fe4d799dc12cbf714790d36d7964c238e3b159d4b6fee695b7e
|
7
|
+
data.tar.gz: 2dbbc676b3087c04d14da6c775237bdf77784db03f8bbfb745530975d02424eb1f4588d4f4090b94bafebf0adad58e211180ac3bdf03a97c0c4065c87dc754d4
|
data/README.md
CHANGED
@@ -12,6 +12,20 @@
|
|
12
12
|
|
13
13
|
As of 2018-01-23, [SteemSQL is moving to a monthly subscription model](https://steemit.com/steemsql/@arcange/steemsql-is-moving-to-a-monthly-subscription-model). To use this gem, you must subscribe to @steemsql and store the credentials as environment variables.
|
14
14
|
|
15
|
+
### Prerequeisits
|
16
|
+
|
17
|
+
#### Linux
|
18
|
+
|
19
|
+
```bash
|
20
|
+
apt-get update && apt-get install -yq freetds-dev freetds-bin
|
21
|
+
```
|
22
|
+
|
23
|
+
#### macOS
|
24
|
+
|
25
|
+
```bash
|
26
|
+
brew install freetds
|
27
|
+
```
|
28
|
+
|
15
29
|
### How To Use (Standalone)
|
16
30
|
- `gem install steem_api`
|
17
31
|
- export STEEMSQL_HOST=<your steemsql host>
|
data/Rakefile
CHANGED
@@ -4,9 +4,14 @@ require 'steem_api'
|
|
4
4
|
require 'awesome_print'
|
5
5
|
|
6
6
|
Rake::TestTask.new(:test) do |t|
|
7
|
-
t.libs <<
|
8
|
-
t.libs <<
|
7
|
+
t.libs << 'test'
|
8
|
+
t.libs << 'lib'
|
9
9
|
t.test_files = FileList['test/**/*_test.rb']
|
10
|
+
t.ruby_opts << if ENV['HELL_ENABLED']
|
11
|
+
'-W2'
|
12
|
+
else
|
13
|
+
'-W1'
|
14
|
+
end
|
10
15
|
end
|
11
16
|
|
12
17
|
task :default => :test
|
@@ -37,9 +42,9 @@ namespace :created do
|
|
37
42
|
accounts = accounts.order('cast_timestamp_as_date ASC')
|
38
43
|
|
39
44
|
accounts = accounts.count
|
40
|
-
|
45
|
+
puts "# Daily creation count by #{creator.nil? ? 'all account creators' : creator} since #{after_timestamp} ..."
|
41
46
|
ap accounts
|
42
|
-
|
47
|
+
puts "# Total accounts: #{accounts.values.sum}"
|
43
48
|
end
|
44
49
|
|
45
50
|
desc 'Lists custom_json_operations grouped by id and date.'
|
@@ -67,9 +72,9 @@ namespace :created do
|
|
67
72
|
[k, v] if v >= min_count
|
68
73
|
end.compact.to_h
|
69
74
|
|
70
|
-
|
75
|
+
puts "# Daily creation count by #{tid.nil? ? 'all custom_json_operation' : tid} since #{after_timestamp} ..."
|
71
76
|
ap customs
|
72
|
-
|
77
|
+
puts "# Total custom_json_operation: #{customs.values.sum}"
|
73
78
|
end
|
74
79
|
end
|
75
80
|
|
@@ -125,7 +130,7 @@ task :powerup, [:minimum_amount, :symbol, :days_ago, :not_to_self] do |t, args|
|
|
125
130
|
|
126
131
|
puts "# Daily transfer sum over #{'%.3f' % minimum_amount} #{symbol} #{not_to_self ? '' : 'not to self '}since #{after_timestamp} ..."
|
127
132
|
ap transfers
|
128
|
-
|
133
|
+
puts "# Total #{symbol}: #{transfers.values.sum}"
|
129
134
|
end
|
130
135
|
|
131
136
|
desc 'Lists sum of powered down grouped by date, from, and to.'
|
@@ -161,7 +166,7 @@ task :powerdown, [:minimum_amount, :symbol, :days_ago, :not_to_self] do |t, args
|
|
161
166
|
|
162
167
|
puts "# Daily transfer sum over #{'%.3f' % minimum_amount} #{symbol} #{not_to_self ? '' : 'not to self '}since #{after_timestamp} ..."
|
163
168
|
ap transfers
|
164
|
-
|
169
|
+
puts "# Total #{symbol}: #{transfers.values.sum}"
|
165
170
|
end
|
166
171
|
|
167
172
|
desc 'Lists apps grouped by date, app/version.'
|
@@ -197,7 +202,7 @@ task :app_names, [:app, :days_ago] do |t, args|
|
|
197
202
|
puts "# Daily app#{matching} count since #{after_timestamp} ..."
|
198
203
|
|
199
204
|
app_names = {}
|
200
|
-
|
205
|
+
|
201
206
|
comments.count(:all).each do |k, v|
|
202
207
|
date, app = k
|
203
208
|
if !!app && app.include?('/')
|
@@ -374,26 +379,41 @@ end
|
|
374
379
|
|
375
380
|
namespace :rewards do
|
376
381
|
desc 'Lists author rewards grouped by date.'
|
377
|
-
task :author, [:symbol, :days_ago] do |t, args|
|
382
|
+
task :author, [:symbol, :days_ago, :author] do |t, args|
|
378
383
|
now = Time.now.utc
|
379
384
|
symbol = (args[:symbol] || 'SBD').upcase
|
380
385
|
after_timestamp = now - ((args[:days_ago] || '7').to_i * 86400)
|
386
|
+
author = args[:author]
|
381
387
|
|
382
388
|
rewards = SteemApi::Vo::AuthorReward
|
383
389
|
rewards = rewards.where('timestamp > ?', after_timestamp)
|
384
390
|
rewards = rewards.group('CAST(timestamp AS DATE)')
|
385
391
|
rewards = rewards.order('cast_timestamp_as_date ASC')
|
386
392
|
|
387
|
-
|
393
|
+
if !!author
|
394
|
+
if author =~ /%/
|
395
|
+
rewards = rewards.where("author LIKE ?", author)
|
396
|
+
else
|
397
|
+
rewards = rewards.where(author: author)
|
398
|
+
end
|
399
|
+
|
400
|
+
puts "Daily #{author} reward #{symbol} sum grouped by date since #{after_timestamp} ..."
|
401
|
+
else
|
402
|
+
puts "Daily reward #{symbol} sum grouped by date since #{after_timestamp} ..."
|
403
|
+
end
|
388
404
|
|
389
|
-
case symbol
|
390
|
-
when 'SBD' then
|
391
|
-
when 'STEEM' then
|
392
|
-
when 'VESTS' then
|
405
|
+
rewards = case symbol
|
406
|
+
when 'SBD' then rewards.sum(:sbd_payout)
|
407
|
+
when 'STEEM' then rewards.sum(:steem_payout)
|
408
|
+
when 'VESTS' then rewards.sum(:vesting_payout)
|
393
409
|
when 'MVESTS'
|
394
|
-
|
410
|
+
rewards.sum('vesting_payout / 1000000')
|
395
411
|
else; puts "Unknown symbol: #{symbol}. Symbols supported: SBD, STEEM, VESTS, MVESTS"
|
396
412
|
end
|
413
|
+
|
414
|
+
ap rewards
|
415
|
+
sum = rewards.values.sum
|
416
|
+
puts "# Total rewards: %.3f %s (average: %.3f per day)" % [sum, symbol, (sum / rewards.size)]
|
397
417
|
end
|
398
418
|
|
399
419
|
desc 'Lists curation rewards grouped by date.'
|
@@ -469,7 +489,7 @@ task :claimed, [:account_name, :days_ago, :symbol] do |t, args|
|
|
469
489
|
puts "# Claimed rewards in #{symbol.to_s.upcase} sum grouped by month ..."
|
470
490
|
|
471
491
|
ap claims
|
472
|
-
|
492
|
+
puts "# Total claimed #{symbol}: #{claims.values.sum}"
|
473
493
|
end
|
474
494
|
|
475
495
|
# Doesn't look like this table exists.
|
data/lib/steem_api.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
1
3
|
require "steem_api/version"
|
2
4
|
|
3
5
|
# Top Level Models
|
@@ -16,6 +18,7 @@ require "steem_api/models/witness"
|
|
16
18
|
# Sub Level Models
|
17
19
|
require "steem_api/models/tx/account_create"
|
18
20
|
require "steem_api/models/tx/account_recover"
|
21
|
+
require "steem_api/models/tx/account_update"
|
19
22
|
require "steem_api/models/tx/account_witness_proxy"
|
20
23
|
require "steem_api/models/tx/account_witness_vote"
|
21
24
|
require "steem_api/models/tx/claim_reward_balance"
|
@@ -34,6 +34,10 @@ module SteemApi
|
|
34
34
|
r
|
35
35
|
}
|
36
36
|
|
37
|
+
scope :beneficiaries, lambda { |account|
|
38
|
+
where("JSON_VALUE(beneficiaries, '$.account') IN(?)", [account].flatten)
|
39
|
+
}
|
40
|
+
|
37
41
|
def self.find_by_author(user)
|
38
42
|
self.where(author: user)
|
39
43
|
end
|
@@ -41,6 +45,10 @@ module SteemApi
|
|
41
45
|
def self.find_by_parent(user)
|
42
46
|
self.where(parent_author: user)
|
43
47
|
end
|
48
|
+
|
49
|
+
def beneficiaries
|
50
|
+
JSON[self[:beneficiaries]]
|
51
|
+
end
|
44
52
|
|
45
53
|
end
|
46
54
|
end
|
@@ -3,16 +3,63 @@ module SteemApi
|
|
3
3
|
|
4
4
|
self.table_name = :Transactions
|
5
5
|
self.primary_key = :tx_id
|
6
|
+
|
7
|
+
belongs_to :block, foreign_key: :block_num
|
8
|
+
has_many :block_transactions, through: :block, source: :transactions
|
6
9
|
|
7
10
|
scope :before, lambda { |before, field = 'expiration'| where("#{field} < ?", before) }
|
8
11
|
scope :after, lambda { |after, field = 'expiration'| where("#{field} > ?", after) }
|
9
12
|
scope :today, -> { after(1.day.ago) }
|
10
13
|
scope :yesterday, -> { before(1.day.ago).after(2.days.ago) }
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
+
|
15
|
+
scope :type, lambda { |type| where(type: type) }
|
16
|
+
|
17
|
+
# So you have a Transaction#tx_id and you want to know what the operation was
|
18
|
+
# that lead to it. Well, that's tricky because all of the ops are in their
|
19
|
+
# own tables. This method will (slowly) try to find the appropriate table.
|
20
|
+
def op
|
21
|
+
retries = 0
|
22
|
+
puts type
|
23
|
+
# Here, we map the type to class name, if supported. Most of them can be
|
24
|
+
# mapped automatically, e.g. "vote" => "Vote" but some types share tables
|
25
|
+
# with one another. We also use timestamps to narrow the search
|
26
|
+
# parameters, for all the good it does. We use the expiration minus the
|
27
|
+
# maximum TaPoS window.
|
28
|
+
op_type = case type
|
29
|
+
when 'account_create_with_delegation', 'create_claimed_account' then 'AccountCreate'
|
30
|
+
when 'comment_options' then 'CommentOption'
|
31
|
+
when 'custom_json' then 'Custom'
|
32
|
+
when 'delegate_vesting_shares' then 'DelegateVestingShare'
|
33
|
+
when 'feed_publish' then 'Feed'
|
34
|
+
when 'limit_order_create', 'limit_order_create2' then 'LimitOrder'
|
35
|
+
when 'Pow2' then 'Pow'
|
36
|
+
when 'set_withdraw_vesting_route' then 'WithdrawVestingRoute'
|
37
|
+
when 'transfer_from_savings', 'transfer_to_vesting' then 'Transfer'
|
38
|
+
when 'withdraw_vesting' then 'Withdraw'
|
39
|
+
when *%w(
|
40
|
+
cancel_transfer_from_savings change_recovery_account claim_account
|
41
|
+
decline_voting_rights limit_order_cancel recover_account
|
42
|
+
request_account_recovery witness_set_properties
|
43
|
+
) then raise "Unsupported: #{type}"
|
44
|
+
else; type.split('_').collect(&:capitalize).join
|
45
|
+
end
|
46
|
+
|
47
|
+
tapos_window_start = expiration - 28800.seconds
|
48
|
+
ops = Tx.const_get(op_type).where(tx_id: self).
|
49
|
+
where("timestamp BETWEEN ? AND ?", tapos_window_start, expiration)
|
50
|
+
|
51
|
+
loop do
|
52
|
+
retries += 1
|
53
|
+
op = ops.first
|
54
|
+
|
55
|
+
return op if !!op
|
56
|
+
break if retries > 10
|
57
|
+
|
58
|
+
sleep 3
|
59
|
+
end
|
60
|
+
|
61
|
+
raise "Unable to find #{type} for tx_id: #{tx_id}"
|
14
62
|
end
|
15
|
-
|
16
63
|
end
|
17
64
|
end
|
18
65
|
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module SteemApi
|
2
2
|
module Tx
|
3
3
|
class AccountWitnessVote < SteemApi::SqlBase
|
4
|
-
|
4
|
+
belongs_to :account_record, foreign_key: :account, primary_key: :name, class_name: 'SteemApi::Account'
|
5
|
+
belongs_to :witness_record, foreign_key: :witness, primary_key: :name, class_name: 'SteemApi::Account'
|
6
|
+
|
5
7
|
self.table_name = :TxAccountWitnessVotes
|
6
8
|
|
7
9
|
end
|
data/lib/steem_api/version.rb
CHANGED
data/steem_api.gemspec
CHANGED
@@ -21,6 +21,14 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = "steem_api"
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
+
spec.add_development_dependency 'bundler', '~> 2.0', '>= 2.0.1'
|
25
|
+
spec.add_development_dependency 'rake', '~> 12.1', '>= 12.1.0'
|
26
|
+
spec.add_development_dependency 'minitest-proveit', '~> 1.0', '>= 1.0.0'
|
27
|
+
spec.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.3'
|
28
|
+
spec.add_development_dependency 'minitest-line', '~> 0.6', '>= 0.6.4'
|
29
|
+
spec.add_development_dependency 'simplecov', '~> 0.11', '>= 0.11.2'
|
30
|
+
spec.add_development_dependency 'yard', '~> 0.9', '>= 0.9.16'
|
31
|
+
|
24
32
|
spec.add_runtime_dependency "nokogiri", ["~> 1.8"]
|
25
33
|
spec.add_runtime_dependency "rest-client", ["~> 2.0"]
|
26
34
|
spec.add_runtime_dependency "activerecord", [">= 4", "< 6"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steem_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Chaney (netuoso)
|
@@ -9,8 +9,148 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-01-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '2.0'
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.0.1
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '2.0'
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.0.1
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '12.1'
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 12.1.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '12.1'
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 12.1.0
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: minitest-proveit
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.0'
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 1.0.0
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '1.0'
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 1.0.0
|
74
|
+
- !ruby/object:Gem::Dependency
|
75
|
+
name: minitest
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '5.10'
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 5.10.3
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '5.10'
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 5.10.3
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: minitest-line
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - "~>"
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0.6'
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.6.4
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.6'
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 0.6.4
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: simplecov
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0.11'
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 0.11.2
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0.11'
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 0.11.2
|
134
|
+
- !ruby/object:Gem::Dependency
|
135
|
+
name: yard
|
136
|
+
requirement: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - "~>"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0.9'
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: 0.9.16
|
144
|
+
type: :development
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - "~>"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0.9'
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: 0.9.16
|
14
154
|
- !ruby/object:Gem::Dependency
|
15
155
|
name: nokogiri
|
16
156
|
requirement: !ruby/object:Gem::Requirement
|
@@ -218,9 +358,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
218
358
|
version: '0'
|
219
359
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
220
360
|
requirements:
|
221
|
-
- - "
|
361
|
+
- - ">="
|
222
362
|
- !ruby/object:Gem::Version
|
223
|
-
version:
|
363
|
+
version: '0'
|
224
364
|
requirements: []
|
225
365
|
rubyforge_project:
|
226
366
|
rubygems_version: 2.7.7
|