hivemind-ruby 0.1.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.
@@ -0,0 +1,19 @@
1
+ module Hive
2
+
3
+ # Tracks post tags.
4
+ #
5
+ # To grab the top 100 tags, grouped by post count:
6
+ #
7
+ # Hive::PostTag.top_count(:tag, 100)
8
+ # Hive::PostTag.top_count # same as #top_count
9
+ class PostTag < Base
10
+ self.table_name = :hive_post_tags
11
+ self.primary_keys = %i(post_id tag)
12
+
13
+ belongs_to :post
14
+
15
+ scope :top_count, lambda { |what = :tag, limit = 100|
16
+ group(what).limit(limit).order('count_all desc').count
17
+ }
18
+ end
19
+ end
@@ -0,0 +1,110 @@
1
+ module Hive
2
+
3
+ # Tracks posts cache.
4
+ #
5
+ # To grab the top 100 category, grouped by payout sum:
6
+ #
7
+ # Hive::PostsCache.top_payout(:category, 100)
8
+ # Hive::PostsCache.top_payout # same as #top_payout
9
+ class PostsCache < Base
10
+ self.table_name = :hive_posts_cache
11
+
12
+ belongs_to :post
13
+
14
+ scope :posts, lambda { |post| where(post: post) }
15
+
16
+ scope :paidout, lambda { |paidout = true| where(is_paidout: paidout) }
17
+ scope :nsfw, lambda { |nsfw = true| where(is_nsfw: nsfw) }
18
+ scope :declined, lambda { |declined = true| where(is_declined: declined) }
19
+ scope :full_power, lambda { |full_power = true| where(is_full_power: full_power) }
20
+ scope :hidden, lambda { |hidden = true| where(is_hidden: hidden) }
21
+ scope :grayed, lambda { |grayed = true| where(is_grayed: grayed) }
22
+
23
+ scope :after, lambda { |after, options = {invert: false}|
24
+ invertable 'hive_posts_cache.created_at > ?', after, options
25
+ }
26
+
27
+ scope :before, lambda { |before, options = {invert: false}|
28
+ invertable 'hive_posts_cache.created_at < ?', before, options
29
+ }
30
+
31
+ scope :updated_after, lambda { |after, options = {invert: false}|
32
+ invertable 'hive_posts_cache.updated_at > ?', after, options
33
+ }
34
+
35
+ scope :updated_before, lambda { |before, options = {invert: false}|
36
+ invertable 'hive_posts_cache.updated_at < ?', before, options
37
+ }
38
+
39
+ scope :payout_after, lambda { |payout, options = {invert: false}|
40
+ invertable 'hive_posts_cache.payout_at > ?', payout, options
41
+ }
42
+
43
+ scope :payout_before, lambda { |payout, options = {invert: false}|
44
+ invertable 'hive_posts_cache.payout_at < ?', payout, options
45
+ }
46
+
47
+ scope :payout_zero, lambda { |payout_zero = false|
48
+ expression = 'hive_posts_cache.payout = 0.0'
49
+
50
+ if payout_zero
51
+ where(expression)
52
+ else
53
+ where.not(expression)
54
+ end
55
+ }
56
+
57
+ scope :top_payout, lambda { |what = :category, limit = 100|
58
+ payout_zero(false).declined(false).group(what).limit(limit).
59
+ order('sum_payout DESC').sum(:payout)
60
+ }
61
+
62
+ scope :app, lambda { |app, options = {version: nil, invert: false}|
63
+ if !!options[:invert]
64
+ where("json::json->>'app' NOT LIKE ?", "#{app}/#{options[:version]}%")
65
+ else
66
+ where("json::json->>'app' LIKE ?", "#{app}/#{options[:version]}%")
67
+ end
68
+ }
69
+
70
+ scope :format, lambda { |format, options = {invert: false}|
71
+ if !!options[:invert]
72
+ where("json::json->>'format' NOT IN(?)", format)
73
+ else
74
+ where("json::json->>'format' IN(?)", format)
75
+ end
76
+ }
77
+
78
+ scope :mentioned, lambda { |options = {}|
79
+ relation = all
80
+
81
+ if !!options[:all]
82
+ names = [options[:all]].flatten
83
+ relation = relation.where('char_length(hive_posts_cache.body) >= ?', names.map(&:size).sum + names.size)
84
+
85
+ names.each do |name|
86
+ relation = relation.where('hive_posts_cache.body LIKE ?', "%@#{name}%")
87
+ end
88
+ end
89
+
90
+ if !!options[:any]
91
+ names = [options[:any]].flatten
92
+ relation = relation.where('char_length(hive_posts_cache.body) >= ?', names.map(&:size).max + 1)
93
+
94
+ clause = names.map do |name|
95
+ 'hive_posts_cache.body LIKE ?'
96
+ end.join(' OR ')
97
+
98
+ relation = relation.where(clause, *options[:any].map{|n| "%@#{n}%"})
99
+ end
100
+
101
+ if !!options[:invert]
102
+ relation = where.not(post_id: relation.select(:post_id))
103
+ else
104
+ relation
105
+ end
106
+
107
+ relation
108
+ }
109
+ end
110
+ end
@@ -0,0 +1,11 @@
1
+ module Hive
2
+
3
+ # Tracks reblogging (re-steems).
4
+ class Reblog < Base
5
+ self.table_name = :hive_reblogs
6
+ self.primary_keys = %i(account post_id)
7
+
8
+ belongs_to :post
9
+ belongs_to :reblogger, primary_key: :name, foreign_key: :account, class_name: 'Account'
10
+ end
11
+ end
@@ -0,0 +1,41 @@
1
+ module Hive
2
+
3
+ # Tracks state.
4
+ class State < Base
5
+ cattr_reader :methods
6
+ self.table_name = :hive_state
7
+
8
+ @@methods = %i(
9
+ block_num db_version steem_per_mvest usd_per_steem sbd_per_steem dgpo
10
+ )
11
+
12
+ def self.respond_to_missing?(m, include_private = false)
13
+ methods.include? m.to_sym
14
+ end
15
+
16
+ def self.method_missing(m, *args, &block)
17
+ super unless respond_to_missing?(m)
18
+
19
+ case m
20
+ when :dgpo
21
+ dgpo = JSON[last.send :dgpo]
22
+
23
+ dgpo.each do |k, v|
24
+ case v
25
+ when Hash
26
+ dgpo[k] = Struct.new(*v.keys.map(&:to_sym)).new(*v.values)
27
+ when String
28
+ if v =~ /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])?$/
29
+ dgpo[k] = Time.parse(v + 'Z') rescue v
30
+ elsif v =~ /[0-9]+/
31
+ dgpo[k] = v.to_i
32
+ end
33
+ end
34
+ end
35
+
36
+ dgpo = Struct.new(*dgpo.keys.map(&:to_sym)).new(*dgpo.values)
37
+ else; last.send(m)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+ module Hive
2
+ # Current version of hivemind-ruby.
3
+ VERSION = '0.1.0'
4
+ end
metadata ADDED
@@ -0,0 +1,232 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hivemind-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Anthony Martin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '12.3'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 12.3.1
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '12.3'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 12.3.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: minitest
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.10'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 5.10.3
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '5.10'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 5.10.3
53
+ - !ruby/object:Gem::Dependency
54
+ name: minitest-line
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '0.6'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 0.6.4
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.6'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 0.6.4
73
+ - !ruby/object:Gem::Dependency
74
+ name: minitest-proveit
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '1.0'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 1.0.0
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 1.0.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: simplecov
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.15'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 0.15.1
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.15'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 0.15.1
113
+ - !ruby/object:Gem::Dependency
114
+ name: activerecord
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '4'
120
+ - - "<"
121
+ - !ruby/object:Gem::Version
122
+ version: '6'
123
+ type: :runtime
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '4'
130
+ - - "<"
131
+ - !ruby/object:Gem::Version
132
+ version: '6'
133
+ - !ruby/object:Gem::Dependency
134
+ name: pg
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '0.21'
140
+ type: :runtime
141
+ prerelease: false
142
+ version_requirements: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: '0.21'
147
+ - !ruby/object:Gem::Dependency
148
+ name: safe_attributes
149
+ requirement: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :runtime
155
+ prerelease: false
156
+ version_requirements: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ - !ruby/object:Gem::Dependency
162
+ name: composite_primary_keys
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ type: :runtime
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ description: If you run your own `hivemind` node, you can leverage your local subset
176
+ of the blockchain you've synchronied to Postgres using ActiveRecord.
177
+ email:
178
+ - anthony@steemit.com
179
+ executables:
180
+ - hivemind-ruby
181
+ extensions: []
182
+ extra_rdoc_files: []
183
+ files:
184
+ - ".gitignore"
185
+ - Gemfile
186
+ - LICENSE
187
+ - README.md
188
+ - Rakefile
189
+ - bin/hivemind-ruby
190
+ - hivemind-ruby.gemspec
191
+ - lib/hive.rb
192
+ - lib/hive/models/account.rb
193
+ - lib/hive/models/base.rb
194
+ - lib/hive/models/block.rb
195
+ - lib/hive/models/community.rb
196
+ - lib/hive/models/feed_cache.rb
197
+ - lib/hive/models/flag.rb
198
+ - lib/hive/models/follow.rb
199
+ - lib/hive/models/member.rb
200
+ - lib/hive/models/modlog.rb
201
+ - lib/hive/models/payment.rb
202
+ - lib/hive/models/post.rb
203
+ - lib/hive/models/post_tag.rb
204
+ - lib/hive/models/posts_cache.rb
205
+ - lib/hive/models/reblog.rb
206
+ - lib/hive/models/state.rb
207
+ - lib/hive/version.rb
208
+ homepage: https://github.com/steemit/hivemind-ruby
209
+ licenses:
210
+ - MIT
211
+ metadata: {}
212
+ post_install_message:
213
+ rdoc_options: []
214
+ require_paths:
215
+ - lib
216
+ required_ruby_version: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ required_rubygems_version: !ruby/object:Gem::Requirement
222
+ requirements:
223
+ - - ">="
224
+ - !ruby/object:Gem::Version
225
+ version: '0'
226
+ requirements: []
227
+ rubyforge_project:
228
+ rubygems_version: 2.5.2.3
229
+ signing_key:
230
+ specification_version: 4
231
+ summary: STEEM Hivemind for Ruby.
232
+ test_files: []