moobooks 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: fd922053fc3d55e178f3229b909f1c5431da9fd2f3725bfde50327974f032f70
4
- data.tar.gz: f2084ba2051a98ff2e5cf96a681be6ebb565e89d854b77ae84cc3f580f4637f0
2
+ SHA1:
3
+ metadata.gz: a015cf1b4143a7fca8c88b5fe96603fb35965282
4
+ data.tar.gz: 3a908d3527ede6484d570ad790a8f352d768fd1d
5
5
  SHA512:
6
- metadata.gz: 7ea4ad75982c356fb346944859a701fb6df631bac1c7d823a18f6b5fcfd4cca1bd8f9c26cea6b84e10f0ccd383fcd09573f15d603421004357f896106a11ff41
7
- data.tar.gz: 290f95b1dddc80a61889e495cee7cb1581523443bd44905643dffb7ae37b7af5700dbf612b5a986f164b4bef51b161be893cf48a1c705d42c8dd7d45794d3534
6
+ metadata.gz: 56e081fee01e291ba1f13b8d0ff74db005f80bc2a07811d2d6e6d41a74bf3a22911edf5bb3b265d74cbd12904edd501a130bba09f80b9beaee57a22cc3d39579
7
+ data.tar.gz: 057f27e94db5afdc545ccf9a21799eb823560e3fa96fe1be3fd1f47dbc9c6caa90091346fc7f2f799961037deee9d039ea95b52b837cb8ecdbdd21d64b24721e
@@ -20,56 +20,91 @@
20
20
 
21
21
  require_relative '../lib/moobooks'
22
22
 
23
- def print_help
24
- puts 'Usage: `plushies <app|account> <command> [<arguments>]',
25
- ' plushies app add <twitter|mastoon> [app_name]'
26
- ' plushies app list <twitter|mastoon>'
23
+ require 'logger'
24
+
25
+ def print_help(help_param = false)
26
+ puts 'Usage:',
27
+ ' plushies post',
28
+ ' plushies update'
29
+ exit(help_param ? 0 : 1)
30
+ end
31
+
32
+ app_config = File.expand_path("#{__dir__}/../config/apps.json")
33
+ unless File.exist?(app_config)
34
+ warn 'No app configuration present!'
35
+ exit 1
27
36
  end
28
37
 
29
- case cmd = ARGV.shift(2)
38
+ log = Logger.new(File.expand_path("#{__dir__}/../log/plushies.log"), 'monthly')
39
+ log.level = Logger::INFO
40
+ log.formatter = proc do |sev, date, _prog, msg|
41
+ "#{date.strftime('%b %e, %Y %e %r')} [#{sev[0, 1].upcase}]: #{msg}\n"
42
+ end
43
+
44
+ apps = JSON.parse(File.read(app_config), symbolize_names: true)
45
+
46
+ plush_config = File.expand_path("#{__dir__}/../config/plushies.json")
47
+ unless File.exist?(plush_config)
48
+ warn 'No plush configuration present!'
49
+ exit 1
50
+ end
51
+ plush_configs = JSON.parse(File.read(plush_config), symbolize_names: true)
52
+
53
+ cmd = ARGV.shift
54
+
55
+ plushies = ARGV.map do |name|
56
+ conf = plush_configs[name.to_sym]
57
+ if conf.nil?
58
+ warn "Plush \"#{name}\" not known"
59
+ log.warn "Plush \"#{name}\" not known"
60
+ next
61
+ end
62
+ Moobooks::Plush.new(name, conf, apps)
63
+ end.compact
64
+
65
+ case cmd
30
66
  when ['-h']
31
- print_help
32
- when %w[app add]
33
- platform = ARGV.shift
34
- name = ARGV.shift
35
- warn 'Name can\'t be empty.' if name.nil?
36
- case platform
37
- when 'twitter'
38
- puts 'Please check your app\'s developer page to get it\'s data.'
39
- print 'Consumer key: '
40
- consumer_key = $stdin.gets.chomp
41
- print 'Consumer secret: '
42
- consumer_secret = $stdin.gets.chomp
43
- Moobooks::Twitter::App.create(name, consumer_key, consumer_secret)
44
- when 'mastodon'
45
- Moobooks::Mastodon::App.create(name)
46
- else
47
- warn "Unrecognized platform: #{platform}"
48
- print_add_help
49
- exit 1
67
+ print_help(true)
68
+ when 'post'
69
+ plushies.each do |plush|
70
+ log.info "Plush \"#{plush.name}\" said: \"#{plush.post_status!}\""
50
71
  end
