telegraph_api_ruby 1.0.0

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: 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: []