telegraph_rb 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1613f7d06e17fd3d43e56d8f62959a14bd67532c
4
+ data.tar.gz: 83e6a94bcdb083d34406e462b1b799db09e826e5
5
+ SHA512:
6
+ metadata.gz: a8786072bf93c54bbf4d06b1a9ae6ff40a828997f0d5e42ddc82900b4888366d288bbac04d799f443c55273c3ad1e3e4caac5ff193abfb8021c8f16ad2945816
7
+ data.tar.gz: 02e9151b2ebe4846c3bd6dba49bd0c6f228cd19f5415dca244714f65ba6f5b448ca03d09162f692676484e8563c1d1da45ea271131698349b5bff054fdb80ba2
@@ -0,0 +1,32 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'dry-struct'
4
+ require 'json'
5
+ require_relative 'telegraph_rb/types'
6
+ require_relative 'telegraph_rb/connection'
7
+ require_relative 'telegraph_rb/client'
8
+ require_relative 'telegraph_rb/node_element'
9
+ require_relative 'telegraph_rb/page'
10
+ require_relative 'telegraph_rb/page_list'
11
+ require_relative 'telegraph_rb/account'
12
+ require_relative 'telegraph_rb/html_converter'
13
+
14
+ module Telegraph
15
+ class << self
16
+ attr_accessor :client
17
+
18
+ def setup(token)
19
+ @client = Client.new(token)
20
+ end
21
+
22
+ def create_account(short_name:, author_name:, author_url:)
23
+ account = Account.create(
24
+ short_name: short_name,
25
+ author_name: author_name,
26
+ author_url: author_url
27
+ )
28
+ @client = Client.new(account.access_token)
29
+ account
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,61 @@
1
+ module Telegraph
2
+ class Account < Dry::Struct
3
+ extend Telegraph::Connection
4
+
5
+ transform_keys(&:to_sym)
6
+
7
+ attribute :author_url, Types::Strict::String
8
+ attribute :short_name, Types::Strict::String
9
+ attribute :author_name, Types::Strict::String
10
+
11
+ attribute :access_token, Types::Strict::String.meta(omittable: true)
12
+ attribute :auth_url, Types::String.meta(omittable: true)
13
+ attribute :page_count, Types::String.meta(omittable: true)
14
+
15
+ FIELDS = %w(short_name author_name author_url auth_url page_count)
16
+
17
+ class << self
18
+ def create(short_name:, author_name:, author_url:)
19
+ params = {
20
+ short_name: short_name,
21
+ author_name: author_name,
22
+ author_url: author_url
23
+ }
24
+ response = post('createAccount', params)
25
+ new(response)
26
+ end
27
+
28
+ def get(fields: [])
29
+ fields = FIELDS unless fields.any?
30
+ params = {
31
+ fields: fields,
32
+ access_token: client.token
33
+ }
34
+ response = client.get('getAccountInfo', params)
35
+ new(response)
36
+ end
37
+
38
+ def edit(short_name:, author_name:, author_url:)
39
+ params = {
40
+ short_name: short_name,
41
+ author_name: author_name,
42
+ author_url: author_url,
43
+ access_token: client.token
44
+ }
45
+ response = client.post('editAccountInfo', params)
46
+ new(response)
47
+ end
48
+
49
+ def revoke_token
50
+ response = client.post('getAccountInfo', access_token: client.token)
51
+ new(response)
52
+ end
53
+
54
+ private
55
+
56
+ def client
57
+ @client ||= Telegraph.client
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,11 @@
1
+ module Telegraph
2
+ class Client
3
+ include Telegraph::Connection
4
+
5
+ attr_reader :token
6
+
7
+ def initialize(token)
8
+ @token = token
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ module Telegraph
2
+ module Connection
3
+ BASE_URL = 'https://api.telegra.ph'
4
+
5
+ def get(method, params)
6
+ params[:fields] = params[:fields].to_json if params[:fields]
7
+ response = connection.get(method, params)
8
+ check_errors(response)
9
+ response.body[:result]
10
+ end
11
+
12
+ def post(method, params)
13
+ url = "#{BASE_URL}/#{method}"
14
+ response = connection.post do |req|
15
+ req.url(url)
16
+ req.body = params.to_json
17
+ end
18
+ check_errors(response)
19
+ response.body[:result]
20
+ end
21
+
22
+ private
23
+
24
+ def connection
25
+ @connection ||= Faraday.new(url: BASE_URL) do |faraday|
26
+ faraday.request :url_encoded
27
+ faraday.response :json, content_type: /\bjson$/, parser_options: { symbolize_names: true }
28
+ faraday.headers['Content-Type'] = 'application/json'
29
+ faraday.adapter Faraday.default_adapter
30
+ end
31
+ end
32
+
33
+ def check_errors(response)
34
+ resp_body = response.body
35
+ raise ArgumentError, resp_body[:error] if resp_body[:ok] == false
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ require 'nokogiri'
2
+
3
+ module Telegraph::HTMLConverter
4
+ def html_to_content(html)
5
+ nodes = Nokogiri::HTML.fragment(html).children
6
+ nodes.map { |node| process_node(node) }
7
+ end
8
+
9
+ private
10
+
11
+ def process_node(node)
12
+ return node.text if node.text?
13
+ return unless node.element?
14
+
15
+ node_element = { tag: node.name, children: [] }
16
+
17
+ if node.attributes.any?
18
+ node_element[:attrs] = {}
19
+ node.attribute_nodes.each do |attr|
20
+ next unless attr.name == 'href' || attr.name == 'src'
21
+ node_element[:attrs][attr.name] = attr.value
22
+ end
23
+ end
24
+
25
+ if node.children.any?
26
+ node.children.each { |child| node_element[:children] << process_node(child) }
27
+ end
28
+
29
+ node_element
30
+ end
31
+ end
@@ -0,0 +1,10 @@
1
+ module Telegraph
2
+ class NodeElement < Dry::Struct
3
+ transform_keys(&:to_sym)
4
+
5
+ attribute :tag, Types::Strict::String
6
+
7
+ attribute :attrs, Types::Strict::String.meta(omittable: true)
8
+ attribute :content, Types::Array.of(NodeElement).meta(omittable: true)
9
+ end
10
+ end
@@ -0,0 +1,73 @@
1
+ module Telegraph
2
+ class Page < Dry::Struct
3
+ transform_keys(&:to_sym)
4
+
5
+ attribute :path, Types::Strict::String
6
+ attribute :url, Types::Strict::String
7
+ attribute :title, Types::Strict::String
8
+ attribute :description, Types::Strict::String
9
+ attribute :views, Types::Strict::Integer
10
+ attribute :author_name, Types::String
11
+
12
+ attribute :can_edit, Types::Bool.meta(omittable: true)
13
+ attribute :author_url, Types::String.meta(omittable: true)
14
+ attribute :content, Types::Array.of(NodeElement).meta(omittable: true)
15
+
16
+ class << self
17
+ def create(title:, author_name:, author_url:, content:, return_content: false)
18
+ params = {
19
+ title: title,
20
+ author_name: author_name,
21
+ author_url: author_url,
22
+ content: content,
23
+ return_content: return_content,
24
+ access_token: client.token
25
+ }
26
+ response = client.post('createPage', params)
27
+ new(response)
28
+ end
29
+
30
+ def get(path:, return_content: false)
31
+ params = {
32
+ path: path,
33
+ return_content: return_content,
34
+ access_token: client.token
35
+ }
36
+ response = client.get('getPage', params)
37
+ new(response)
38
+ end
39
+
40
+ def get_views(path:, year: nil, month: nil, day: nil, hour: nil)
41
+ params = { path: path }
42
+ time_params = {
43
+ year: year,
44
+ month: month,
45
+ day: day,
46
+ hour: hour
47
+ }
48
+ params.merge(time_params) if time_params.values.compact.any?
49
+ response = client.get('getViews', params)
50
+ response[:views]
51
+ end
52
+
53
+ def edit(path:, title:, content:, author_name: nil, author_url: nil)
54
+ params = {
55
+ path: path,
56
+ title: title,
57
+ content: content,
58
+ author_name: author_name,
59
+ author_url: author_url,
60
+ access_token: client.token
61
+ }
62
+ response = client.post('editPage', params)
63
+ new(response)
64
+ end
65
+
66
+ private
67
+
68
+ def client
69
+ @client ||= Telegraph.client
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,24 @@
1
+ module Telegraph
2
+ class PageList < Dry::Struct
3
+ transform_keys(&:to_sym)
4
+
5
+ attribute :total_count, Types::Strict::Integer
6
+ attribute :pages, Types::Strict::Array.of(Page)
7
+
8
+ def self.get(offset: 0, limit: 50)
9
+ params = {
10
+ offset: offset,
11
+ limit: limit,
12
+ access_token: client.token
13
+ }
14
+ response = client.get('getPageList', params)
15
+ new(response)
16
+ end
17
+
18
+ private
19
+
20
+ def self.client
21
+ @client ||= Telegraph.client
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ module Telegraph
2
+ module Types
3
+ include Dry::Types.module
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: telegraph_rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Aleksey Kiselev
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: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.15.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.15.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.12.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.12.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: dry-struct
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.6'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 2.0.4
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 2.0.4
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.7'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.4'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.4'
125
+ description: Ruby Telegra.ph API client
126
+ email: aleksey_kiselev@icloud.com
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - lib/telegraph_rb.rb
132
+ - lib/telegraph_rb/account.rb
133
+ - lib/telegraph_rb/client.rb
134
+ - lib/telegraph_rb/connection.rb
135
+ - lib/telegraph_rb/html_converter.rb
136
+ - lib/telegraph_rb/node_element.rb
137
+ - lib/telegraph_rb/page.rb
138
+ - lib/telegraph_rb/page_list.rb
139
+ - lib/telegraph_rb/types.rb
140
+ homepage: https://github.com/gettingud/Telegraph_rb
141
+ licenses:
142
+ - MIT
143
+ metadata: {}
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ requirements: []
159
+ rubyforge_project:
160
+ rubygems_version: 2.6.14.1
161
+ signing_key:
162
+ specification_version: 4
163
+ summary: Telegra.ph Ruby Gem
164
+ test_files: []