51
- puts 'Your app was successfully saved.'
52
- when %w[app list]
53
- platform = ARGV.shift
54
- case platform
55
- when 'twitter'
56
- apps = Moobooks::Twitter::App.list.map(&:to_s).map { |a| " #{a}" }
57
- puts 'Known twitter apps', apps
58
- when 'mastodon'
59
- Moobooks::Mastodon::App.create(name)
60
- else
61
- warn "Unrecognized platform: #{platform}"
62
- print_help
63
- exit 1
72
+ when 'update'
73
+ plushies.each do |plush|
74
+ corpus = JSON.parse(File.read("#{__dir__}/../corpora/#{plush.name}.json"),
75
+ symbolize_names: true).map do |t|
76
+ Twitter::Tweet.new(t)
77
+ end
78
+ max_id = 2**61
79
+ new_tweets = []
80
+ 16.times do
81
+ new_tweets += plush.clients[:twitter].user_timeline(
82
+ plush.originals[:twitter], max_id: max_id, count: 200,
83
+ tweet_mode: 'extended'
84
+ )
85
+ log.info("Added #{new_tweets.count} tweets from "\
86
+ "\"#{plush.originals[:twitter]}\" to \"#{plush.name}\"")
87
+ max_id = new_tweets.min_by(&:id).id
88
+ break if max_id <= corpus.max_by(&:id).id
89
+ end
90
+ corpus = (corpus + new_tweets).reject(&:retweeted?).sort_by(&:id)
91
+ .map(&:attrs).uniq.reject do |t|
92
+ t[:full_text].match(/^(RT|MT)/)
93
+ end.to_json
94
+ File.write("#{__dir__}/../corpora/#{plush.name}.json", corpus)
95
+ corpus = JSON.parse(corpus, symbolize_names: true).map do |t|
96
+ t[:full_text]
97
+ end
98
+ corpus = {
99
+ statuses: corpus.reject { |t| t.match(/@\w+/) },
100
+ mentions: corpus.select { |t| t.match(/@\w+/) }
101
+ }
102
+ model = Ebooks::Model.new.consume(corpus).to_json
103
+ File.write("#{__dir__}/../models/#{plush.name}.json", model)
104
+ log.info("Updated model for \"#{plush.name}\" ")
64
105
  end
65
- # when 'update'
66
- # when 'post'
67
- # when 'profile'
68
- # when 'follow'
69
- # when 'favorite'
70
- # when 'read'
71
106
  else
72
107
  warn "Unknown command: #{cmd.join(' ')}"
108
+ log.warn "Unknown command: #{cmd.join(' ')}"
73
109
  print_help
74
- exit 1
75
110
  end
@@ -18,7 +18,5 @@
18
18
  # along with MooBooks. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
20
  require 'json'
21
- require 'mastodon'
22
21
 
