datawow 1.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.
Files changed (70) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +59 -0
  6. data/INSTALL.md +7 -0
  7. data/README/ai_docs.md +153 -0
  8. data/README/image_docs.md +119 -0
  9. data/README/text_docs.md +83 -0
  10. data/README/video_docs.md +53 -0
  11. data/README.md +160 -0
  12. data/Rakefile +12 -0
  13. data/datawow.gemspec +28 -0
  14. data/lib/datawow/client_response.rb +18 -0
  15. data/lib/datawow/connection.rb +99 -0
  16. data/lib/datawow/connector.rb +118 -0
  17. data/lib/datawow/error.rb +15 -0
  18. data/lib/datawow/faraday/raise_http_exception.rb +40 -0
  19. data/lib/datawow/models/images/image_choices.rb +16 -0
  20. data/lib/datawow/models/images/image_closed_questions.rb +16 -0
  21. data/lib/datawow/models/images/image_messages.rb +16 -0
  22. data/lib/datawow/models/images/image_photo_tags.rb +16 -0
  23. data/lib/datawow/models/images/nanameue_human.rb +16 -0
  24. data/lib/datawow/models/interface.rb +26 -0
  25. data/lib/datawow/models/predictions/predictors.rb +18 -0
  26. data/lib/datawow/models/texts/text_categories.rb +16 -0
  27. data/lib/datawow/models/texts/text_closed_questions.rb +16 -0
  28. data/lib/datawow/models/texts/text_conversations.rb +16 -0
  29. data/lib/datawow/models/videos/video_classifications.rb +17 -0
  30. data/lib/datawow/version.rb +3 -0
  31. data/lib/datawow.rb +75 -0
  32. data/lib/generators/datawow/install_generator.rb +18 -0
  33. data/lib/generators/templates/datawow_api.rb +5 -0
  34. data/test/datawow/client_response_test.rb +29 -0
  35. data/test/datawow/connection_test.rb +85 -0
  36. data/test/datawow/connector_test.rb +79 -0
  37. data/test/datawow/image_choices_test.rb +48 -0
  38. data/test/datawow/image_closed_questions_test.rb +47 -0
  39. data/test/datawow/image_messages_test.rb +48 -0
  40. data/test/datawow/image_photo_tags_test.rb +48 -0
  41. data/test/datawow/nanameue_human_test.rb +47 -0
  42. data/test/datawow/predictors_test.rb +48 -0
  43. data/test/datawow/text_categories_test.rb +48 -0
  44. data/test/datawow/text_closed_questions_test.rb +48 -0
  45. data/test/datawow/text_conversations_test.rb +48 -0
  46. data/test/datawow/video_classifications_test.rb +48 -0
  47. data/test/datawow_test.rb +34 -0
  48. data/test/fixtures/image_choice/all.json +27 -0
  49. data/test/fixtures/image_choice/create.json +25 -0
  50. data/test/fixtures/image_closed_question/all.json +21 -0
  51. data/test/fixtures/image_closed_question/create.json +19 -0
  52. data/test/fixtures/image_message/all.json +22 -0
  53. data/test/fixtures/image_message/create.json +20 -0
  54. data/test/fixtures/image_photo_tag/all.json +22 -0
  55. data/test/fixtures/image_photo_tag/create.json +20 -0
  56. data/test/fixtures/nanameue_human/all.json +25 -0
  57. data/test/fixtures/nanameue_human/create.json +21 -0
  58. data/test/fixtures/prediction/all.json +21 -0
  59. data/test/fixtures/prediction/create.json +19 -0
  60. data/test/fixtures/text_category/all.json +34 -0
  61. data/test/fixtures/text_category/create.json +27 -0
  62. data/test/fixtures/text_closed_question/all.json +27 -0
  63. data/test/fixtures/text_closed_question/create.json +20 -0
  64. data/test/fixtures/text_conversation/all.json +33 -0
  65. data/test/fixtures/text_conversation/create.json +26 -0
  66. data/test/fixtures/video_classification/all.json +21 -0
  67. data/test/fixtures/video_classification/create.json +19 -0
  68. data/test/helper/file_reader.rb +11 -0
  69. data/test/test_helper.rb +59 -0
  70. metadata +254 -0
