piston_api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source :rubygems
2
+
3
+ gem 'signed_request'
4
+ gem 'monster_mash', '>= 0.2.0'
5
+ gem 'json'
6
+
7
+ group :test do
8
+ gem 'rspec', '1.3.1'
9
+ gem 'vcr', '>= 1.3.0'
10
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 David Balatero
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,17 @@
1
+ = piston_api
2
+
3
+ Description goes here.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
+ * Send me a pull request. Bonus points for topic branches.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 David Balatero. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "piston_api"
8
+ gem.summary = %Q{Provides a Ruby interface to the MediaPiston API.}
9
+ gem.description = %Q{Provides a Ruby interface to the MediaPiston API.}
10
+ gem.email = "david@mediapiston.com"
11
+ gem.homepage = "http://github.com/mediapiston/piston_api"
12
+ gem.authors = ["David Balatero"]
13
+ gem.add_dependency "monster_mash", ">= 0.2.0"
14
+ gem.add_dependency "signed_request"
15
+ gem.add_dependency 'json'
16
+ gem.add_development_dependency "rspec", ">= 1.3.1"
17
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
+ end
19
+ Jeweler::GemcutterTasks.new
20
+ rescue LoadError
21
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
22
+ end
23
+
24
+ require 'spec/rake/spectask'
25
+ Spec::Rake::SpecTask.new(:spec) do |spec|
26
+ spec.libs << 'lib' << 'spec'
27
+ spec.spec_files = FileList['spec/**/*_spec.rb']
28
+ end
29
+
30
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
31
+ spec.libs << 'lib' << 'spec'
32
+ spec.pattern = 'spec/**/*_spec.rb'
33
+ spec.rcov = true
34
+ end
35
+
36
+ task :spec => :check_dependencies
37
+
38
+ task :default => :spec
39
+
40
+ require 'rake/rdoctask'
41
+ Rake::RDocTask.new do |rdoc|
42
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
43
+
44
+ rdoc.rdoc_dir = 'rdoc'
45
+ rdoc.title = "piston_api #{version}"
46
+ rdoc.rdoc_files.include('README*')
47
+ rdoc.rdoc_files.include('lib/**/*.rb')
48
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,30 @@
1
+ require '../lib/piston_api'
2
+
3
+ PistonApi.sandbox = true
4
+ PistonApi.api_key = 'a688c8abd25fd37e50e8512e75aebbe2d869510368a58f66b6f9f00ed8de'
5
+ PistonApi.private_key = '65469e402f88852f338c79f8e8171ebaf2f6d5a28879799ea9a17c8a6b67'
6
+
7
+
8
+ result = PistonApi::Client.create_batch(
9
+ {
10
+ 'batch' => {
11
+ 'name' => "Character Guides for 'The Simpsons'",
12
+ 'minimum_words' => 250,
13
+ 'topic_overview_instructions' => "Write a short blurb of at least 250-words that describes the given character.",
14
+ 'style_tone_instructions' => "Make it fun to read! Focus on the fictional character in the TV show.",
15
+ 'structure_format_instructions' => "Describe the character's role and personality. Talk about the evolution of the character through the various seasons, or any highlights from the given seasons. As well, mention any important scenes, episodes, or other trivia of relevance about the character.",
16
+ 'content_keywords_instructions' => "Include a quote from the character.",
17
+ 'detail_research_instructions' => "For an example of good writing, please see http://goodwriting.com",
18
+ 'articles' => [
19
+ { :topic => 'Homer Simpson Character Guide', :metadata => "{ show_id: 1, character_id: 5432 }" },
20
+ { :topic => 'Milhouse Character Guide', :metadata => "{ show_id: 1, character_id: 432165 }" },
21
+ { :topic => 'Bart Simpson Character Guide', :metadata => "{ show_id: 1, character_id: 939921 }" },
22
+ { :topic => 'Principal Skinner Character Guide', :metadata => "{ show_id: 1, character_id: 1432 }" }
23
+ ]
24
+ }
25
+ }
26
+ )
27
+
28
+ puts "Got back result!"
29
+ puts "-----------------"
30
+ puts result.inspect
data/lib/piston_api.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'signed_request'
2
+ require 'monster_mash'
3
+ require 'json'
4
+
5
+ module PistonApi
6
+ VERSION = File.read(File.dirname(__FILE__) + '/../VERSION').chomp
7
+
8
+ class << self
9
+ attr_accessor :api_key
10
+ attr_accessor :private_key
11
+ attr_accessor :sandbox
12
+ alias :sandbox? :sandbox
13
+ end
14
+ self.sandbox = false
15
+ end
16
+
17
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
18
+ require 'piston_api/client'
@@ -0,0 +1,30 @@
1
+ module PistonApi
2
+ class Client < MonsterMash::Base
3
+ defaults do
4
+ user_agent "MediaPiston API Ruby Client"
5
+ end
6
+
7
+ post :create_batch do |json|
8
+ uri uri_for('/api/v1/batches')
9
+ params sign_params(
10
+ '/api/v1/batches',
11
+ PistonApi.private_key,
12
+ :order_data => json.to_json,
13
+ :api_key => PistonApi.api_key
14
+ )
15
+
16
+ handler do |response|
17
+ JSON.parse(response.body)
18
+ end
19
+ end
20
+
21
+ def self.uri_for(path)
22
+ (PistonApi.sandbox ? 'http://sandbox.mediapiston.com' : 'http://mediapiston.com') << path
23
+ end
24
+
25
+ def self.sign_params(path, api_key, params)
26
+ params[:signature] = SignedRequest.sign(params, api_key, :path => path)
27
+ params
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,72 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{piston_api}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["David Balatero"]
12
+ s.date = %q{2010-11-30}
13
+ s.description = %q{Provides a Ruby interface to the MediaPiston API.}
14
+ s.email = %q{david@mediapiston.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "Gemfile",
23
+ "LICENSE",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "examples/create_batch.rb",
28
+ "lib/piston_api.rb",
29
+ "lib/piston_api/client.rb",
30
+ "piston_api.gemspec",
31
+ "spec/fixtures/vcr_cassettes/create_batch/basic.yml",
32
+ "spec/fixtures/vcr_cassettes/create_batch/errors.yml",
33
+ "spec/piston_api/client_spec.rb",
34
+ "spec/piston_api_spec.rb",
35
+ "spec/spec.opts",
36
+ "spec/spec_helper.rb"
37
+ ]
38
+ s.homepage = %q{http://github.com/mediapiston/piston_api}
39
+ s.rdoc_options = ["--charset=UTF-8"]
40
+ s.require_paths = ["lib"]
41
+ s.rubygems_version = %q{1.3.7}
42
+ s.summary = %q{Provides a Ruby interface to the MediaPiston API.}
43
+ s.test_files = [
44
+ "spec/piston_api/client_spec.rb",
45
+ "spec/piston_api_spec.rb",
46
+ "spec/spec_helper.rb",
47
+ "examples/create_batch.rb"
48
+ ]
49
+
50
+ if s.respond_to? :specification_version then
51
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
52
+ s.specification_version = 3
53
+
54
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
+ s.add_runtime_dependency(%q<monster_mash>, [">= 0.2.0"])
56
+ s.add_runtime_dependency(%q<signed_request>, [">= 0"])
57
+ s.add_runtime_dependency(%q<json>, [">= 0"])
58
+ s.add_development_dependency(%q<rspec>, [">= 1.3.1"])
59
+ else
60
+ s.add_dependency(%q<monster_mash>, [">= 0.2.0"])
61
+ s.add_dependency(%q<signed_request>, [">= 0"])
62
+ s.add_dependency(%q<json>, [">= 0"])
63
+ s.add_dependency(%q<rspec>, [">= 1.3.1"])
64
+ end
65
+ else
66
+ s.add_dependency(%q<monster_mash>, [">= 0.2.0"])
67
+ s.add_dependency(%q<signed_request>, [">= 0"])
68
+ s.add_dependency(%q<json>, [">= 0"])
69
+ s.add_dependency(%q<rspec>, [">= 1.3.1"])
70
+ end
71
+ end
72
+
@@ -0,0 +1,48 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: http://sandbox.mediapiston.com:80/api/v1/batches
6
+ body:
7
+ headers:
8
+ user-agent:
9
+ - MediaPiston API Client v0.0.0
10
+ response: !ruby/struct:VCR::Response
11
+ status: !ruby/struct:VCR::ResponseStatus
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ etag:
16
+ - "\"6b5916d9534bf8744512cada5aa59145\""
17
+ content-type:
18
+ - application/json; charset=utf-8
19
+ connection:
20
+ - keep-alive
21
+ x-runtime:
22
+ - "9"
23
+ date:
24
+ - Tue, 30 Nov 2010 19:59:32 GMT
25
+ server:
26
+ - nginx/0.7.67
27
+ content-length:
28
+ - "44"
29
+ cache-control:
30
+ - private, max-age=0, must-revalidate
31
+ body: "{\"batch_id\":1234567890,\"articles_created\":3}"
32
+ http_version: "1.1"
33
+ - !ruby/struct:VCR::HTTPInteraction
34
+ request: !ruby/struct:VCR::Request
35
+ method: :post
36
+ uri: http://localhost:3000/api/v1/batches
37
+ body:
38
+ headers:
39
+ user-agent:
40
+ - MediaPiston API Ruby Client
41
+ response: !ruby/struct:VCR::Response
42
+ status: !ruby/struct:VCR::ResponseStatus
43
+ code: 0
44
+ message:
45
+ headers: {}
46
+
47
+ body: ""
48
+ http_version:
@@ -0,0 +1,46 @@
1
+ ---
2
+ - !ruby/struct:VCR::HTTPInteraction
3
+ request: !ruby/struct:VCR::Request
4
+ method: :post
5
+ uri: http://sandbox.mediapiston.com:80/api/v1/batches
6
+ body:
7
+ headers:
8
+ user-agent:
9
+ - MediaPiston API Ruby Client
10
+ response: !ruby/struct:VCR::Response
11
+ status: !ruby/struct:VCR::ResponseStatus
12
+ code: 400
13
+ message: Bad Request
14
+ headers:
15
+ content-type:
16
+ - application/json; charset=utf-8
17
+ connection:
18
+ - keep-alive
19
+ x-runtime:
20
+ - "4"
21
+ date:
22
+ - Tue, 30 Nov 2010 20:02:45 GMT
23
+ server:
24
+ - nginx/0.7.67
25
+ content-length:
26
+ - "128"
27
+ cache-control:
28
+ - no-cache
29
+ body: "{\"error\":{\"type\":\"InvalidRequest\",\"messages\":[{\"message\":\"Please enter some article titles.\",\"field\":\"order_data.batch.base\"}]}}"
30
+ http_version: "1.1"
31
+ - !ruby/struct:VCR::HTTPInteraction
32
+ request: !ruby/struct:VCR::Request
33
+ method: :post
34
+ uri: http://localhost:3000/api/v1/batches
35
+ body:
36
+ headers:
37
+ user-agent:
38
+ - MediaPiston API Ruby Client
39
+ response: !ruby/struct:VCR::Response
40
+ status: !ruby/struct:VCR::ResponseStatus
41
+ code: 0
42
+ message:
43
+ headers: {}
44
+
45
+ body: ""
46
+ http_version:
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ def mock_batch(articles)
4
+ {
5
+ 'batch' => {
6
+ 'name' => 'Mock Batch',
7
+ 'minimum_words' => 250,
8
+ 'topic_overview_instructions' => 'Basic instructions.',
9
+ 'articles' => articles
10
+ }
11
+ }
12
+ end
13
+
14
+ def mock_article(topic, options = {})
15
+ article = {
16
+ 'topic' => topic,
17
+ 'metadata' => 'my metadata'
18
+ }
19
+
20
+ if options[:key_phrases]
21
+ article['key_phrases'] = [
22
+ { 'text' => 'savings', 'minimum' => 1 },
23
+ { 'text' => 'keyword', 'maximum' => 5 }
24
+ ]
25
+ end
26
+
27
+ article
28
+ end
29
+
30
+ describe PistonApi::Client do
31
+ describe "#create_batch" do
32
+ describe "a basic batch" do
33
+ before(:all) do
34
+ @articles = []
35
+ 3.times { |i| @articles << mock_article("Article #{i}") }
36
+ @batch = mock_batch(@articles)
37
+ end
38
+
39
+ use_vcr_cassette 'create_batch/basic', :record => :new_episodes
40
+
41
+ it "should post correctly" do
42
+ result = PistonApi::Client.create_batch(@batch)
43
+ result['articles_created'].should == 3
44
+ end
45
+ end
46
+
47
+ describe "a batch with key phrases" do
48
+ use_vcr_cassette 'create_batch/key_phrases', :record => :new_episodes
49
+
50
+ before(:all) do
51
+ @articles = []
52
+ 3.times { |i| @articles << mock_article("Article #{i}",
53
+ :key_phrases => true) }
54
+ @batch = mock_batch(@articles)
55
+ end
56
+
57
+ it "should create 3 articles" do
58
+ pending "deploy of new key phrases feature"
59
+ result = PistonApi::Client.create_batch(@batch)
60
+ result['articles_created'].should == 3
61
+ end
62
+ end
63
+
64
+ describe "a batch with errors" do
65
+ use_vcr_cassette 'create_batch/errors', :record => :new_episodes
66
+
67
+ it "should raise an error with no articles" do
68
+ batch = mock_batch([])
69
+ lambda {
70
+ PistonApi::Client.create_batch(batch)
71
+ }.should raise_error
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe PistonApi do
4
+ describe "VERSION" do
5
+ it "should not be blank" do
6
+ PistonApi::VERSION.should_not be_nil
7
+ end
8
+ end
9
+
10
+ describe "#api_key" do
11
+ it "should be settable" do
12
+ PistonApi.api_key = 'fdsafdsa'
13
+ end
14
+
15
+ it "should be gettable" do
16
+ PistonApi.api_key = 'fdsafdsa'
17
+ PistonApi.api_key.should == 'fdsafdsa'
18
+ end
19
+ end
20
+
21
+ describe "#sandbox" do
22
+ it "should be settable" do
23
+ PistonApi.sandbox = true
24
+ PistonApi.sandbox?.should be_true
25
+ end
26
+ end
27
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,19 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'piston_api'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+ require 'vcr'
7
+
8
+ PistonApi.sandbox = true
9
+ PistonApi.api_key = 'a688c8abd25fd37e50e8512e75aebbe2d869510368a58f66b6f9f00ed8de'
10
+ PistonApi.private_key = '65469e402f88852f338c79f8e8171ebaf2f6d5a28879799ea9a17c8a6b67'
11
+
12
+ VCR.config do |c|
13
+ c.cassette_library_dir = File.dirname(__FILE__) + "/fixtures/vcr_cassettes"
14
+ c.stub_with :typhoeus
15
+ end
16
+
17
+ Spec::Runner.configure do |config|
18
+ config.extend VCR::RSpec::Macros
19
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: piston_api
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - David Balatero
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-30 00:00:00 -08:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: monster_mash
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 23
30
+ segments:
31
+ - 0
32
+ - 2
33
+ - 0
34
+ version: 0.2.0
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: signed_request
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: json
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rspec
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 25
74
+ segments:
75
+ - 1
76
+ - 3
77
+ - 1
78
+ version: 1.3.1
79
+ type: :development
80
+ version_requirements: *id004
81
+ description: Provides a Ruby interface to the MediaPiston API.
82
+ email: david@mediapiston.com
83
+ executables: []
84
+
85
+ extensions: []
86
+
87
+ extra_rdoc_files:
88
+ - LICENSE
89
+ - README.rdoc
90
+ files:
91
+ - .document
92
+ - .gitignore
93
+ - Gemfile
94
+ - LICENSE
95
+ - README.rdoc
96
+ - Rakefile
97
+ - VERSION
98
+ - examples/create_batch.rb
99
+ - lib/piston_api.rb
100
+ - lib/piston_api/client.rb
101
+ - piston_api.gemspec
102
+ - spec/fixtures/vcr_cassettes/create_batch/basic.yml
103
+ - spec/fixtures/vcr_cassettes/create_batch/errors.yml
104
+ - spec/piston_api/client_spec.rb
105
+ - spec/piston_api_spec.rb
106
+ - spec/spec.opts
107
+ - spec/spec_helper.rb
108
+ has_rdoc: true
109
+ homepage: http://github.com/mediapiston/piston_api
110
+ licenses: []
111
+
112
+ post_install_message:
113
+ rdoc_options:
114
+ - --charset=UTF-8
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ hash: 3
123
+ segments:
124
+ - 0
125
+ version: "0"
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ hash: 3
132
+ segments:
133
+ - 0
134
+ version: "0"
135
+ requirements: []
136
+
137
+ rubyforge_project:
138
+ rubygems_version: 1.3.7
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: Provides a Ruby interface to the MediaPiston API.
142
+ test_files:
143
+ - spec/piston_api/client_spec.rb
144
+ - spec/piston_api_spec.rb
145
+ - spec/spec_helper.rb
146
+ - examples/create_batch.rb