23
- require_relative 'moobooks/twitter'
24
- require_relative 'moobooks/database'
22
+ require_relative 'moobooks/plush'
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2018 Maxine Michalski <maxine@furfind.net>
4
+ #
5
+ # This file is part of MooBooks.
6
+ #
7
+ # MooBooks is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # MooBooks is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with MooBooks. If not, see <http://www.gnu.org/licenses/>.
19
+
20
+ require 'moo_ebooks'
21
+ require 'twitter'
22
+
23
+ module Moobooks
24
+ class UnsupportedEngineError < StandardError; end
25
+ # @author Maxine Michalski
26
+ # @since 0.1.0
27
+ #
28
+ # Plushies!
29
+ class Plush
30
+ # @return [String] Name of current toy
31
+ attr_reader :name
32
+
33
+ # @return [String] Engine this plush is running on
34
+ attr_reader :engine
35
+
36
+ # @return [Ebooks::Model] Model used by this plush
37
+ attr_reader :model
38
+
39
+ # @return [Hash] Names of original accounts
40
+ attr_reader :originals
41
+
42
+ # @author Maxine Michalski
43
+ #
44
+ # Initializer for Plushies
45
+ #
46
+ # @param name [String] Name of new plush
47
+ # @param conf [Hash] Configuration hash
48
+ # @param apps [Hash] Hash that contains available app configurations
49
+ #
50
+ # @notice Engine can be `rng` or `markov` only.
51
+ def initialize(name, conf, apps)
52
+ raise ArgumentError, 'Name can\'t be empty~' if name.nil? || name.empty?
53
+ @name = name
54
+ @engine = conf[:engine]
55
+ raise UnsupportedEngineError unless %w[rng markov].include?(@engine)
56
+ @originals = {}
57
+ twitter_login(apps, conf[:twitter]) unless conf[:twitter].nil?
58
+ @model = Ebooks::Model.from_json(
59
+ File.read("#{__dir__}/../../models/#{@name}.json")
60
+ )
61
+ end
62
+
63
+ # @author Maxine Michalski
64
+ #
65
+ # Method to post statuses to all available social platforms
66
+ def post_status!
67
+ @status = @model.update(280)
68
+ # @twitter_client.update(@status) unless @twitter_client.nil?
69
+ @status
70
+ end
71
+
72
+ # @author Maxine Michalski
73
+ #
74
+ # Let's this plush reply to messages.
75
+ #
76
+ # @notice This can cause endless reply loops, use with caution!
77
+ def reply!(status)
78
+ @status = @model.reply(status.text, 280)
79
+ @status
80
+ end
81
+
82
+ # @author Maxine Michalski
83
+ #
84
+ # Returns a hash of all connected clients
85
+ #
86
+ # @return [Hash] Hash of different, connected, clients
87
+ def clients
88
+ clients = {}
89
+ clients.store(:twitter, @twitter_client) unless @twitter_client.nil?
90
+ clients
91
+ end
92
+
93
+ private
94
+
95
+ def twitter_login(apps, conf)
96
+ app = apps[conf[:api].to_sym]
97
+ @twitter_client = Twitter::REST::Client.new do |config|
98
+ config.consumer_key = app[:consumer_key]
99
+ config.consumer_secret = app[:consumer_secret]
100
+ config.access_token = conf[:access_token]
101
+ config.access_token_secret = conf[:access_token_secret]
102
+ end
103
+ @originals.store(:twitter, conf[:original])
104
+ end
105
+ end
106
+ end
@@ -22,8 +22,11 @@
22
22
  # @since 0.1.0
23
23
  module Moobooks
24
24
  MAJOR = 0
25
- MINOR = 1
25
+ MINOR = 2
26
26
  PATCH = 0
27
27
  NAME = 'moobooks'
28
28
  VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
29
+ DESCRIPTION = 'A framework and CLI to create and manage ebook '\
30
+ "accounts.\nKeep in mind that actual accounts need to "\
31
+ 'be created manually, but can be linked with this tool.'
29
32
  end
@@ -17,12 +17,30 @@
17
17
  # You should have received a copy of the GNU General Public License
18
18
  # along with MooBooks. If not, see <http://www.gnu.org/licenses/>.
19
19
 
20
- describe Moobooks::Database, '.conect' do
21
- context 'a consumer key and secret are given' do
22
- it 'saves them in a database' do
23
- expect do |b|
24
- Moobooks::Database.connect(&b)
25
- end.to yield_with_args
26
- end
20
+ conf = {
21
+ maxine: {
22
+ engine: 'markov',
23
+ twitter: nil,
24
+ mastodon: nil
25
+ }
26
+ }
27
+ apps = {
28
+ general: {
29
+ consumer_key: '',
30
+ consumer_secret: ''
31
+ }
32
+ }
33
+
34
+ app = Moobooks::Plush.new('maxine', conf[:maxine], apps)
35
+
36
+ describe Moobooks::Plush, '#name' do
37
+ it 'returns name of plush' do
38
+ expect(app.name).to be_a String
39
+ end
40
+ end
41
+
42
+ describe Moobooks::Plush, '#engine' do
43
+ it 'returns engine of plush' do
44
+ expect(app.engine).to be_a String
27
45
  end
