gisture 0.0.3 → 0.0.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cd3a20fe2d04688228edbaa5cf0b7ea1fdc9ad66
4
- data.tar.gz: 79062e1a7cfeb4c58a1add028f90195d987fb953
3
+ metadata.gz: 204135cbcc13305754d2b3a0558222ec220eae6b
4
+ data.tar.gz: 068ea799d72c1678747b1cef3a7c93a48a2ebd5d
5
5
  SHA512:
6
- metadata.gz: 1a9ed38b608e1f52182cf2a23ab18f301eb80d70de804f9b8de1716bb4c057f3a8b884c8ce4704da69aa5e836704f38091f69af728c399d269a38616aaca96dc
7
- data.tar.gz: bfcaf28ea0329a488fc232785980c3cf14eb90fa1999b5722bc6bc6adbfa17f31024dade585a453addde02f4c7e12398fa0f49003560fa4c1eaf91ee4dcfc78b
6
+ metadata.gz: b53b53175b706be880fae8e9e32609edae8909bcc6dc3d3076a698c1f6e05b3463402ce7958fcc578f5bd48e9830a386d666546f60643f8424a52788c83263b0
7
+ data.tar.gz: 2e8a7e5565c63d09cb28ec6df0e229c399f0836b33a5a7c14f2286509e57adde000845d35947ed6183fec3e80b6476d07147ccf99f5ea51e5d9609d3b2eed435
@@ -1,12 +1,16 @@
1
1
  module Gisture
2
2
  class Evaluator
3
- attr_reader :raw
3
+ attr_reader :raw, :result
4
+
5
+ def evaluate
6
+ instance_eval { @result = eval raw }
7
+ end
4
8
 
5
9
  protected
6
10
 
7
11
  def initialize(raw)
8
- @raw = raw
9
- instance_eval { eval raw }
12
+ @raw = raw.to_s
13
+ evaluate
10
14
  end
11
15
  end
12
16
  end
data/lib/gisture/gist.rb CHANGED
@@ -2,12 +2,14 @@ require 'tempfile'
2
2
 
3
3
  module Gisture
4
4
  class Gist
5
- attr_reader :filename, :gist_id, :strategy
5
+ attr_reader :filename, :gist_id, :strategy, :version
6
6
 
7
7
  STRATEGIES = [:eval, :load, :require]
8
+ GIST_URL_REGEX = /\Ahttp.+([0-9a-f]{20,20})\/?\Z/
9
+ GIST_URL_WITH_VERSION_REGEX = /\Ahttp.+([0-9a-f]{20,20})\/([0-9a-f]{40,40})\/?\Z/
8
10
 
9
- def self.run!(gist_id: nil, strategy: nil, filename: nil, version: nil, &block)
10
- new(gist_id: gist_id, strategy: strategy, filename: filename, version: version).run!(&block)
11
+ def self.run!(gist, strategy: nil, filename: nil, version: nil, &block)
12
+ new(gist, strategy: strategy, filename: filename, version: version).run!(&block)
11
13
  end
12
14
 
13
15
  def run!(&block)
@@ -34,7 +36,7 @@ module Gisture
34
36
 
35
37
  def github
36
38
  @github ||= begin
37
- github_config = Gisture::GITHUB_CONFIG_OPTS.map { |key| [key, Gisture.configuration.send(key)] }.to_h
39
+ github_config = Hash[Gisture::GITHUB_CONFIG_OPTS.map { |key| [key, Gisture.configuration.send(key)] }]
38
40
  Github.new(github_config)
39
41
  end
40
42
  end
@@ -85,23 +87,42 @@ module Gisture
85
87
 
86
88
  def to_h
87
89
  { gist_id: gist_id,
90
+ version: version,
88
91
  strategy: strategy,
89
92
  filename: filename }
90
93
  end
91
94
 
92
95
  protected
93
96
 
94
- def initialize(gist_id: nil, strategy: nil, filename: nil, version: nil)
95
- raise ArgumentError, "Invalid gist_id" if gist_id.nil?
96
- @gist_id = gist_id
97
- @filename = filename
98
- @version = version
97
+ def initialize(gist, strategy: nil, filename: nil, version: nil)
99
98
  self.strategy = strategy || :eval
