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 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