28
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moobooks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maxine Michalski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-17 00:00:00.000000000 Z
11
+ date: 2018-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: oauth
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.5'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.5'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: pg
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -147,13 +161,10 @@ extra_rdoc_files: []
147
161
  files:
148
162
  - bin/plushies
149
163
  - lib/moobooks.rb
150
- - lib/moobooks/database.rb
151
- - lib/moobooks/twitter.rb
152
- - lib/moobooks/twitter/app.rb
164
+ - lib/moobooks/plush.rb
153
165
  - lib/moobooks/version.rb
154
- - spec/database_spec.rb
166
+ - spec/plush_spec.rb
155
167
  - spec/spec_helper.rb
156
- - spec/twitter_app_spec.rb
157
168
  homepage: https://github.com/maxine-red/moobooks
158
169
  licenses:
159
170
  - GPL-3.0
@@ -174,11 +185,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
174
185
  version: '0'
175
186
  requirements: []
176
187
  rubyforge_project:
177
- rubygems_version: 2.7.7
188
+ rubygems_version: 2.5.2.1
178
189
  signing_key:
179
190
  specification_version: 4
180
191
  summary: Mooing bots for your friends.
181
192
  test_files:
182
- - spec/database_spec.rb
183
193
  - spec/spec_helper.rb