99
+ @filename = filename
100
+
101
+ if gist.match(/[^a-f0-9]+/i) # non-hex chars, probably a URL
102
+ @gist_id, @version = parse_gist_url(gist)
103
+ @version = version unless version.nil?
104
+ else
105
+ @gist_id = gist
106
+ @version = version
107
+ end
108
+
100
109
  end
101
110
 
102
111
  def unlink_tempfile
103
112
  tempfile.unlink
104
113
  @tempfile = nil
105
114
  end
115
+
116
+ def parse_gist_url(gist_url)
117
+ case gist_url.to_s
118
+ when GIST_URL_WITH_VERSION_REGEX
119
+ matches = gist_url.match(GIST_URL_WITH_VERSION_REGEX)
120
+ return [matches[1], matches[2]]
121
+ when GIST_URL_REGEX
122
+ return [gist_url.match(GIST_URL_REGEX)[1], nil]
123
+ else
124
+ raise ArgumentError, "Invalid argument: #{gist_url} is not a valid gist URL."
125
+ end
126
+ end
106
127
  end
107
128
  end
@@ -1,3 +1,3 @@
1
1
  module Gisture
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.5'
3
3
  end
data/lib/gisture.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'canfig'
2
2
  require 'github_api'
3
+ require 'gisture/github_api/client/gists'
3
4
  require 'gisture/version'
4
5
  require 'gisture/evaluator'
5
6
  require 'gisture/gist'
@@ -22,11 +23,11 @@ module Gisture
22
23
  config.tmpdir = Dir.tmpdir # location to store gist tempfiles
23
24
  end
24
25
 
25
- def self.new(gist_id, strategy=nil, filename=nil, version=nil)
26
- Gisture::Gist.new(gist_id: gist_id, strategy: strategy, filename: filename, version: version)
26
+ def self.new(gist, strategy: nil, filename: nil, version: nil)
27
+ Gisture::Gist.new(gist, strategy: strategy, filename: filename, version: version)
27
28
  end
28
29
 
29
- def self.run(gist_id, strategy=nil, filename=nil, version=nil, &block)
30
- new(gist_id, strategy, filename, version).run!(&block)
30
+ def self.run(gist, strategy: nil, filename: nil, version: nil, &block)
31
+ new(gist, strategy, filename, version).run!(&block)
31
32
  end
32
33
  end
@@ -2,8 +2,8 @@ require 'gisture'
2
2
 
3
3
  namespace 'gisture' do
4
4
  desc 'Run a github gist in a rake task'
5
- task :run, [:gist_id, :strategy, :filename, :runner] => :environment do |t,args|
5
+ task :run, [:gist_id, :strategy, :filename, :version, :runner] => :environment do |t,args|
6
6
  runner = Proc.new { eval(args.runner.to_s) }
7
- Gisture.run(args.gist_id, args.strategy, args.filename, &runner)
7
+ Gisture.run(args.gist_id, strategy: args.strategy, filename: args.filename, version: args.version, &runner)
8
8
  end
9
9
  end
@@ -1,4 +1,27 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  RSpec.describe Gisture::Evaluator do
4
+ it "requires a string to be eval'd" do
5
+ expect { Gisture::Evaluator.new }.to raise_exception(ArgumentError)
6
+ end
7
+
8
+ it "converts raw input to a string" do
9
+ expect { Gisture::Evaluator.new(nil) }.to_not raise_exception
10
+ end
11
+
12
+ describe "#raw" do
13
+ subject { Gisture::Evaluator.new("1+1") }
14
+
15
+ it "stores the raw string passed on init" do
16
+ expect(subject.raw).to eql("1+1")
17
+ end
18
+ end
19
+
20
+ describe "#result" do
21
+ subject { Gisture::Evaluator.new("1+1") }
22
+
23
+ it "stores the result returned by evaluating the block" do
24
+ expect(subject.result).to eql(2)
25
+ end
26
+ end
4
27
  end
