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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ddba4696d5a64d49e8ac94b1f71ca69c3682bebaee3d3606d9affb1749a58382
4
- data.tar.gz: f47c309afc5ef1cd4cdb0c630eb49c761a2d4fdc35e033f53b182ced1d40ec7a
3
+ metadata.gz: b1e08e8cc01361b2d9423d34becd77e7134857ebdc1f8e0d465cd3df15a64559
4
+ data.tar.gz: 2613695550d654ce35829cd3a18eb64795c20317c865e5ebf68285ef7cd64755
5
5
  SHA512:
6
- metadata.gz: 90292bbebdd5be8ce1512fefe08f3fd0a4fa0b4694ba4ae586fd22453abed5ef42e552c46e1a9612523c8b2f418462a1913436b524461f42be25a81c86bd6206
7
- data.tar.gz: 5665bf2c1724fc50bc278e52bd9a91ff5cad120befe8b2ae0f35866e118394eedbe190139e25ff1ab3a58fdc1473792a89376af95c7e74e0444210a7d9bb07a9
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 << "test"
8
- t.libs << "lib"
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
- ap "# Daily creation count by #{creator.nil? ? 'all account creators' : creator} since #{after_timestamp} ..."
45
+ puts "# Daily creation count by #{creator.nil? ? 'all account creators' : creator} since #{after_timestamp} ..."
41
46
  ap accounts
42
- ap "# Total accounts: #{accounts.values.sum}"
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
- ap "# Daily creation count by #{tid.nil? ? 'all custom_json_operation' : tid} since #{after_timestamp} ..."
75
+ puts "# Daily creation count by #{tid.nil? ? 'all custom_json_operation' : tid} since #{after_timestamp} ..."
71
76
  ap customs
72
- ap "# Total custom_json_operation: #{customs.values.sum}"
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
- ap "# Total #{symbol}: #{transfers.values.sum}"
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
- ap "# Total #{symbol}: #{transfers.values.sum}"
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
- puts comments.to_sql
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
- puts "Daily author reward #{symbol} sum grouped by date since #{after_timestamp} ..."
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 ap rewards.sum(:sbd_payout)
391
- when 'STEEM' then ap rewards.sum(:steem_payout)
392
- when 'VESTS' then ap rewards.sum(:vesting_payout)
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
- ap rewards.sum('vesting_payout / 1000000')
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
- ap "# Total claimed #{symbol}: #{claims.values.sum}"
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"
@@ -17,6 +17,8 @@ module SteemApi
17
17
  scope :today, -> { after(1.day.ago) }
18
18
  scope :yesterday, -> { before(1.day.ago).after(2.days.ago) }
19
19
 
20
+ scope :mined, lambda { |mined = true| where(mined: mined) }
21
+
20
22
  def witness?
21
23
  !!witness
22
24
  end
@@ -3,6 +3,8 @@ module SteemApi
3
3
 
4
4
  self.table_name = :Blocks
5
5
  self.primary_key = :block_num
6
+
7
+ has_many :transactions, foreign_key: :block_num
6
8
 
7
9
  end
8
10
  end
@@ -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
- def block
13
- SteemApi::Block.find(block_num)
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
@@ -1,3 +1,3 @@
1
1
  module SteemApi
2
- VERSION = '1.1.2pre3'
2
+ VERSION = '1.1.2'
3
3
  end
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.2pre3
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: 2018-12-03 00:00:00.000000000 Z
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: 1.3.1
363
+ version: '0'
224
364
  requirements: []
225
365
  rubyforge_project:
226
366
  rubygems_version: 2.7.7