@@ -0,0 +1,18 @@
1
+ module Datawow
2
+ class Response
3
+ attr_reader :total, :message, :status
4
+ attr_accessor :data, :meta
5
+
6
+ def initialize(data, response_code = '', response_message = 'success', meta = nil, total = 0)
7
+ @data = data
8
+ @status = response_code.to_i
9
+ @message = response_message
10
+ @meta = meta
11
+ @total = total unless total.nil?
12
+ end
13
+
14
+ def successful?
15
+ [200, 201].include? status
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('faraday/raise_http_exception.rb', __dir__)
4
+ require File.expand_path('client_response.rb', __dir__)
5
+
6
+ module Datawow
7
+ # :nodoc:
8
+ class Connection
9
+ def initialize(model:, version_api: 'v1')
10
+ @model = model
11
+ @version_api = version_api
12
+ end
13
+
14
+ def get(path, options = {})
15
+ @response = connection.get do |request|
16
+ request.url("#{@version_api}#{path}")
17
+ request.headers['Content-Type'] = 'application/json'
18
+ request.headers['Authorization'] = options[:token] unless options[:token].nil?
19
+ request.params = options[:path_param] ? params_url_options(options) : options
20
+ end
21
+ Response.new(data, status_code, message, meta, total)
22
+ rescue Error, Faraday::Error => e
23
+ handle_error(e)
24
+ end
25
+
26
+ def post(path, options = {}, query_params = {})
27
+ @response = connection.post do |request|
28
+ request.url("#{@version_api}#{path}")
29
+ request.headers['Content-Type'] = 'application/json'
30
+ request.headers['Authorization'] = options[:token] unless options[:token].nil?
31
+ request.params = query_params
32
+ request.body = options unless options.nil?
33
+ end
34
+ Response.new(data, status_code, message, meta, nil)
35
+ rescue Error, Faraday::Error => e
36
+ handle_error(e)
37
+ end
38
+
39
+ private
40
+
41
+ def connection
42
+ @connection ||= Faraday::Connection.new(base_point) do |connection|
43
+ connection.request :url_encoded
44
+ connection.request :json
45
+ connection.response :json
46
+ connection.use Datawow::FaradayMiddleware::RaiseHttpException
47
+ connection.use :gzip
48
+ connection.adapter Faraday.default_adapter
49
+ end
50
+ end
51
+
52
+ def data
53
+ @response.body['data']
54
+ end
55
+
56
+ def meta
57
+ @response.body['meta']
58
+ end
59
+
60
+ def status_code
61
+ meta['code'] unless meta.nil?
62
+ end
63
+
64
+ def message
65
+ meta['message'] unless meta.nil?
66
+ end
67
+
68
+ def total
69
+ meta['total_count'] unless meta.nil?
70
+ end
71
+
72
+ def handle_error(exception)
73
+ if exception.is_a?(Faraday::ConnectionFailed)
74
+ code = 599
75
+ message = 'Connection Failed'
76
+ else
77
+ code = exception.to_s.partition(':').first
78
+ message = exception.to_s.partition(':').last
79
+ end
80
+
81
+ Response.new(nil, code, message, nil)
82
+ end
83
+
84
+ def params_url_options(options)
85
+ %i[id path_param].each { |e| options.delete(e) }
86
+ options
87
+ end
88
+
89
+ def base_point
90
+ options = {
91
+ image: 'https://kiyo-image.datawow.io/api/',
92
+ ai: 'https://kiyo-image.datawow.io/api/',
93
+ text: 'https://kiyo-text.datawow.io/api/',
94
+ video: 'https://kiyo-image.datawow.io/api/'
95
+ }
96
+ options[@model]
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require 'net/https'
5
+ require 'uri'
6
+
7
+ require File.expand_path('client_response.rb', __dir__)
8
+
9
+ module Datawow
10
+ # :nodoc:
11
+ class Connector
12
+ def initialize(path, type, token: '', version_api: 'v1')
13
+ @version_api = version_api
14
+ @type = type
15
+ @path = path
16
+ @token = token
17
+ @method = :GET
18
+ end
19
+
20
+ def post(data = {})
21
+ @method = :POST
22
+ response = send_request(data)
23
+
24
+ body = JSON.parse response.body
25
+
26
+ Response.new(body['data'], response.code, body['meta']['message'], body['meta'], 1)
27
+ end
28
+
29
+ def get(data = {}, query_str = true)
30
+ @method = :GET
31
+ response = send_request(data, query_str)
32
+ body = JSON.parse response.body
33
+
34
+ Response.new(body['data'], response.code, body['meta']['message'], body['meta'], body['meta']['total_count'])
35
+ end
36
+
37
+ def put(data = {})
38
+ @method = :PUT
39
+ response = send_request(data)
40
+ body = JSON.parse response.body
41
+
42
+ Response.new(body['data'], response.code, body['meta']['message'], body['meta'], 1)
43
+ end
44
+
45
+ def delete(data = {}, query_str = true)
46
+ @method = :DELETE
47
+ response = send_request(data, query_str)
48
+ body = JSON.parse response.body
49
+
50
+ Response.new(body['data'], response.code, body['meta']['message'], body['meta'], body['meta']['total_count'])
51
+ end
52
+
53
+ private
54
+
55
+ def send_request(data = {}, query_str = true)
56
+ base_uri = base_point(@type)
57
+ url_base = "#{base_uri}/#{@version_api}/#{@path}"
58
+ uri = URI.parse(url_base)
59
+
60
+ if @method == :GET
61
+ if query_str
62
+ uri.query = URI.encode_www_form(data)
63
+ else
64
+ url_base = "#{url_base}/#{data[:id]}"
65
+ uri = URI.parse(url_base)
66
+ end
67
+ end
68
+
69
+ https = Net::HTTP.new(uri.host, uri.port)
70
+ https.use_ssl = true
71
+ request = build_request(uri)
72
+ request.set_form_data(data)
73
+ response = https.request(request)
74
+ end
75
+
76
+ def build_request(uri)
77
+ request = {}
78
+ token = if Datawow.project_key
79
+ Datawow.project_key
80
+ else
81
+ @token
82
+ end
83
+
84
+ if (token || '').empty?
85
+ raise ArgumentError, 'project\'s token has missed. To config about token check our document'
86
+ end
87
+
88
+ case @method
89
+ when :POST
90
+ request = Net::HTTP::Post.new(uri.request_uri)
91
+ when :GET
92
+ request = Net::HTTP::Get.new(uri.request_uri)
93
+ when :PUT
94
+ request = Net::HTTP::Put.new(uri.request_uri)
95
+ when :DELETE
96
+ request = Net::HTTP::Delete.new(uri.request_uri)
97
+ else
98
+ raise ArgumentError, 'HTTP method is not exist, We allowed GET, POST, PUT, DELET only'
99
+ end
100
+
101
+ request['User-Agent'] = 'Datawow Ruby gem client'
102
+ request['Accept'] = 'application/json'
103
+ request['Content-Type'] = 'application/json'
104
+ request['Authorization'] = token
105
+
106
+ request
107
+ end
108
+
109
+ def base_point(type)
110
+ {
111
+ image: 'https://kiyo-image.datawow.io/api',
112
+ ai: 'https://kiyo-image.datawow.io/api',
113
+ text: 'https://kiyo-text.datawow.io/api',
114
+ video: 'https://kiyo-image.datawow.io/api'
115
+ }[type]
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,15 @@
1
+ module Datawow
2
+
3
+ # Custom error class for rescuing from all API errors
4
+ class Error < StandardError; end
5
+
6
+ # Raised when API returns the HTTP status code 400
7
+ class BadRequest < Error; end
8
+
9
+ # Raised when API returns the HTTP status code 403
10
+ class NotPermitted < Error; end
11
+
12
+ # Raised when API returns the HTTP status code 404
13
+ class NotFound < Error; end
14
+
15
+ end
@@ -0,0 +1,40 @@
1
+ require 'faraday_middleware'
2
+
3
+ module Datawow
4
+ module FaradayMiddleware
5
+ class RaiseHttpException < Faraday::Middleware
6
+ def call(request_env)
7
+ @app.call(request_env).on_complete do |response|
8
+ case response[:status].to_i
9
+ when 200, 201
10
+ # nothing to do here
11
+ when 400
12
+ error_message = error_message(response[:body])
13
+ raise BadRequest, "#{response[:status]}: #{error_message}"
14
+ when 403
15
+ error_message = error_message(response[:body])
16
+ raise NotPermitted, "#{response[:status]}: #{error_message}"
17
+ when 404
18
+ error_message = error_message(response[:body])
19
+ raise NotFound, "#{response[:status]}: #{error_message}"
20
+ else
21
+ request_method = response[:method].to_s.upcase
22
+ request_url = response[:url].to_s
23
+ response_status = response[:status]
24
+ error_message = error_message(response[:body])
25
+ raise Error, "#{response_status}: #{request_method} #{request_url} #{error_message}"
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def error_message(response_body)
33
+ if !response_body.nil? && response_body.is_a?(String)
34
+ response_body = JSON.parse(response_body)
35
+ response_body['message']
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class ImageChoice
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :image
13
+ @path = 'images/choices'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class ImageClosedQuestion
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :image
13
+ @path = 'images/closed_questions'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class ImageMessage
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :image
13
+ @path = 'images/messages'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class ImagePhotoTag
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :image
13
+ @path ='images/photo_tags'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class NanameueHuman
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize(token = nil)
11
+ @token = token
12
+ @type = :image
13
+ @path = 'jobs/nanameue/consensuses'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ module Models
5
+ module Interface
6
+ def all(options = {})
7
+ connector.get(options)
8
+ end
9
+
10
+ def create(options)
11
+ connector.post(options)
12
+ end
13
+
14
+ def find_by(options = {})
15
+ @query_str = true if @query_str.nil?
16
+ connector.get(options, @query_str)
17
+ end
18
+
19
+ private
20
+
21
+ def connector
22
+ @connection ||= Connector.new(@path, @type, token: @token)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class Predictor
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :ai
13
+ @query_str = false
14
+
15
+ @path = 'prime/predictions'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class TextCategory
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :text
13
+ @path = 'text/text_categories'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class TextClosedQuestion
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :text
13
+ @path = 'text/text_closed_questions'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class TextConversation
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :text
13
+ @path = 'text/text_conversations'
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datawow
4
+ # :nodoc:
5
+ class VideoClassification
6
+ include Datawow::Models::Interface
7
+
8
+ attr_writer :token
9
+
10
+ def initialize
11
+ @token = nil
12
+ @type = :video
13
+ @query_str = false
14
+ @path = 'videos/closed_questions'
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module Datawow
2
+ VERSION = '1.2.0'.freeze
3
+ end
data/lib/datawow.rb ADDED
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+ require 'pry-byebug'
3
+
4
+ require_relative 'datawow/client_response'
5
+ require_relative 'datawow/connection'
6
+ require_relative 'datawow/connector'
7
+ require_relative 'datawow/error'
8
+ require_relative 'datawow/version'
9
+ require_relative 'datawow/models/interface'
10
+
11
+ require_relative 'datawow/models/images/image_closed_questions'
12
+ require_relative 'datawow/models/images/image_photo_tags'
13
+ require_relative 'datawow/models/images/image_choices'
14
+ require_relative 'datawow/models/images/image_messages'
15
+ require_relative 'datawow/models/images/nanameue_human'
16
+ require_relative 'datawow/models/predictions/predictors'
17
+
18
+ require_relative 'datawow/models/texts/text_categories'
19
+ require_relative 'datawow/models/texts/text_closed_questions'
20
+ require_relative 'datawow/models/texts/text_conversations'
21
+
22
+ require_relative 'datawow/models/videos/video_classifications'
23
+
24
+ # :nodoc:
25
+ module Datawow
26
+ extend self
27
+
28
+ attr_accessor :project_key
29
+
30
+ class << self
31
+ def setup
32
+ yield self
33
+ end
34
+
35
+ def video_classification
36
+ VideoClassification.new
37
+ end
38
+
39
+ def text_closed_question
40
+ TextClosedQuestion.new
41
+ end
42
+
43
+ def text_category
44
+ TextCategory.new
45
+ end
46
+
47
+ def text_conversation
48
+ TextConversation.new
49
+ end
50
+
51
+ def image_closed_question
52
+ ImageClosedQuestion.new
53
+ end
54
+
55
+ def image_photo_tag
56
+ ImagePhotoTag.new
57
+ end
58
+
59
+ def image_choice
60
+ ImageChoice.new
61
+ end
62
+
63
+ def image_message
64
+ ImageMessage.new
65
+ end
66
+
67
+ def prediction
68
+ Predictor.new
69
+ end
70
+
71
+ def nanameue_human
72
+ NanameueHuman.new
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails/generators/base'
2
+ require 'securerandom'
3
+
4
+ module Datawow
5
+ module Generators
6
+ # :nodoc:
7
+ class InstallGenerator < Rails::Generators::Base
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ desc 'Creates a Datawow initializer
11
+ and copy locale files to your application.'
12
+
13
+ def copy_initializer
14
+ template 'datawow_api.rb', 'config/initializers/datawow_api.rb'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ Datawow.setup do |config|
2
+ # ==> Secret key Configuration
3
+ # You can change it below and use your own secret key.
4
+ config.project_key = 'Project token key'
5
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module Datawow
6
+ class ResponseTest < Minitest::Test
7
+ def test_new_success_response
8
+ response = Response.new('response', 200, 'success', 'meta', 5)
9
+ refute_nil(response)
10
+ refute_nil(response.data)
11
+ assert_equal(true, response.successful?)
12
+ assert_equal('response', response.data)
13
+ assert_equal('success', response.message)
14
+ assert_equal('meta', response.meta)
15
+ assert_equal(5, response.total)
16
+ end
17
+
18
+ def test_failure_response
19
+ response = Response.new('response', 500, 'failure', 'meta')
20
+ refute_nil(response)
21
+ refute_nil(response.data)
22
+ assert_equal(false, response.successful?)
23
+ assert_equal('response', response.data)
24
+ assert_equal('failure', response.message)
25
+ assert_equal('meta', response.meta)
26
+ assert_equal(0, response.total)
27
+ end
28
+ end
29
+ end