speechmatics 0.0.1

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: 8210e8986392a652fa4ea9d32323d4291deccdc8
4
+ data.tar.gz: de715dde74d262783322600f20a111f84fa5f178
5
+ SHA512:
6
+ metadata.gz: 52379bcdd89a082000f6fe8b5a966139eceabc5376ed30868ff216d71ebc5b5739192b54e41f06f06a1816ba1eb6f3a38ae49f24c9e97de2004b85e9e5382330
7
+ data.tar.gz: 6be9eb916d965a78239f4f59ee8e4203b6ea153123f0ee9dfa695b2909ff3f1faca2b867ea52db0570e20aea4254a14bbcaf49bd5cd9f2e921b3c0c47da33b9e
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .key
19
+ notes.txt
20
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in speechmatics.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Public Radio Exchange
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # Speechmatics
2
+
3
+ Speechmatics (https://speechmatics.com) provides an API for speech to text (https://speechmatics.com/api-details. This gem implements the API making it easier to integrate into Ruby and/or Rails projects.
4
+
5
+ ## Installation
6
+
7
+ ### libmagic
8
+
9
+ This gem will attempt to derive the content type of uploaded audio files using the 'ruby-filemagic' gem (https://github.com/blackwinter/ruby-filemagic), which requires the 'libmagic' native library to be installed.
10
+
11
+ You can explicitly specify the `content_type` for the `data_file`, and libmagic will not be called.
12
+
13
+ ### gem
14
+
15
+ Add this line to your application's Gemfile:
16
+
17
+ gem 'speechmatics'
18
+
19
+ And then execute:
20
+
21
+ $ bundle
22
+
23
+ Or install it yourself as:
24
+
25
+ $ gem install speechmatics
26
+
27
+ ## Usage
28
+
29
+ See the tests, or here is basic usage:
30
+ ```ruby
31
+
32
+ # configure with api key and user id to use for all requsts
33
+ Speechmatics.configure do |sm|
34
+ sm.auth_token = '<your api key here>'
35
+ sm.user_id = 1234
36
+
37
+ # these are defaults
38
+ sm.adapter = :excon
39
+ sm.endpoint = 'http://api.speechmatics.com/v1.0/'
40
+ sm.user_agent = "Speechmatics Ruby Gem #{Speechmatics::VERSION}"
41
+ end
42
+
43
+ # create a new client
44
+ c = Speechmatics::Client.new
45
+
46
+ # retrieve user
47
+ j = c.user.get
48
+
49
+ # list jobs
50
+ jobs = c.user.jobs.list
51
+
52
+ # create job
53
+ info = c.user.jobs.create(data_file: '/Users/nobody/dev/speechmatics/test/zero.wav')
54
+
55
+ # create job with more options
56
+ info = c.user.jobs.create(
57
+ data_file: '/Users/nobody/dev/speechmatics/test/zero.wav',
58
+ content_type: 'audio/x-wav; charset=binary',
59
+ notification: '<email | none | callback>',
60
+ callback: 'http://www.example.com/transcript_callback'
61
+ )
62
+
63
+ # retrieve job
64
+ job = c.user.jobs.find(5678)
65
+
66
+ # retrieve audio for a job
67
+ audio = c.user.jobs(5678).audio
68
+
69
+ # retrieve trancript for a job
70
+ trans = c.user.jobs(5678).transcript
71
+
72
+ ```
73
+
74
+ ## Contributing
75
+
76
+ 1. Fork it
77
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
78
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
79
+ 4. Push to the branch (`git push origin my-new-feature`)
80
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs.push 'lib'
6
+ t.libs.push 'test'
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ t.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,18 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'active_support/all'
5
+
6
+ require "speechmatics/version"
7
+ require 'speechmatics/configuration'
8
+ require 'speechmatics/connection'
9
+ require 'speechmatics/response'
10
+ require 'speechmatics/api'
11
+ require 'speechmatics/api_factory'
12
+ require 'speechmatics/client'
13
+ require 'speechmatics/user'
14
+ require 'speechmatics/user/jobs'
15
+
16
+ module Speechmatics
17
+ extend Configuration
18
+ end
@@ -0,0 +1,99 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Speechmatics
4
+ class API
5
+
6
+ include Connection
7
+
8
+ attr_reader *Speechmatics::Configuration.keys
9
+
10
+ attr_accessor :current_options
11
+
12
+ class_eval do
13
+ Speechmatics::Configuration.keys.each do |key|
14
+ define_method "#{key}=" do |arg|
15
+ self.instance_variable_set("@#{key}", arg)
16
+ self.current_options.merge!({:"#{key}" => arg})
17
+ end
18
+ end
19
+ end
20
+
21
+ def initialize(options={}, &block)
22
+ apply_options(options)
23
+ yield(self) if block_given?
24
+ end
25
+
26
+ def apply_options(options={})
27
+ self.current_options ||= ActiveSupport::HashWithIndifferentAccess.new(Speechmatics.options)
28
+ self.current_options = current_options.merge(args_to_options(options))
29
+ Configuration.keys.each do |key|
30
+ send("#{key}=", current_options[key])
31
+ end
32
+ end
33
+
34
+ def request(method, path, params={}) # :nodoc:
35
+ unless (method && [:get, :post, :put, :patch, :delete].include?(method))
36
+ raise ArgumentError, "whoops, that isn't a valid http method: #{method}"
37
+ end
38
+
39
+ conn = connection((params[:options] || {}).merge(current_options))
40
+ request_path = (conn.path_prefix + '/' + path).gsub(/\/+/, '/')
41
+
42
+ response = conn.send(method) do |request|
43
+ case method.to_sym
44
+ when :get, :delete
45
+ request.url(request_path, params)
46
+ when :post, :put
47
+ request.path = request_path
48
+ request.body = params[:data]
49
+ end
50
+ end
51
+ Speechmatics::Response.new(response, {api: self, method: method, path: path, params: params})
52
+ end
53
+
54
+ def base_path
55
+ parts = self.class.name.split("::").inject([]){|a, c|
56
+ if c != 'Speechmatics'
57
+ base = c.underscore
58
+ a << base.tr('_','-')
59
+ a << current_options["#{base.singularize}_id"] if current_options["#{base.singularize}_id"]
60
+ end
61
+ a
62
+ }
63
+ parts.join('/') + '/'
64
+ end
65
+
66
+ def list(params={})
67
+ self.current_options = current_options.merge(args_to_options(params))
68
+ request(:get, base_path)
69
+ end
70
+
71
+ def get(params={})
72
+ self.current_options = current_options.merge(args_to_options(params))
73
+ request(:get, base_path)
74
+ end
75
+
76
+ def create(params={})
77
+ self.current_options = current_options.merge(args_to_options(params))
78
+ request(:post, base_path, {data: params})
79
+ end
80
+
81
+ def update(params={})
82
+ self.current_options = current_options.merge(args_to_options(params))
83
+ request(:put, base_path, {data: params})
84
+ end
85
+
86
+ def delete(params={})
87
+ self.current_options = current_options.merge(args_to_options(params))
88
+ request(:delete, base_path)
89
+ end
90
+
91
+ def args_to_options(args)
92
+ params = if args.is_a?(String) || args.is_a?(Symbol)
93
+ {"#{self.class.name.demodulize.downcase.singularize}_id" => args}
94
+ elsif args.is_a?(Hash)
95
+ args
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Speechmatics
4
+ class ApiFactory
5
+
6
+ def self.api(name, parent, options={}, &block)
7
+ api = name.constantize.new(parent.current_options)
8
+ api.apply_options(options)
9
+ yield(api) if block_given?
10
+ api
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Speechmatics
4
+ class Client < API
5
+
6
+ def user(params={}, &block)
7
+ @user ||= ApiFactory.api('Speechmatics::User', self, params, &block)
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,57 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Speechmatics
4
+ module Configuration
5
+
6
+ VALID_OPTIONS_KEYS = [
7
+ :user_id,
8
+ :auth_token,
9
+ :adapter,
10
+ :endpoint,
11
+ :user_agent
12
+ ].freeze
13
+
14
+ # Adapters are whatever Faraday supports - I like excon alot, so I'm defaulting it
15
+ DEFAULT_ADAPTER = :excon
16
+
17
+ # The api endpoint to get REST
18
+ DEFAULT_ENDPOINT = 'http://api.speechmatics.com/v1.0/'.freeze
19
+
20
+ # The value sent in the http header for 'User-Agent' if none is set
21
+ DEFAULT_USER_AGENT = "Speechmatics Ruby Gem #{Speechmatics::VERSION}".freeze
22
+
23
+ attr_accessor *VALID_OPTIONS_KEYS
24
+
25
+ # Convenience method to allow for global setting of configuration options
26
+ def configure
27
+ yield self
28
+ end
29
+
30
+ def self.extended(base)
31
+ base.reset!
32
+ end
33
+
34
+ class << self
35
+ def keys
36
+ VALID_OPTIONS_KEYS
37
+ end
38
+ end
39
+
40
+ def options
41
+ options = {}
42
+ VALID_OPTIONS_KEYS.each { |k| options[k] = send(k) }
43
+ options
44
+ end
45
+
46
+ # Reset configuration options to their defaults
47
+ def reset!
48
+ self.user_id = nil
49
+ self.auth_token = nil
50
+ self.adapter = DEFAULT_ADAPTER
51
+ self.endpoint = DEFAULT_ENDPOINT
52
+ self.user_agent = DEFAULT_USER_AGENT
53
+ self
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,52 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'faraday_middleware'
4
+
5
+ module Speechmatics
6
+ module Connection
7
+
8
+ ALLOWED_OPTIONS = [
9
+ :headers,
10
+ :url,
11
+ :params,
12
+ :request,
13
+ :ssl
14
+ ].freeze
15
+
16
+ def merge_default_options(opts={})
17
+ opts = opts.slice(*ALLOWED_OPTIONS)
18
+ headers = opts.delete(:headers) || {}
19
+ params = opts.delete(:params) || {}
20
+ options = HashWithIndifferentAccess.new(
21
+ {
22
+ headers: {
23
+ 'User-Agent' => user_agent,
24
+ 'Accept' => "application/json"
25
+ },
26
+ ssl: { verify: false },
27
+ url: endpoint,
28
+ params: { auth_token: auth_token }
29
+ }
30
+ ).merge(opts)
31
+ options[:headers] = options[:headers].merge(headers)
32
+ options[:params] = options[:params].merge(params)
33
+ options
34
+ end
35
+
36
+ def connection(options={})
37
+ opts = merge_default_options(options)
38
+
39
+ @conn ||= Faraday::Connection.new(opts) do |connection|
40
+ connection.request :multipart
41
+ connection.request :url_encoded
42
+
43
+ connection.response :mashify
44
+ connection.response :logger if ENV['DEBUG']
45
+ connection.response :json
46
+
47
+ connection.adapter(*adapter)
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ module Speechmatics
2
+ class Resource
3
+ attr_accessor :response, :client
4
+ end
5
+ end
@@ -0,0 +1,69 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Speechmatics
4
+ class Response
5
+ attr_accessor :raw, :request
6
+
7
+ def initialize(response, request={})
8
+ @raw = response
9
+ @request = request
10
+
11
+ check_for_error(response)
12
+ end
13
+
14
+ def check_for_error(response)
15
+ status_code_type = response.status.to_s[0]
16
+ case status_code_type
17
+ when "2"
18
+ # puts "all is well, status: #{response.status}"
19
+ when "4", "5"
20
+ raise "Whoops, error back from Speechmatics: #{response.status}"
21
+ else
22
+ raise "Unrecongized status code: #{response.status}"
23
+ end
24
+ end
25
+
26
+ def body
27
+ self.raw.body
28
+ end
29
+
30
+ def object_name
31
+ self.request[:api].class.name.split("::").last.underscore
32
+ end
33
+
34
+ def object
35
+ body[object_name].nil? ? body : body[object_name]
36
+ end
37
+
38
+ def objects
39
+ Array(self.object)
40
+ end
41
+
42
+ def [](key)
43
+ if self.object.is_a?(Array) || self.object.is_a?(Hash)
44
+ self.object[key]
45
+ else
46
+ self.object.send(:"#{key}")
47
+ end
48
+ end
49
+
50
+ def has_key?(key)
51
+ self.object.is_a?(Hash) && self.object.has_key?(key)
52
+ end
53
+
54
+ # Coerce any method calls for body attributes
55
+ #
56
+ def method_missing(method_name, *args, &block)
57
+ if self.has_key?(method_name.to_s)
58
+ self.[](method_name, &block)
59
+ elsif self.body.respond_to?(method_name)
60
+ self.body.send(method_name, *args, &block)
61
+ elsif self.request[:api].respond_to?(method_name)
62
+ self.request[:api].send(method_name, *args, &block)
63
+ else
64
+ super
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Speechmatics
4
+ class User < API
5
+ include Configuration
6
+
7
+ def jobs(params={}, &block)
8
+ @jobs ||= ApiFactory.api('Speechmatics::User::Jobs', self, params, &block)
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,44 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'filemagic'
4
+
5
+ module Speechmatics
6
+ class User::Jobs < API
7
+ include Configuration
8
+
9
+ def create(params={})
10
+ attach_audio(params)
11
+ set_mode(params)
12
+ super
13
+ end
14
+
15
+ def transcript(params={})
16
+ self.current_options = current_options.merge(args_to_options(params))
17
+ request(:get, "#{base_path}/transcript")
18
+ end
19
+
20
+ def audio(params={})
21
+ self.current_options = current_options.merge(args_to_options(params))
22
+ request(:get, "#{base_path}/audio")
23
+ end
24
+
25
+ def set_mode(params={})
26
+ params[:mode] ||= 'en-US'
27
+ params
28
+ end
29
+
30
+ def attach_audio(params={})
31
+ file_path = params[:data_file]
32
+ raise "No file specified for new job, please provide a :data_file value" unless file_path
33
+ raise "No file exists at path '#{file_path}'" unless File.exists?(file_path)
34
+
35
+ content_type = params[:content_type] || FileMagic.mime.file(file_path)
36
+ raise "No content type specified for file, please provide a :content_type value" unless content_type
37
+ raise "Content type for file '#{file_path}' is not audio, it is '#{content_type}'." unless (content_type =~ /audio/)
38
+
39
+ params[:data_file] = Faraday::UploadIO.new(file_path, content_type)
40
+ params
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Speechmatics
4
+ VERSION = "0.0.1"
5
+ end
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'speechmatics/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "speechmatics"
8
+ spec.version = Speechmatics::VERSION
9
+ spec.authors = ["Andrew Kuklewicz"]
10
+ spec.email = ["andrew@beginsinwonder.com"]
11
+ spec.description = %q{Ruby client for Speechmatics API: https://speechmatics.com/api-details}
12
+ spec.summary = %q{Ruby client for Speechmatics API: https://speechmatics.com/api-details}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency('faraday')
22
+ spec.add_runtime_dependency('faraday_middleware')
23
+ spec.add_runtime_dependency('multi_json')
24
+ spec.add_runtime_dependency('excon')
25
+ spec.add_runtime_dependency('hashie')
26
+ spec.add_runtime_dependency('activesupport')
27
+ spec.add_runtime_dependency('ruby-filemagic', '~> 0.6.0')
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.3"
30
+ spec.add_development_dependency "rake"
31
+
32
+ spec.add_development_dependency('minitest')
33
+ spec.add_development_dependency('simplecov')
34
+ spec.add_development_dependency('webmock')
35
+ end
data/test/api_test.rb ADDED
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
4
+
5
+ # create dummy class based on the API
6
+ class TestApi < ::Speechmatics::API
7
+ end
8
+
9
+ describe Speechmatics::API do
10
+
11
+ before {
12
+ @speechmatics_user_id = ENV['SPEECHMATICS_USER_ID'] || 1
13
+ @speechmatics_auth_token = ENV['SPEECHMATICS_API_KEY'] || "thisisatestkeyonly"
14
+ }
15
+
16
+ it "is initialized with defaults" do
17
+ oc = TestApi.new
18
+ oc.current_options.wont_be_nil
19
+ oc.current_options.must_equal HashWithIndifferentAccess.new(Speechmatics.options)
20
+ end
21
+
22
+ it "is initialized with specific values" do
23
+ oc = TestApi.new(auth_token: @speechmatics_auth_token, user_id: @speechmatics_user_id)
24
+ oc.current_options.wont_be_nil
25
+ oc.current_options.wont_equal Speechmatics.options
26
+
27
+ oc.current_options[:auth_token].must_equal @speechmatics_auth_token
28
+ oc.auth_token.must_equal @speechmatics_auth_token
29
+
30
+ oc.current_options[:user_id].must_equal @speechmatics_user_id
31
+ oc.user_id.must_equal @speechmatics_user_id
32
+ end
33
+
34
+ end
35
+
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
4
+
5
+ describe Speechmatics::Client do
6
+
7
+ it "returns a user api object" do
8
+ client = Speechmatics::Client.new
9
+ client.user.wont_be_nil
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'simplecov'
4
+ SimpleCov.command_name 'Unit Tests'
5
+ SimpleCov.start
6
+
7
+ require 'minitest'
8
+ require 'minitest/autorun'
9
+ require 'minitest/spec'
10
+ require 'webmock/minitest'
11
+
12
+ require 'speechmatics'
@@ -0,0 +1,111 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
4
+
5
+ describe Speechmatics::Client do
6
+
7
+ let(:new_job) {
8
+ {
9
+ balance: 90,
10
+ cost: 0.50,
11
+ id: 2
12
+ }
13
+ }
14
+
15
+ let(:list_jobs) {
16
+ {
17
+ "jobs" => [
18
+ {
19
+ "created_at" => "Wed, 04 Dec 2013 16:00:47 GMT",
20
+ "duration" => 244,
21
+ "id" => 2,
22
+ "lang" => "en-US",
23
+ "name" => "test.mp3",
24
+ "next_check" => 0,
25
+ "notification" => "email",
26
+ "size" => 1955132,
27
+ "transcription" => "test.json",
28
+ "job_status" => "done",
29
+ "url" => "/user/1/jobs/2/audio"
30
+ },
31
+ {
32
+ "created_at" => "Wed, 04 Dec 2013 16:08:33 GMT",
33
+ "duration" => 244,
34
+ "id" => 12,
35
+ "lang" => "en-GB",
36
+ "name" => "second-test.mp3",
37
+ "next_check" => 1389966796,
38
+ "notification" => "email",
39
+ "size" => 6475938,
40
+ "transcription" => nil,
41
+ "job_status" => "transcribing",
42
+ "url" => "/user/1/jobs/12/audio"
43
+ }
44
+ ]
45
+ }
46
+ }
47
+
48
+ let(:transcript) {
49
+ {
50
+ "speakers" => [
51
+ {
52
+ "duration" => "1.270",
53
+ "name" => "M1",
54
+ "time" => "0.590"
55
+ }
56
+ ],
57
+ "words" => [
58
+ {
59
+ "duration" => "0.230",
60
+ "name" => "Hello",
61
+ "time" => "0.590"
62
+ },
63
+ {
64
+ "duration" => "0.070",
65
+ "name" => "World",
66
+ "time" => "0.960"
67
+ },
68
+ {
69
+ "duration" => "0.000",
70
+ "name" => ".",
71
+ "time" => "1.270"
72
+ }
73
+ ]
74
+ }
75
+ }
76
+
77
+ let(:stubs) {
78
+ Faraday::Adapter::Test::Stubs.new do |stub|
79
+ stub.get('/v1.0/user/1/jobs/?auth_token=token') { [200, {}, list_jobs.to_json] }
80
+ stub.post('/v1.0/user/1/jobs/?auth_token=token') { [200, {}, new_job.to_json] }
81
+ stub.get('/v1.0/user/1/jobs/1/transcript?auth_token=token') { [200, {}, transcript.to_json] }
82
+ end
83
+ }
84
+
85
+ let(:jobs) {
86
+ Speechmatics::User::Jobs.new(
87
+ user_id: 1,
88
+ auth_token: 'token',
89
+ adapter: [:test, stubs])
90
+ }
91
+
92
+ it "lists jobs" do
93
+ jl = jobs.list
94
+ jl.objects.count.must_equal 2
95
+ jl.jobs.count.must_equal 2
96
+ end
97
+
98
+ it "creates job" do
99
+ r = jobs.create(data_file: File.expand_path(File.dirname(__FILE__) + '/../zero.wav'))
100
+ r.id.must_equal 2
101
+ r.cost.must_equal 0.50
102
+ r.balance.must_equal 90
103
+ end
104
+
105
+ it "gets transcript" do
106
+ t = jobs.transcript(job_id: 1)
107
+ t.speakers.count.must_equal 1
108
+ t.words.count.must_equal 3
109
+ end
110
+
111
+ end
data/test/user_test.rb ADDED
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/test_helper')
4
+
5
+ describe Speechmatics::Client do
6
+
7
+ let(:response) {
8
+ {
9
+ user: {
10
+ balance: 90,
11
+ email: "demo@speechmatics.com",
12
+ id: 1
13
+ }
14
+ }
15
+ }
16
+
17
+ let(:stubs) {
18
+ Faraday::Adapter::Test::Stubs.new do |stub|
19
+ stub.get('/v1.0/user/1/?auth_token=token') { [200, {}, response.to_json] }
20
+ end
21
+ }
22
+
23
+ let(:user) {
24
+ Speechmatics::User.new(
25
+ user_id: 1,
26
+ auth_token: 'token',
27
+ adapter: [:test, stubs])
28
+ }
29
+
30
+ it "user can request profile" do
31
+ u = user.get
32
+ u.balance.must_equal 90
33
+ u.email.must_equal "demo@speechmatics.com"
34
+ u.id.must_equal 1
35
+ end
36
+
37
+ end
data/test/zero.wav ADDED
Binary file
metadata ADDED
@@ -0,0 +1,241 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: speechmatics
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Andrew Kuklewicz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-07-21 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'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
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'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: multi_json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: excon
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: hashie
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: ruby-filemagic
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 0.6.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.6.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: minitest
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: webmock
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: 'Ruby client for Speechmatics API: https://speechmatics.com/api-details'
182
+ email:
183
+ - andrew@beginsinwonder.com
184
+ executables: []
185
+ extensions: []
186
+ extra_rdoc_files: []
187
+ files:
188
+ - .gitignore
189
+ - Gemfile
190
+ - LICENSE
191
+ - README.md
192
+ - Rakefile
193
+ - lib/speechmatics.rb
194
+ - lib/speechmatics/api.rb
195
+ - lib/speechmatics/api_factory.rb
196
+ - lib/speechmatics/client.rb
197
+ - lib/speechmatics/configuration.rb
198
+ - lib/speechmatics/connection.rb
199
+ - lib/speechmatics/resource.rb
200
+ - lib/speechmatics/response.rb
201
+ - lib/speechmatics/user.rb
202
+ - lib/speechmatics/user/jobs.rb
203
+ - lib/speechmatics/version.rb
204
+ - speechmatics.gemspec
205
+ - test/api_test.rb
206
+ - test/client_test.rb
207
+ - test/test_helper.rb
208
+ - test/user/jobs_test.rb
209
+ - test/user_test.rb
210
+ - test/zero.wav
211
+ homepage: ''
212
+ licenses:
213
+ - MIT
214
+ metadata: {}
215
+ post_install_message:
216
+ rdoc_options: []
217
+ require_paths:
218
+ - lib
219
+ required_ruby_version: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - '>='
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ required_rubygems_version: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - '>='
227
+ - !ruby/object:Gem::Version
228
+ version: '0'
229
+ requirements: []
230
+ rubyforge_project:
231
+ rubygems_version: 2.1.11
232
+ signing_key:
233
+ specification_version: 4
234
+ summary: 'Ruby client for Speechmatics API: https://speechmatics.com/api-details'
235
+ test_files:
236
+ - test/api_test.rb
237
+ - test/client_test.rb
238
+ - test/test_helper.rb
239
+ - test/user/jobs_test.rb
240
+ - test/user_test.rb
241
+ - test/zero.wav