telegraph_api_ruby 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4f28d416ace8d594cc9d3606216af9c068b19aee
4
+ data.tar.gz: a434456de213c773c25503d46b2d38cfc8e60c11
5
+ SHA512:
6
+ metadata.gz: ce55e60a6829482ee1e207046079aa0da4036a1676203cb18b6a4d640812649c37b37dc6aea69e20a83d1680127e66fe8ac51fd28ee8c8c16bc77a2dea92e633
7
+ data.tar.gz: c11c58522b360c7bf44ccf7c794e498b7c4a4a0df912a9fb6a517b5bdda58472129dfd4ace0ac86948ac74794da045a3170ba002033f6da45180191170366a1a
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # telegraph_api_ruby
2
+
3
+ A Ruby interface to [Telegra.ph API](http://telegra.ph/api).
4
+
5
+ ## Installation
6
+
7
+ Add following line to your Gemfile:
8
+
9
+ ```ruby
10
+ gem 'telegraph_api_ruby'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ ```shell
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it system-wide:
20
+
21
+ ```shell
22
+ $ gem install telegraph_api_ruby
23
+ ```
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ require 'telegraph_api_ruby'
29
+
30
+ telegraph_access_token = 'YOUR_ACCESS_TOKEN'
31
+
32
+ html = %(
33
+ <b>Hello World</b>
34
+ )
35
+
36
+ content = TelegraphApi::DomToNode.call(html)
37
+
38
+ data = {
39
+ access_token: telegraph_access_token,
40
+ title: 'Test page',
41
+ content: JSON.dump(content),
42
+ return_content: true
43
+ }
44
+
45
+ result = TelegraphApi::Client.create_page(data)
46
+ result.url
47
+ ```
48
+
49
+ ## Methods
50
+
51
+ ## Contributing
52
+
53
+ 1. Fork it
54
+ 2. Create your feature branch (git checkout -b feature/my-new-feature)
55
+ 3. Commit your changes (git commit -am 'Add some feature')
56
+ 4. Push to the branch (git push origin feature/my-new-feature)
57
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ t.test_files = FileList['test/test*.rb']
6
+ t.ruby_opts = ['-W0'] # warnings level 0
7
+ end
8
+
9
+ desc 'Run tests'
10
+ task default: :test
@@ -0,0 +1,30 @@
1
+ require 'active_support/inflector'
2
+
3
+ require_relative 'types'
4
+
5
+ module TelegraphApi
6
+ class Client
7
+ API_URL = 'https://api.telegra.ph/'.freeze
8
+
9
+ REQUEST_RESPONSE = {
10
+ create_account: Types::Account,
11
+ edit_account_info: Types::Account,
12
+ get_account_info: Types::Account,
13
+ revoke_access_token: Types::Account,
14
+ create_page: Types::Page,
15
+ edit_page: Types::Page,
16
+ get_page: Types::Page,
17
+ get_page_list: Types::PageList,
18
+ get_views: Types::PageViews
19
+ }.freeze
20
+
21
+ def self.method_missing(method, *args, &block)
22
+ path = ActiveSupport::Inflector.camelize(method.to_s, false)
23
+ Request.call(path, *args, REQUEST_RESPONSE[method.to_sym])
24
+ end
25
+
26
+ def self.respond_to_missing?(*)
27
+ super
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,48 @@
1
+ require 'oga'
2
+
3
+ module TelegraphApi
4
+ class DomToNode
5
+ attr_reader :data
6
+
7
+ def self.call(*args)
8
+ new(*args).call
9
+ end
10
+
11
+ def initialize(data)
12
+ @data = data
13
+ end
14
+
15
+ def call
16
+ dom_to_node(parse_html(data))[:children]
17
+ end
18
+
19
+ private
20
+
21
+ def parse_html(data)
22
+ Oga.parse_html(data)
23
+ end
24
+
25
+ def dom_to_node(dom_node)
26
+ return dom_node.text if dom_node.is_a?(Oga::XML::Text)
27
+
28
+ node_element = {
29
+ children: []
30
+ }
31
+
32
+ if dom_node.is_a?(Oga::XML::Element)
33
+ node_element[:tag] = dom_node.name
34
+ node_element[:attrs] = {}
35
+
36
+ Array(dom_node.attributes).each do |attr|
37
+ node_element[:attrs][attr.name] = attr.value
38
+ end
39
+ end
40
+
41
+ Array(dom_node.children).each do |child|
42
+ node_element[:children].push(dom_to_node(child))
43
+ end
44
+
45
+ node_element
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,44 @@
1
+ require 'json'
2
+ require 'typhoeus'
3
+
4
+ module TelegraphApi
5
+ class Request
6
+ class ResponseError < StandardError; end
7
+
8
+ attr_reader :path, :opts, :response_schema
9
+
10
+ API_URL = 'https://api.telegra.ph/'.freeze
11
+
12
+ def self.call(*args)
13
+ new(*args).call
14
+ end
15
+
16
+ def initialize(path, opts = {}, response_schema = nil)
17
+ @path = path
18
+ @opts = opts
19
+ @response_schema = response_schema
20
+ end
21
+
22
+ def call
23
+ result = request(path, opts)
24
+ response(result.body, response_schema)
25
+ end
26
+
27
+ private
28
+
29
+ def request(path, body)
30
+ Typhoeus.post("#{API_URL}/#{path}", body: body)
31
+ end
32
+
33
+ def response(data, type)
34
+ json = JSON.parse(data, symbolize_names: true)
35
+
36
+ if json[:ok] == true
37
+ result = json[:result]
38
+ (type && type[result]) || result
39
+ else
40
+ raise ResponseError, json[:error]
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'struct'
2
+ require_relative 'core'
3
+
4
+ module TelegraphApi
5
+ module Types
6
+ class Account < Struct
7
+ attribute :short_name, Core::String
8
+ attribute :author_name, Core::String
9
+ attribute :author_url, Core::String
10
+
11
+ attribute :access_token, Core::String.meta(omittable: true)
12
+ attribute :auth_url, Core::String.meta(omittable: true)
13
+ attribute :page_count, Core::String.meta(omittable: true)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ require 'dry-struct'
2
+ require 'dry-types'
3
+
4
+ module TelegraphApi
5
+ module Types
6
+ class Core
7
+ include Dry::Types.module
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'struct'
2
+ require_relative 'core'
3
+
4
+ module TelegraphApi
5
+ module Types
6
+ class NodeElement < Struct
7
+ Node = Core::String | NodeElement
8
+
9
+ attribute :tag, Core::String
10
+ attribute :attrs, Core::Hash
11
+ attribute :children, Core::Array.of(Node).meta(omittable: true)
12
+ end
13
+
14
+ Node = Core::String | NodeElement
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'struct'
2
+ require_relative 'core'
3
+ require_relative 'node'
4
+
5
+ module TelegraphApi
6
+ module Types
7
+ class Page < Struct
8
+ attribute :path, Core::String
9
+ attribute :url, Core::String
10
+ attribute :title, Core::String
11
+ attribute :description, Core::String
12
+ attribute :views, Core::Integer
13
+
14
+ attribute :author_name, Core::String.meta(omittable: true)
15
+ attribute :author_url, Core::String.meta(omittable: true)
16
+ attribute :image_url, Core::String.meta(omittable: true)
17
+ attribute :content, Core::Array.of(Node).meta(omittable: true)
18
+ attribute :can_edit, Core::Bool.meta(omittable: true)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'struct'
2
+ require_relative 'core'
3
+ require_relative 'page'
4
+
5
+ module TelegraphApi
6
+ module Types
7
+ class PageList < Struct
8
+ attribute :total_count, Core::Integer
9
+ attribute :pages, Core::Array.of(Page)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ require_relative 'struct'
2
+ require_relative 'core'
3
+
4
+ module TelegraphApi
5
+ module Types
6
+ class PageViews < Struct
7
+ attribute :views, Core::Integer
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,25 @@
1
+ require 'dry-struct'
2
+ require 'dry-types'
3
+
4
+ module TelegraphApi
5
+ module Types
6
+ class Struct < Dry::Struct
7
+ # throw an error when unknown keys provided
8
+ input input.strict
9
+
10
+ # convert string keys to symbols
11
+ transform_keys(&:to_sym)
12
+
13
+ # resolve default types on nil
14
+ transform_types do |type|
15
+ if type.default?
16
+ type.constructor do |value|
17
+ value.nil? ? Core::Undefined : value
18
+ end
19
+ else
20
+ type
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'types/core'
2
+ require_relative 'types/account'
3
+ require_relative 'types/node'
4
+ require_relative 'types/page'
5
+ require_relative 'types/page_list'
6
+ require_relative 'types/page_views'
@@ -0,0 +1,8 @@
1
+ require_relative 'telegraph_api_ruby/types'
2
+ require_relative 'telegraph_api_ruby/request'
3
+ require_relative 'telegraph_api_ruby/client'
4
+ require_relative 'telegraph_api_ruby/dom_to_node'
5
+
6
+ module TelegraphApi
7
+ VERSION = '1.0.0'.freeze
8
+ end
@@ -0,0 +1,7 @@
1
+ ENV['APP_ENV'] = 'test'
2
+ ENV['RACK_ENV'] = 'test'
3
+
4
+ require 'minitest/reporters'
5
+ Minitest::Reporters.use!
6
+
7
+ require 'minitest/autorun'
@@ -0,0 +1,35 @@
1
+ require_relative 'test_helper'
2
+
3
+ class TestTelegraphApi < Minitest::Test
4
+ def test_create_user
5
+ result = create_account
6
+
7
+ refute_nil result.access_token, 'Access Token is nil'
8
+ end
9
+
10
+ def test_create_page
11
+ result = create_account
12
+
13
+ html = '<b>Test Content<u>sadasd</u></b><img src="123" />'
14
+ content = TelegraphApi::DomToNode.call(html)
15
+
16
+ data = {
17
+ access_token: result.access_token,
18
+ title: 'Test Title',
19
+ content: JSON.dump(content),
20
+ return_content: true
21
+ }
22
+
23
+ result = TelegraphApi::Client.create_page(data)
24
+
25
+ refute_nil result.content, 'Content is nil'
26
+ refute_nil result.url, 'Url is nil'
27
+ end
28
+
29
+ private
30
+
31
+ def create_account
32
+ data = { short_name: 'test' }
33
+ TelegraphApi::Client.create_account(data)
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,208 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: telegraph_api_ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ivan Fokeev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: minitest
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 5.11.3
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '5.1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.11.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: minitest-reporters
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.3'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.3.4
43
+ type: :development
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.3'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.3.4
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '12.3'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 12.3.1
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '12.3'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 12.3.1
73
+ - !ruby/object:Gem::Dependency
74
+ name: activesupport
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '5.0'
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 5.0.0
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.0'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 5.0.0
93
+ - !ruby/object:Gem::Dependency
94
+ name: dry-struct
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '0.5'
100
+ type: :runtime
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '0.5'
107
+ - !ruby/object:Gem::Dependency
108
+ name: dry-types
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '0.12'
114
+ type: :runtime
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '0.12'
121
+ - !ruby/object:Gem::Dependency
122
+ name: oga
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '2.15'
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '2.15'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.15'
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '2.15'
141
+ - !ruby/object:Gem::Dependency
142
+ name: typhoeus
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '1.3'
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: 1.3.0
151
+ type: :runtime
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '1.3'
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: 1.3.0
161
+ description:
162
+ email: vanya@vanya.cc
163
+ executables: []
164
+ extensions: []
165
+ extra_rdoc_files: []
166
+ files:
167
+ - README.md
168
+ - Rakefile
169
+ - lib/telegraph_api_ruby.rb
170
+ - lib/telegraph_api_ruby/client.rb
171
+ - lib/telegraph_api_ruby/dom_to_node.rb
172
+ - lib/telegraph_api_ruby/request.rb
173
+ - lib/telegraph_api_ruby/types.rb
174
+ - lib/telegraph_api_ruby/types/account.rb
175
+ - lib/telegraph_api_ruby/types/core.rb
176
+ - lib/telegraph_api_ruby/types/node.rb
177
+ - lib/telegraph_api_ruby/types/page.rb
178
+ - lib/telegraph_api_ruby/types/page_list.rb
179
+ - lib/telegraph_api_ruby/types/page_views.rb
180
+ - lib/telegraph_api_ruby/types/struct.rb
181
+ - test/test_helper.rb
182
+ - test/test_telegraph_api.rb
183
+ homepage: http://github.com/ifokeev/telegraph_api_ruby
184
+ licenses:
185
+ - MIT
186
+ metadata: {}
187
+ post_install_message:
188
+ rdoc_options: []
189
+ require_paths:
190
+ - lib
191
+ required_ruby_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ required_rubygems_version: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ requirements: []
202
+ rubyforge_project:
203
+ rubygems_version: 2.5.1
204
+ signing_key:
205
+ specification_version: 4
206
+ summary: Fully working http client for https://telegra.ph/api supporting DomToNode
207
+ processing
208
+ test_files: []