twitty 0.1.2 → 0.1.4
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 +4 -4
- data/.circleci/config.yml +5 -0
- data/.github/workflows/gempush.yml +3 -3
- data/.rubocop.yml +35 -0
- data/.rubocop_todo.yml +83 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +31 -2
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/lib/twitty.rb +9 -10
- data/lib/twitty/config.rb +13 -16
- data/lib/twitty/constants.rb +81 -83
- data/lib/twitty/facade.rb +44 -50
- data/lib/twitty/payload.rb +50 -52
- data/lib/twitty/request.rb +33 -35
- data/lib/twitty/response.rb +10 -12
- data/lib/twitty/version.rb +1 -1
- data/twitty.gemspec +19 -20
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a93f92340fb4931676b89a3d20f869aae7e87f5fb2a9831d506e6c0d41c9dc18
|
4
|
+
data.tar.gz: a541340dd6566a95219f8feaacccf46604e968e41042d076f2b0e8e709e4ff5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c10e43f42e74d4dd9bb4a0efb988ff33f14eb5a7bd9a4da2facdf2f623b9fdbbb8eb8eca466faf50f04d0ec0ff7cf6f6e547eec653d17a6d039f3916b8f61856
|
7
|
+
data.tar.gz: a347f3007ff6c516706053a0a2251183e0c66e44af2e4e5b39d55d331415d43e69608604aa095342ab9403fd70da2cbcdcfe139f688f6e4cf16c20bca817466d
|
data/.circleci/config.yml
CHANGED
@@ -20,6 +20,10 @@ references:
|
|
20
20
|
paths:
|
21
21
|
- ./vendor/bundle
|
22
22
|
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
23
|
+
rubocop: &rubocop
|
24
|
+
run:
|
25
|
+
name: Run rubocop
|
26
|
+
command: bundle exec rubocop
|
23
27
|
jobs:
|
24
28
|
"ruby-2.7":
|
25
29
|
docker:
|
@@ -29,6 +33,7 @@ jobs:
|
|
29
33
|
- <<: *restore
|
30
34
|
- <<: *bundle
|
31
35
|
- <<: *save
|
36
|
+
- <<: *rubocop
|
32
37
|
- <<: *unit
|
33
38
|
|
34
39
|
workflows:
|
@@ -33,10 +33,10 @@ jobs:
|
|
33
33
|
mkdir -p $HOME/.gem
|
34
34
|
touch $HOME/.gem/credentials
|
35
35
|
chmod 0600 $HOME/.gem/credentials
|
36
|
-
printf -- "---\n:github: Bearer ${{ env.
|
36
|
+
printf -- "---\n:github: Bearer ${{ env.GPR_AUTH_TOKEN }}\n" > $HOME/.gem/credentials
|
37
37
|
gem build *.gemspec
|
38
38
|
gem push --KEY github --host https://rubygems.pkg.github.com/${{ env.OWNER }} *.gem
|
39
39
|
continue-on-error: true
|
40
40
|
env:
|
41
|
-
|
42
|
-
OWNER: chatwoot
|
41
|
+
GPR_AUTH_TOKEN: ${{secrets.GPR_AUTH_TOKEN}}
|
42
|
+
OWNER: chatwoot
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-performance
|
3
|
+
- rubocop-rspec
|
4
|
+
inherit_from: .rubocop_todo.yml
|
5
|
+
|
6
|
+
Layout/LineLength:
|
7
|
+
Max: 150
|
8
|
+
Metrics/ClassLength:
|
9
|
+
Max: 125
|
10
|
+
RSpec/ExampleLength:
|
11
|
+
Max: 25
|
12
|
+
Style/Documentation:
|
13
|
+
Enabled: false
|
14
|
+
Style/ExponentialNotation:
|
15
|
+
Enabled: false
|
16
|
+
Style/FrozenStringLiteralComment:
|
17
|
+
Enabled: false
|
18
|
+
Style/SymbolArray:
|
19
|
+
Enabled: false
|
20
|
+
Style/ClassAndModuleChildren:
|
21
|
+
EnforcedStyle: compact
|
22
|
+
RSpec/NestedGroups:
|
23
|
+
Enabled: true
|
24
|
+
Max: 4
|
25
|
+
RSpec/MessageSpies:
|
26
|
+
Enabled: false
|
27
|
+
Metrics/CyclomaticComplexity:
|
28
|
+
Max: 7
|
29
|
+
RSpec/NamedSubject:
|
30
|
+
Enabled: false
|
31
|
+
# we should bring this down
|
32
|
+
RSpec/MultipleMemoizedHelpers:
|
33
|
+
Max: 12
|
34
|
+
AllCops:
|
35
|
+
NewCops: enable
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2021-03-22 15:23:29 UTC using RuboCop version 1.11.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
# Configuration parameters: Include.
|
11
|
+
# Include: **/*.gemspec
|
12
|
+
Gemspec/RequiredRubyVersion:
|
13
|
+
Exclude:
|
14
|
+
- 'twitty.gemspec'
|
15
|
+
|
16
|
+
# Offense count: 3
|
17
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
18
|
+
# IgnoredMethods: refine
|
19
|
+
Metrics/BlockLength:
|
20
|
+
Max: 30
|
21
|
+
|
22
|
+
# Offense count: 1
|
23
|
+
# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
|
24
|
+
Metrics/MethodLength:
|
25
|
+
Max: 13
|
26
|
+
|
27
|
+
# Offense count: 3
|
28
|
+
RSpec/BeforeAfterAll:
|
29
|
+
Exclude:
|
30
|
+
- 'spec/spec_helper.rb'
|
31
|
+
- 'spec/rails_helper.rb'
|
32
|
+
- 'spec/support/**/*.rb'
|
33
|
+
- 'spec/twitty/config_spec.rb'
|
34
|
+
- 'spec/twitty/facade_spec.rb'
|
35
|
+
- 'spec/twitty/request_spec.rb'
|
36
|
+
|
37
|
+
# Offense count: 6
|
38
|
+
# Cop supports --auto-correct.
|
39
|
+
# Configuration parameters: SkipBlocks, EnforcedStyle.
|
40
|
+
# SupportedStyles: described_class, explicit
|
41
|
+
RSpec/DescribedClass:
|
42
|
+
Exclude:
|
43
|
+
- 'spec/twitty/config_spec.rb'
|
44
|
+
- 'spec/twitty/facade_spec.rb'
|
45
|
+
- 'spec/twitty/request_spec.rb'
|
46
|
+
|
47
|
+
# Offense count: 16
|
48
|
+
# Configuration parameters: AssignmentOnly.
|
49
|
+
RSpec/InstanceVariable:
|
50
|
+
Exclude:
|
51
|
+
- 'spec/twitty/config_spec.rb'
|
52
|
+
- 'spec/twitty/facade_spec.rb'
|
53
|
+
- 'spec/twitty/request_spec.rb'
|
54
|
+
|
55
|
+
# Offense count: 2
|
56
|
+
# Cop supports --auto-correct.
|
57
|
+
# Configuration parameters: EnforcedStyle.
|
58
|
+
# SupportedStyles: nested, compact
|
59
|
+
Style/ClassAndModuleChildren:
|
60
|
+
Exclude:
|
61
|
+
- 'lib/twitty/errors.rb'
|
62
|
+
|
63
|
+
# Offense count: 1
|
64
|
+
# Cop supports --auto-correct.
|
65
|
+
# Configuration parameters: EnforcedStyle.
|
66
|
+
# SupportedStyles: format, sprintf, percent
|
67
|
+
Style/FormatString:
|
68
|
+
Exclude:
|
69
|
+
- 'lib/twitty/facade.rb'
|
70
|
+
|
71
|
+
# Offense count: 1
|
72
|
+
# Cop supports --auto-correct.
|
73
|
+
Style/HashTransformValues:
|
74
|
+
Exclude:
|
75
|
+
- 'lib/twitty/facade.rb'
|
76
|
+
|
77
|
+
# Offense count: 1
|
78
|
+
# Cop supports --auto-correct.
|
79
|
+
# Configuration parameters: EnforcedStyle.
|
80
|
+
# SupportedStyles: literals, strict
|
81
|
+
Style/MutableConstant:
|
82
|
+
Exclude:
|
83
|
+
- 'lib/twitty/request.rb'
|
data/Gemfile
CHANGED
@@ -1,7 +1,10 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
3
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in twitty.gemspec
|
6
6
|
gemspec
|
7
7
|
gem 'oauth'
|
8
|
+
gem 'rubocop', require: false
|
9
|
+
gem 'rubocop-performance', require: false
|
10
|
+
gem 'rubocop-rspec', require: false
|
data/Gemfile.lock
CHANGED
@@ -1,15 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
twitty (0.1.
|
4
|
+
twitty (0.1.3)
|
5
5
|
oauth
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
+
ast (2.4.2)
|
10
11
|
diff-lcs (1.3)
|
11
|
-
oauth (0.5.
|
12
|
+
oauth (0.5.6)
|
13
|
+
parallel (1.20.1)
|
14
|
+
parser (3.0.0.0)
|
15
|
+
ast (~> 2.4.1)
|
16
|
+
rainbow (3.0.0)
|
12
17
|
rake (13.0.1)
|
18
|
+
regexp_parser (2.1.1)
|
19
|
+
rexml (3.2.5)
|
13
20
|
rspec (3.9.0)
|
14
21
|
rspec-core (~> 3.9.0)
|
15
22
|
rspec-expectations (~> 3.9.0)
|
@@ -23,6 +30,25 @@ GEM
|
|
23
30
|
diff-lcs (>= 1.2.0, < 2.0)
|
24
31
|
rspec-support (~> 3.9.0)
|
25
32
|
rspec-support (3.9.3)
|
33
|
+
rubocop (1.11.0)
|
34
|
+
parallel (~> 1.10)
|
35
|
+
parser (>= 3.0.0.0)
|
36
|
+
rainbow (>= 2.2.2, < 4.0)
|
37
|
+
regexp_parser (>= 1.8, < 3.0)
|
38
|
+
rexml
|
39
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
40
|
+
ruby-progressbar (~> 1.7)
|
41
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
42
|
+
rubocop-ast (1.4.1)
|
43
|
+
parser (>= 2.7.1.5)
|
44
|
+
rubocop-performance (1.10.1)
|
45
|
+
rubocop (>= 0.90.0, < 2.0)
|
46
|
+
rubocop-ast (>= 0.4.0)
|
47
|
+
rubocop-rspec (2.2.0)
|
48
|
+
rubocop (~> 1.0)
|
49
|
+
rubocop-ast (>= 1.1.0)
|
50
|
+
ruby-progressbar (1.11.0)
|
51
|
+
unicode-display_width (2.0.0)
|
26
52
|
|
27
53
|
PLATFORMS
|
28
54
|
ruby
|
@@ -32,6 +58,9 @@ DEPENDENCIES
|
|
32
58
|
oauth
|
33
59
|
rake (~> 13.0)
|
34
60
|
rspec (~> 3.0)
|
61
|
+
rubocop
|
62
|
+
rubocop-performance
|
63
|
+
rubocop-rspec
|
35
64
|
twitty!
|
36
65
|
|
37
66
|
BUNDLED WITH
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'twitty'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "twitty"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start(__FILE__)
|
data/lib/twitty.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
require 'oauth'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
4
|
+
require 'twitty/version'
|
5
|
+
require 'twitty/constants'
|
6
|
+
require 'twitty/config'
|
7
|
+
require 'twitty/payload'
|
8
|
+
require 'twitty/request'
|
9
|
+
require 'twitty/response'
|
10
|
+
require 'twitty/errors'
|
11
|
+
require 'twitty/facade'
|
12
12
|
|
13
|
-
|
14
|
-
class Error < StandardError; end
|
13
|
+
class Twitty::Error < StandardError
|
15
14
|
# Your code goes here...
|
16
15
|
end
|
data/lib/twitty/config.rb
CHANGED
@@ -1,20 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
:environment
|
9
|
-
|
1
|
+
class Twitty::Config
|
2
|
+
attr_accessor :consumer_key,
|
3
|
+
:consumer_secret,
|
4
|
+
:access_token,
|
5
|
+
:access_token_secret,
|
6
|
+
:base_url,
|
7
|
+
:environment
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
def initialize(params = {})
|
10
|
+
@base_url = params[:base_url]
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
12
|
+
@consumer_key = params[:consumer_key]
|
13
|
+
@consumer_secret = params[:consumer_secret]
|
14
|
+
@access_token = params[:access_token]
|
15
|
+
@access_token_secret = params[:access_token_secret]
|
19
16
|
end
|
20
17
|
end
|
data/lib/twitty/constants.rb
CHANGED
@@ -1,97 +1,95 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Twitty
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
},
|
3
|
+
module Twitty::Constants
|
4
|
+
API_CONFIG = {
|
5
|
+
fetch_webhooks: {
|
6
|
+
method: :get,
|
7
|
+
endpoint: '/1.1/account_activity/all/%<env>s/webhooks.json',
|
8
|
+
required_params: []
|
9
|
+
},
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
unregister_webhook: {
|
19
|
-
method: :delete,
|
20
|
-
endpoint: '/1.1/account_activity/all/%{env}/webhooks/%{id}.json',
|
21
|
-
required_params: [:id]
|
22
|
-
},
|
23
|
-
|
24
|
-
fetch_subscriptions: {
|
25
|
-
method: :get,
|
26
|
-
endpoint: '/1.1/account_activity/all/%{env}/subscriptions.json',
|
27
|
-
required_params: []
|
28
|
-
},
|
11
|
+
register_webhook: {
|
12
|
+
method: :post,
|
13
|
+
endpoint: '/1.1/account_activity/all/%<env>s/webhooks.json?url=%<url>s',
|
14
|
+
required_params: [:url]
|
15
|
+
},
|
29
16
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
17
|
+
unregister_webhook: {
|
18
|
+
method: :delete,
|
19
|
+
endpoint: '/1.1/account_activity/all/%<env>s/webhooks/%<id>s.json',
|
20
|
+
required_params: [:id]
|
21
|
+
},
|
35
22
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
send_direct_message: {
|
43
|
-
method: :post,
|
44
|
-
endpoint: '/1.1/direct_messages/events/new.json',
|
45
|
-
required_params: [:message, :recipient_id]
|
46
|
-
},
|
23
|
+
fetch_subscriptions: {
|
24
|
+
method: :get,
|
25
|
+
endpoint: '/1.1/account_activity/all/%<env>s/subscriptions.json',
|
26
|
+
required_params: []
|
27
|
+
},
|
47
28
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
29
|
+
create_subscription: {
|
30
|
+
method: :post,
|
31
|
+
endpoint: '/1.1/account_activity/all/%<env>s/subscriptions.json',
|
32
|
+
required_params: []
|
33
|
+
},
|
53
34
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
35
|
+
remove_subscription: {
|
36
|
+
method: :delete,
|
37
|
+
endpoint: '/1.1/account_activity/all/%<env>s/subscriptions/%<user_id>s.json',
|
38
|
+
required_params: [:user_id]
|
39
|
+
},
|
59
40
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
41
|
+
send_direct_message: {
|
42
|
+
method: :post,
|
43
|
+
endpoint: '/1.1/direct_messages/events/new.json',
|
44
|
+
required_params: [:message, :recipient_id]
|
45
|
+
},
|
65
46
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
47
|
+
send_tweet_reply: {
|
48
|
+
method: :post,
|
49
|
+
endpoint: '/1.1/statuses/update.json',
|
50
|
+
required_params: [:tweet, :reply_to_tweet_id]
|
51
|
+
},
|
71
52
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
53
|
+
request_oauth_token: {
|
54
|
+
method: :post,
|
55
|
+
endpoint: '/oauth/request_token',
|
56
|
+
required_params: [:url]
|
57
|
+
},
|
77
58
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
59
|
+
access_token: {
|
60
|
+
method: :post,
|
61
|
+
endpoint: '/oauth/access_token',
|
62
|
+
required_params: [:oauth_token, :oauth_verifier]
|
63
|
+
},
|
83
64
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
65
|
+
destroy_tweet: {
|
66
|
+
method: :post,
|
67
|
+
endpoint: '/1.1/statuses/destroy/%<tweet_id>s.json',
|
68
|
+
required_params: [:tweet_id]
|
69
|
+
},
|
89
70
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
71
|
+
retweet: {
|
72
|
+
method: :post,
|
73
|
+
endpoint: '/1.1/statuses/retweet/%<tweet_id>s.json',
|
74
|
+
required_params: [:tweet_id]
|
75
|
+
},
|
76
|
+
|
77
|
+
unretweet: {
|
78
|
+
method: :post,
|
79
|
+
endpoint: '/1.1/statuses/unretweet/%<tweet_id>s.json',
|
80
|
+
required_params: [:tweet_id]
|
81
|
+
},
|
82
|
+
|
83
|
+
like_tweet: {
|
84
|
+
method: :post,
|
85
|
+
endpoint: '/1.1/favorites/create.json',
|
86
|
+
required_params: [:tweet_id]
|
87
|
+
},
|
88
|
+
|
89
|
+
unlike_tweet: {
|
90
|
+
method: :post,
|
91
|
+
endpoint: '/1.1/favorites/destroy.json',
|
92
|
+
required_params: [:tweet_id]
|
93
|
+
}
|
94
|
+
}.freeze
|
97
95
|
end
|
data/lib/twitty/facade.rb
CHANGED
@@ -1,67 +1,61 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
include Twitty::Payload
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
yield(config) if block_given?
|
10
|
-
end
|
11
|
-
|
12
|
-
API_CONFIG.each do |action, _config|
|
13
|
-
define_method action do |data = {}|
|
14
|
-
define_actions(action, data)
|
15
|
-
end
|
16
|
-
end
|
3
|
+
class Twitty::Facade
|
4
|
+
include Twitty::Constants
|
5
|
+
include Twitty::Payload
|
17
6
|
|
7
|
+
def initialize
|
8
|
+
yield(config) if block_given?
|
9
|
+
end
|
18
10
|
|
19
|
-
|
20
|
-
|
21
|
-
|
11
|
+
API_CONFIG.each do |action, _config|
|
12
|
+
define_method action do |data = {}|
|
13
|
+
define_actions(action, data)
|
22
14
|
end
|
15
|
+
end
|
23
16
|
|
17
|
+
def generate_crc(crc_token)
|
18
|
+
hash = OpenSSL::HMAC.digest('sha256', config.consumer_secret, crc_token)
|
19
|
+
Base64.encode64(hash).strip!
|
20
|
+
end
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
private
|
22
|
+
def override_client_tokens(access_token, access_token_secret)
|
23
|
+
config.access_token = access_token
|
24
|
+
config.access_token_secret = access_token_secret
|
25
|
+
end
|
31
26
|
|
32
|
-
|
33
|
-
validate_params(action, data)
|
34
|
-
response = send_request(api_url(action, data), api_method(action),
|
35
|
-
api_params(action, data))
|
36
|
-
response = Twitty::Response.new(response)
|
37
|
-
end
|
27
|
+
private
|
38
28
|
|
39
|
-
|
29
|
+
def define_actions(action, data)
|
30
|
+
validate_params(action, data)
|
31
|
+
response = send_request(api_url(action, data), api_method(action),
|
32
|
+
api_params(action, data))
|
33
|
+
Twitty::Response.new(response)
|
34
|
+
end
|
40
35
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
36
|
+
def validate_params(action, data)
|
37
|
+
missing_params = (API_CONFIG[action][:required_params] - data.keys.map(&:to_sym))
|
38
|
+
raise Twitty::Errors::MissingParams, missing_params.join(',') unless missing_params.empty?
|
39
|
+
end
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
def api_params(action, data)
|
42
|
+
build_payload(action, data)
|
43
|
+
end
|
49
44
|
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
def send_request(url, type, params)
|
46
|
+
Twitty::Request.new(url: url, type: type, payload: params, config: config).execute
|
47
|
+
end
|
53
48
|
|
54
|
-
|
55
|
-
|
56
|
-
|
49
|
+
def config
|
50
|
+
@config ||= Twitty::Config.new
|
51
|
+
end
|
57
52
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
53
|
+
def api_url(action, data)
|
54
|
+
url_params = data.merge(env: config.environment).map { |k, v| [k, CGI.escape(v)] }.to_h
|
55
|
+
"#{config.base_url}#{API_CONFIG[action][:endpoint]}" % url_params
|
56
|
+
end
|
62
57
|
|
63
|
-
|
64
|
-
|
65
|
-
end
|
58
|
+
def api_method(action)
|
59
|
+
API_CONFIG[action][:method]
|
66
60
|
end
|
67
61
|
end
|
data/lib/twitty/payload.rb
CHANGED
@@ -1,67 +1,65 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module Twitty
|
4
|
-
|
5
|
-
|
6
|
-
create_subscription remove_subscription destroy_tweet retweet unretweet].freeze
|
3
|
+
module Twitty::Payload
|
4
|
+
EMPTY_PAYLOAD_ACTIONS = %w[fetch_webhooks register_webhook unregister_webhook fetch_subscriptions
|
5
|
+
create_subscription remove_subscription destroy_tweet retweet unretweet].freeze
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
7
|
+
EMPTY_PAYLOAD_ACTIONS.each do |action|
|
8
|
+
define_method "#{action}_payload" do
|
9
|
+
{}
|
12
10
|
end
|
11
|
+
end
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
def build_payload(action, payload)
|
14
|
+
@payload = payload
|
15
|
+
send("#{action}_payload")
|
16
|
+
end
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
18
|
+
def send_direct_message_payload
|
19
|
+
{
|
20
|
+
event: {
|
21
|
+
type: 'message_create',
|
22
|
+
message_create: {
|
23
|
+
target: {
|
24
|
+
recipient_id: @payload[:recipient_id]
|
25
|
+
},
|
26
|
+
message_data: {
|
27
|
+
text: @payload[:message]
|
30
28
|
}
|
31
29
|
}
|
32
|
-
}.to_json
|
33
|
-
end
|
34
|
-
|
35
|
-
def send_tweet_reply_payload
|
36
|
-
{
|
37
|
-
"status": @payload[:tweet],
|
38
|
-
"in_reply_to_status_id": @payload[:reply_to_tweet_id]
|
39
30
|
}
|
40
|
-
|
31
|
+
}.to_json
|
32
|
+
end
|
41
33
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
34
|
+
def send_tweet_reply_payload
|
35
|
+
{
|
36
|
+
status: @payload[:tweet],
|
37
|
+
in_reply_to_status_id: @payload[:reply_to_tweet_id]
|
38
|
+
}
|
39
|
+
end
|
47
40
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
41
|
+
def request_oauth_token_payload
|
42
|
+
{
|
43
|
+
oauth_callback: @payload[:url]
|
44
|
+
}
|
45
|
+
end
|
54
46
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
47
|
+
def access_token_payload
|
48
|
+
{
|
49
|
+
oauth_token: @payload[:oauth_token],
|
50
|
+
oauth_verifier: @payload[:oauth_verifier]
|
51
|
+
}
|
52
|
+
end
|
60
53
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
54
|
+
def like_tweet_payload
|
55
|
+
{
|
56
|
+
id: @payload[:tweet_id]
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
def unlike_tweet_payload
|
61
|
+
{
|
62
|
+
id: @payload[:tweet_id]
|
63
|
+
}
|
66
64
|
end
|
67
65
|
end
|
data/lib/twitty/request.rb
CHANGED
@@ -1,48 +1,46 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
attr_reader :url, :type, :payload, :config
|
1
|
+
class Twitty::Request
|
2
|
+
attr_reader :url, :type, :payload, :config
|
4
3
|
|
5
|
-
|
4
|
+
HEADERS = { 'Content-Type' => 'application/json; charset=utf-8' }
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def self.execute(params)
|
7
|
+
new(params)
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
def initialize(params)
|
11
|
+
@url = params[:url]
|
12
|
+
@type = params[:type]
|
13
|
+
@payload = params[:payload]
|
14
|
+
@config = params[:config]
|
15
|
+
end
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
def execute
|
18
|
+
send("api_#{type}")
|
19
|
+
end
|
21
20
|
|
22
|
-
|
21
|
+
private
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
23
|
+
def api_client
|
24
|
+
@api_client ||= begin
|
25
|
+
consumer = OAuth::Consumer.new(config.consumer_key, config.consumer_secret, { site: config.base_url })
|
26
|
+
token = { oauth_token: config.access_token, oauth_token_secret: config.access_token_secret }
|
27
|
+
OAuth::AccessToken.from_hash(consumer, token)
|
30
28
|
end
|
29
|
+
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
def api_get
|
32
|
+
api_client.get(url, HEADERS)
|
33
|
+
end
|
35
34
|
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
def api_post
|
36
|
+
api_client.post(url, payload, HEADERS)
|
37
|
+
end
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
def api_put
|
40
|
+
api_client.put(url, payload, HEADERS)
|
41
|
+
end
|
43
42
|
|
44
|
-
|
45
|
-
|
46
|
-
end
|
43
|
+
def api_delete
|
44
|
+
api_client.delete(url, HEADERS)
|
47
45
|
end
|
48
46
|
end
|
data/lib/twitty/response.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
attr_reader :raw_response
|
3
|
+
class Twitty::Response
|
4
|
+
attr_reader :raw_response
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def initialize(raw_response)
|
7
|
+
@raw_response = raw_response
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
def body
|
11
|
+
JSON.parse(raw_response.body)
|
12
|
+
end
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
end
|
14
|
+
def status
|
15
|
+
raw_response.code
|
18
16
|
end
|
19
17
|
end
|
data/lib/twitty/version.rb
CHANGED
data/twitty.gemspec
CHANGED
@@ -1,36 +1,35 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require 'twitty/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
6
|
+
spec.name = 'twitty'
|
8
7
|
spec.version = Twitty::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
8
|
+
spec.authors = ['Subin T P', 'Pranav Raj S', 'Sojan Jose']
|
9
|
+
spec.email = ['hello@thoughtwoot.com', 'subin@thoughtwoot.com', 'pranav@thoughtwoot.com', 'sojan@thoughtwoot.com']
|
11
10
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
11
|
+
spec.summary = 'Twitter API wrapper'
|
12
|
+
spec.description = 'Twitty makes working with the twitter account subscriptions APIs much easier'
|
13
|
+
spec.homepage = 'https://www.chatwoot.com'
|
14
|
+
spec.license = 'MIT'
|
16
15
|
|
17
16
|
spec.metadata = {
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
'bug_tracker_uri' => 'https://github.com/chatwoot/twitty/issues',
|
18
|
+
'homepage_uri' => 'https://github.com/chatwoot/twitty',
|
19
|
+
'source_code_uri' => 'https://github.com/chatwoot/twitty'
|
21
20
|
}
|
22
21
|
|
23
22
|
# Specify which files should be added to the gem when it is released.
|
24
23
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
-
spec.files
|
24
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
26
25
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
27
26
|
end
|
28
|
-
spec.bindir =
|
27
|
+
spec.bindir = 'exe'
|
29
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
-
spec.require_paths = [
|
29
|
+
spec.require_paths = ['lib']
|
31
30
|
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_runtime_dependency
|
31
|
+
spec.add_development_dependency 'bundler', '~> 2'
|
32
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
33
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
34
|
+
spec.add_runtime_dependency 'oauth'
|
36
35
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Subin T P
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-05-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -83,6 +83,8 @@ files:
|
|
83
83
|
- ".github/workflows/gempush.yml"
|
84
84
|
- ".gitignore"
|
85
85
|
- ".rspec"
|
86
|
+
- ".rubocop.yml"
|
87
|
+
- ".rubocop_todo.yml"
|
86
88
|
- ".ruby-version"
|
87
89
|
- ".travis.yml"
|
88
90
|
- CODE_OF_CONDUCT.md
|
@@ -125,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
127
|
- !ruby/object:Gem::Version
|
126
128
|
version: '0'
|
127
129
|
requirements: []
|
128
|
-
rubygems_version: 3.2.
|
130
|
+
rubygems_version: 3.2.15
|
129
131
|
signing_key:
|
130
132
|
specification_version: 4
|
131
133
|
summary: Twitter API wrapper
|