@@ -1,4 +1,194 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
+
3
+ TEST_GIST_ID = "520b474ea0248d1a0a74"
4
+ TEST_GIST_URL = "https://gist.github.com/markrebec/520b474ea0248d1a0a74"
5
+ TEST_GIST_VERSION = "49a9d887eeb8c723ab23deddfbbb75d4b70e8014"
6
+ TEST_GIST_VERSION_URL = "https://gist.github.com/markrebec/520b474ea0248d1a0a74/49a9d887eeb8c723ab23deddfbbb75d4b70e8014"
7
+ TEST_GIST_FILENAME = "test.rb"
8
+ MULTI_FILE_TEST_GIST_ID = "0417bf78a7c2b825b4ef"
9
+ MULTI_FILE_TEST_GIST_FILENAMES = ['file_one.rb', 'file_two.rb']
2
10
 
3
11
  RSpec.describe Gisture::Gist do
12
+ context "when passing a gist ID" do
13
+ it "sets the gist ID as the gist_id" do
14
+ expect(Gisture::Gist.new(TEST_GIST_ID).gist_id).to eql(TEST_GIST_ID)
15
+ end
16
+
17
+ context "when passing a version" do
18
+ it "sets the version" do
19
+ expect(Gisture::Gist.new(TEST_GIST_ID, version: TEST_GIST_VERSION).version).to eql(TEST_GIST_VERSION)
20
+ end
21
+ end
22
+ end
23
+
24
+ context "when passing a gist URL" do
25
+ context "without a version" do
26
+ it "extracts and sets the gist ID as the gist_id" do
27
+ expect(Gisture::Gist.new(TEST_GIST_URL).gist_id).to eql(TEST_GIST_ID)
28
+ end
29
+
30
+ context "when passing a version separately" do
31
+ it "sets the version" do
32
+ expect(Gisture::Gist.new(TEST_GIST_URL, version: TEST_GIST_VERSION).version).to eql(TEST_GIST_VERSION)
33
+ end
34
+ end
35
+ end
36
+
37
+ context "with a version" do
38
+ it "extracts and sets the gist ID as the gist_id" do
39
+ expect(Gisture::Gist.new(TEST_GIST_VERSION_URL).gist_id).to eql(TEST_GIST_ID)
40
+ end
41
+
42
+ it "extracts and sets the gist version as the version" do
43
+ expect(Gisture::Gist.new(TEST_GIST_VERSION_URL).version).to eql(TEST_GIST_VERSION)
44
+ end
45
+
46
+ context "when passing a version separately" do
47
+ it "overrides the version with the one explicitly provided" do
48
+ expect(Gisture::Gist.new(TEST_GIST_VERSION_URL, version: "abc123").version).to eql("abc123")
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ context "when passing a filename" do
55
+ it "sets the filename" do
56
+ expect(Gisture::Gist.new(TEST_GIST_ID, filename: TEST_GIST_FILENAME).filename).to eql(TEST_GIST_FILENAME)
57
+ end
58
+ end
59
+
60
+ context "when passing a strategy" do
61
+ context "which is a valid strategy" do
62
+ it "sets the requested strategy" do
63
+ expect(Gisture::Gist.new(TEST_GIST_ID, strategy: :load).strategy).to eql(:load)
64
+ end
65
+ end
66
+
67
+ context "which is not a valid strategy" do
68
+ it "raises an ArgumentError" do
69
+ expect { Gisture::Gist.new(TEST_GIST_ID, strategy: :foo) }.to raise_exception(ArgumentError)
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "#github" do
75
+ subject { Gisture::Gist.new(TEST_GIST_ID) }
76
+
77
+ it "is a github_api client object" do
78
+ expect(subject.github).to be_a(Github::Client)
79
+ end
80
+ end
81
+
82
+ describe "#gist" do
83
+ subject { Gisture::Gist.new(TEST_GIST_ID) }
84
+
85
+ it "is the gist that was requested" do
86
+ expect(subject.gist.id).to eql(TEST_GIST_ID)
87
+ end
88
+ end
89
+
90
+ describe "#gist_file" do
91
+ it "returns an array" do
92
+ expect(Gisture::Gist.new(TEST_GIST_ID).gist_file).to be_a(Array)
93
+ end
94
+
95
+ it "contains the filename and file object" do
96
+ gist = Gisture::Gist.new(TEST_GIST_ID)
97
+ expect(gist.gist_file[0]).to eql(TEST_GIST_FILENAME)
98
+ expect(gist.gist_file[1]).to be_a(Hashie::Mash)
99
+ end
100
+
101
+ context "when a gist contains a single file" do
102
+ it "returns the file" do
103
+ expect(Gisture::Gist.new(TEST_GIST_ID).gist_file[0]).to eql(TEST_GIST_FILENAME)
104
+ end
105
+ end
106
+
107
+ context "when a gist contains more than one file" do
108
+ context "and a filename is present" do
109
+ subject { Gisture::Gist.new(MULTI_FILE_TEST_GIST_ID, filename: MULTI_FILE_TEST_GIST_FILENAMES.sample) }
110
+
111
+ it "returns the specified file" do
112
+ expect(subject.gist_file[0]).to eql(subject.filename)
113
+ end
114
+ end
115
+
116
+ context "and no filename is present" do
117
+ subject { Gisture::Gist.new(MULTI_FILE_TEST_GIST_ID) }
118
+
119
+ it "raises an ArgumentError" do
120
+ expect { subject.gist_file }.to raise_exception(ArgumentError)
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ describe "#raw" do
127
+ subject { Gisture::Gist.new(TEST_GIST_ID) }
128
+
129
+ it "returns the raw gist content" do
130
+ expect(subject.raw).to eql(subject.gist_file[1].content)
131
+ end
132
+ end
133
+
134
+ describe "#strategy=" do
135
+ subject { Gisture::Gist.new(TEST_GIST_ID) }
136
+
137
+ context "when passed a valid strategy" do
138
+ it "sets the strategy" do
139
+ subject.strategy = :load
140
+ expect(subject.strategy).to eql(:load)
141
+ end
142
+ end
143
+
144
+ context "when passed an invalid strategy" do
145
+ it "raises an ArgumentError" do
146
+ expect { subject.strategy = :foo }.to raise_exception(ArgumentError)
147
+ end
148
+ end
149
+ end
150
+
151
+ describe "#tempfile" do
152
+ subject { Gisture::Gist.new(TEST_GIST_ID) }
153
+
154
+ it "creates and returns a tempfile" do
155
+ expect(subject.tempfile).to be_a(Tempfile)
156
+ end
157
+
158
+ it "uses the gist_id as the base of the filename" do
159
+ matched = File.basename(subject.tempfile.path).match(/#{TEST_GIST_ID}/)
160
+ expect(matched).to_not be_nil
161
+ end
162
+
163
+ it "uses the same extension as the gist's filename" do
164
+ expect(File.extname(subject.tempfile.path)).to eql(File.extname(subject.gist_file[0]))
165
+ end
166
+
167
+ it "creates the file in the configured tempdir" do
168
+ tmp_path = File.join(File.dirname(__FILE__), '../', 'tmp')
169
+ begin
170
+ FileUtils.mkdir_p tmp_path
171
+ Gisture.configure do |config|
172
+ config.tmpdir = tmp_path
173
+ end
174
+
175
+ expect(File.dirname(subject.tempfile.path)).to eql(tmp_path)
176
+ rescue => e
177
+ raise e
178
+ ensure
179
+ Gisture.configure do |config|
180
+ config.tmpdir = Dir.tmpdir
181
+ end
182
+ FileUtils.rm_rf tmp_path
183
+ end
184
+ end
185
+ end
186
+
187
+ describe "#to_h" do
188
+ subject { Gisture::Gist.new(TEST_GIST_ID, filename: "test.rb") }
189
+
190
+ it "returns a hash of the gist attributes" do
191
+ expect(subject.to_h).to eql({gist_id: TEST_GIST_ID, strategy: :eval, filename: "test.rb", version: nil})
192
+ end
193
+ end
4
194
  end
data/spec/gisture_spec.rb CHANGED
@@ -1,4 +1,8 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  RSpec.describe Gisture do
4
+ SAMPLE_GIST_ID = "c3b478ef0592eacad361".freeze
5
+ SAMPLE_GIST_VERSION = "7714df11a3babaa78f27027844ac2f0c1a8348c1".freeze
6
+ SAMPLE_GIST_URL = "https://gist.github.com/markrebec/#{SAMPLE_GIST_ID}".freeze
7
+ SAMPLE_GIST_URL_WITH_VERSION = "https://gist.github.com/markrebec/#{SAMPLE_GIST_ID}/#{SAMPLE_GIST_VERSION}".freeze
4
8
  end
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,11 @@ require 'rspec'
3
3
  require 'coveralls'
4
4
  Coveralls.wear!
5
5
 
6
- #Dir[File.join(File.dirname(__FILE__), '..', "spec/support/**/*.rb")].each { |f| require f }
6
+ Dir[File.join(File.dirname(__FILE__), '..', "spec/support/**/*.rb")].each { |f| require f }
7
+
8
+ Gisture.configure do |config|
9
+ config.oauth_token = ENV['GITHUB_OAUTH_TOKEN']
10
+ end
7
11
 
8
12
  RSpec.configure do |config|
9
13
  #config.before(:suite) do
@@ -0,0 +1,5 @@
1
+ TEST_GISTS = {
2
+ "520b474ea0248d1a0a74" => Hashie::Mash.new({"url"=>"https://api.github.com/gists/520b474ea0248d1a0a74", "forks_url"=>"https://api.github.com/gists/520b474ea0248d1a0a74/forks", "commits_url"=>"https://api.github.com/gists/520b474ea0248d1a0a74/commits", "id"=>"520b474ea0248d1a0a74", "git_pull_url"=>"https://gist.github.com/520b474ea0248d1a0a74.git", "git_push_url"=>"https://gist.github.com/520b474ea0248d1a0a74.git", "html_url"=>"https://gist.github.com/520b474ea0248d1a0a74", "files"=>Hashie::Mash.new({"test.rb" => Hashie::Mash.new({"filename"=>"test.rb", "type"=>"application/x-ruby", "language"=>"Ruby", "raw_url"=>"https://gist.githubusercontent.com/markrebec/520b474ea0248d1a0a74/raw/dc57de4d96283efb9b40215c3882bf4658a504ea/test.rb", "size"=>26, "truncated"=>false, "content"=>"puts \"1+1 = \#{(1+1).to_s}\""})}), "owner"=>{"login"=>"markrebec", "id"=>231971, "avatar_url"=>"https://avatars.githubusercontent.com/u/231971?v=3", "gravatar_id"=>"", "url"=>"https://api.github.com/users/markrebec", "html_url"=>"https://github.com/markrebec", "followers_url"=>"https://api.github.com/users/markrebec/followers", "following_url"=>"https://api.github.com/users/markrebec/following{/other_user}", "gists_url"=>"https://api.github.com/users/markrebec/gists{/gist_id}", "starred_url"=>"https://api.github.com/users/markrebec/starred{/owner}{/repo}", "subscriptions_url"=>"https://api.github.com/users/markrebec/subscriptions", "organizations_url"=>"https://api.github.com/users/markrebec/orgs", "repos_url"=>"https://api.github.com/users/markrebec/repos", "events_url"=>"https://api.github.com/users/markrebec/events{/privacy}", "received_events_url"=>"https://api.github.com/users/markrebec/received_events", "type"=>"User", "site_admin"=>false}}),
3
+
4
+ "0417bf78a7c2b825b4ef" => Hashie::Mash.new({"url"=>"https://api.github.com/gists/0417bf78a7c2b825b4ef", "forks_url"=>"https://api.github.com/gists/0417bf78a7c2b825b4ef/forks", "commits_url"=>"https://api.github.com/gists/0417bf78a7c2b825b4ef/commits", "id"=>"0417bf78a7c2b825b4ef", "git_pull_url"=>"https://gist.github.com/0417bf78a7c2b825b4ef.git", "git_push_url"=>"https://gist.github.com/0417bf78a7c2b825b4ef.git", "html_url"=>"https://gist.github.com/0417bf78a7c2b825b4ef", "files"=>Hashie::Mash.new({"file_one.rb" => Hashie::Mash.new({"filename"=>"file_one.rb", "type"=>"application/x-ruby", "language"=>"Ruby", "raw_url"=>"https://gist.githubusercontent.com/markrebec/0417bf78a7c2b825b4ef/raw/6074958bbcc281096357a7d014983638bb09ed1f/file_one.rb", "size"=>27, "truncated"=>false, "content"=>"5.times { puts \"File One\" }"}), "file_two.rb" => Hashie::Mash.new({"filename"=>"file_two.rb", "type"=>"application/x-ruby", "language"=>"Ruby", "raw_url"=>"https://gist.githubusercontent.com/markrebec/0417bf78a7c2b825b4ef/raw/9e1aafc8007f427d386813896387c01848b6bb33/file_two.rb", "size"=>27, "truncated"=>false, "content"=>"5.times { puts \"File Two\" }"})}), "owner"=>{"login"=>"markrebec", "id"=>231971, "avatar_url"=>"https://avatars.githubusercontent.com/u/231971?v=3", "gravatar_id"=>"", "url"=>"https://api.github.com/users/markrebec", "html_url"=>"https://github.com/markrebec", "followers_url"=>"https://api.github.com/users/markrebec/followers", "following_url"=>"https://api.github.com/users/markrebec/following{/other_user}", "gists_url"=>"https://api.github.com/users/markrebec/gists{/gist_id}", "starred_url"=>"https://api.github.com/users/markrebec/starred{/owner}{/repo}", "subscriptions_url"=>"https://api.github.com/users/markrebec/subscriptions", "organizations_url"=>"https://api.github.com/users/markrebec/orgs", "repos_url"=>"https://api.github.com/users/markrebec/repos", "events_url"=>"https://api.github.com/users/markrebec/events{/privacy}", "received_events_url"=>"https://api.github.com/users/markrebec/received_events", "type"=>"User", "site_admin"=>false}})
5
+ }
@@ -0,0 +1,16 @@
1
+ module Github
2
+ class Client::Gists < API
3
+ def get(*args)
4
+ arguments(args, required: [:id])
5
+
6
+ TEST_GISTS.to_a.find { |g| g.first == arguments.id }.last
7
+ end
8
+
9
+ def version(*args)
10
+ arguments(args, required: [:id, :version])
11
+
12
+ # TODO implement this
13
+ nil
14
+ end
15
+ end
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gisture
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Rebec
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-04 00:00:00.000000000 Z
11
+ date: 2015-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: canfig
@@ -76,9 +76,9 @@ files:
76
76
  - lib/gisture.rb
77
77
  - lib/gisture/evaluator.rb
78
78
  - lib/gisture/gist.rb
79
+ - lib/gisture/github_api/client/gists.rb
79
80
  - lib/gisture/railtie.rb
80
81
  - lib/gisture/version.rb
81
- - lib/github_api/client/gists.rb
82
82
  - lib/tasks/gisture.rake
83
83
  - spec/gists/called_class.rb
84
84
  - spec/gists/called_method.rb
@@ -89,6 +89,8 @@ files:
89
89
  - spec/gisture/gist_spec.rb
90
90
  - spec/gisture_spec.rb
91
91
  - spec/spec_helper.rb
92
+ - spec/support/gists.rb
93
+ - spec/support/github_api.rb
92
94
  homepage: http://github.com/markrebec/gisture
93
95
  licenses: []
94
96
  metadata: {}
@@ -122,3 +124,5 @@ test_files:
122
124
  - spec/gisture/gist_spec.rb
123
125
  - spec/gisture_spec.rb
124
126
  - spec/spec_helper.rb
127
+ - spec/support/gists.rb
128
+ - spec/support/github_api.rb