184
- - spec/twitter_app_spec.rb
194
+ - spec/plush_spec.rb
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2018 Maxine Michalski <maxine@furfind.net>
4
- #
5
- # This file is part of MooBooks.
6
- #
7
- # MooBooks is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # MooBooks is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with MooBooks. If not, see <http://www.gnu.org/licenses/>.
19
-
20
- require 'pg'
21
-
22
- module Moobooks
23
- # @author Maxine Michalski
24
- # @since 0.1.0
25
- #
26
- # A general purpose database connection module.
27
- #
28
- # @return Result of the given block
29
- module Database
30
- # @author Maxine Michalski
31
- #
32
- # Spawns a database connection and yields it
33
- #
34
- # @return object Result of the database block
35
- def self.connect
36
- pg = PG::Connection.new(dbname: 'moobooks')
37
- pg.type_map_for_results = PG::BasicTypeMapForResults.new(pg)
38
- result = yield pg
39
- pg.close
40
- result
41
- end
42
- end
43
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2018 Maxine Michalski <maxine@furfind.net>
4
- #
5
- # This file is part of MooBooks.
6
- #
7
- # MooBooks is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # MooBooks is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with MooBooks. If not, see <http://www.gnu.org/licenses/>.
19
-
20
- require 'twitter'
21
-
22
- require_relative 'twitter/app'
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2018 Maxine Michalski <maxine@furfind.net>
4
- #
5
- # This file is part of MooBooks.
6
- #
7
- # MooBooks is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # MooBooks is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with MooBooks. If not, see <http://www.gnu.org/licenses/>.
19
-
20
- module Moobooks
21
- module Twitter
22
- # @author Maxine Michalski
23
- # @since 0.1.0
24
- class AppNotFound < StandardError; end
25
- # @author Maxine Michalski
26
- # @since 0.1.0
27
- #
28
- # A class to handle Twitter apps.
29
- class App
30
- # @return [Integer] ID of this app
31
- attr_reader :id
32
-
33
- # @return [String] Name of this app
34
- attr_reader :name
35
-
36
- # @return [String] Consumer key of this app
37
- attr_reader :consumer_key
38
-
39
- # @return [String] Consumer secret of this app
40
- attr_reader :consumer_secret
41
- # @author Maxine Michalski
42
- #
43
- # Create a new app, by storing it's credentials into databse.
44
- #
45
- # @param name [String] Name of the app
46
- # @param consumer_key [String] Twitter app consumer key
47
- # @param consumer_secret [String] Twitter app consumer secret
48
- def self.create(name, consumer_key, consumer_secret)
49
- if consumer_key.empty? || consumer_secret.empty?
50
- raise ArgumentError, 'Consumer data can\'t be empty.'
51
- end
52
- Moobooks::Database.connect do |pg|
53
- pg.exec('INSERT INTO twitter.apps (name, consumer_key, '\
54
- 'consumer_secret) VALUES ($1, $2, $3);',
55
- [name, consumer_key, consumer_secret])
56
- end
57
- nil
58
- end
59
-
60
- # @author Maxine Michalski
61
- #
62
- # Creates a list of all Twitter apps in database
63
- #
64
- # @return [Array<Moobooks::Twitter::App>] A list Twitter apps
65
- def self.list
66
- apps = Moobooks::Database.connect do |pg|
67
- pg.exec('SELECT id FROM twitter.apps ORDER BY id;').to_a
68
- end
69
- apps.map do |a|
70
- Moobooks::Twitter::App.new(a['id'])
71
- end
72
- end
73
-
74
- # @author Maxine Michalski
75
- #
76
- # Initializer for Twitter appps
77
- #
78
- # @param id [Integer] The ID of an app we want to fetch
79
- def initialize(id)
80
- app = Moobooks::Database.connect do |pg|
81
- pg.exec('SELECT id, name, consumer_key, consumer_secret, '\
82
- 'created_at FROM twitter.apps WHERE id = $1;', [id]).first
83
- end
84
- raise AppNotFoundError if app.nil?
85
- app.each do |k, v|
86
- instance_variable_set("@#{k}", v)
87
- end
88
- end
89
-
90
- # @author Maxine Michalski
91
- #
92
- # Turn this App into a string representation
93
- #
94
- # @notice The returned string will be in the form of '<id> <name>'
95
- #
96
- # @return [String] A formatted string representation of this App
97
- def to_s
98
- "#{@id} #{@name}"
99
- end
100
- end
101
- end
102
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2018 Maxine Michalski <maxine@furfind.net>
4
- #
5
- # This file is part of MooBooks.
6
- #
7
- # MooBooks is free software: you can redistribute it and/or modify
8
- # it under the terms of the GNU General Public License as published by
9
- # the Free Software Foundation, either version 3 of the License, or
10
- # (at your option) any later version.
11
- #
12
- # MooBooks is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- # GNU General Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License
18
- # along with MooBooks. If not, see <http://www.gnu.org/licenses/>.
19
-
20
- describe Moobooks::Twitter::App, '.create' do
21
- context 'a consumer key and secret are given' do
22
- it 'saves them in a database' do
23
- pg = double(PG::Connection)
24
- expect(pg).to receive(:exec).and_return(true)
25
- expect(Moobooks::Database).to receive(:connect).and_yield(pg)
26
- expect(Moobooks::Twitter::App.create('', '1', '1')).to be nil
27
- end
28
- end
29
- context 'an empty consumer key and secret are given' do
30
- it 'raises an argument error' do
31
- expect { Moobooks::Twitter::App.create('', '', '') }.to(
32
- raise_error(ArgumentError)
33
- )
34
- end
35
- end
36
- end
37
-
38
- describe Moobooks::Twitter::App, '.list' do
39
- it 'returns an array of Twitte::App objects' do
40
- pg = double(PG::Connection)
41
- data = [{ 'id' => 1, 'name' => 'test' }]
42
- allow(pg).to receive(:exec).and_return(data, data)
43
- allow(Moobooks::Database).to receive(:connect).and_yield(pg)
44
- list = Moobooks::Twitter::App.list
45
- expect(list).to be_an Array
46
- expect(list.first).to be_a Moobooks::Twitter::App
47
- end
48
- end
49
-
50
- describe Moobooks::Twitter::App, '#to_s' do
51
- it 'returns a string representation of an App' do
52
- pg = double(PG::Connection)
53
- data = [{ 'id' => 1, 'name' => 'test' }]
54
- expect(pg).to receive(:exec).and_return(data)
55
- expect(Moobooks::Database).to receive(:connect).and_yield(pg)
56
- app = Moobooks::Twitter::App.new(1)
57
- expect(app.to_s).to be_a String
58
- expect(app.to_s).to eq '1 test'
59
- end
60
- end