steem_api 1.1.2pre3 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|