octonore 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c2a77f05a337906a4f02bdb8980953c05f488aa
4
- data.tar.gz: 09cb7615f610c19e264e2f396fcd01c970ce8454
3
+ metadata.gz: 07233694c096c366e80590fcdf3f1b1f939eb635
4
+ data.tar.gz: 7b77b9903b047452ec932f2002672341497470db
5
5
  SHA512:
6
- metadata.gz: 0daa7a05c87557fa64ba1e8b61be8adfaa9c0330d4536453a5cb3938383291cbc0c0b1b12c46200dec2970b88224b35fc86513e546ff3dce549f3ac73ac9ed11
7
- data.tar.gz: 2771e998fbc5949d4856661afe7ae3cbbc60c8b46f999ab36d66a766e38fb3d44045624e1822495a5731020bda2d16740a6b8da0b304ee48cf7cd26c1a3c5b4a
6
+ metadata.gz: 5e0f37b5874a1205f734eb1dfe55ff0e8481f4ca627b9afdf3b72b969cfc9fb9ecacffde7db991fd1b7777b9dc4e95498c816aeaa685551d1ad0fa6194dd73a7
7
+ data.tar.gz: 019e9604fd33ecba86a11f757ccbb64e0dbb72bfe6c0bdd8e2bd5b3998800255ffb5c5577489f55877bb3a9a767ad70ac0c30ad3d4a898ce59f3cfc9aa7fdae5
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore CHANGED
@@ -15,6 +15,7 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ Gemfile.lock
18
19
 
19
20
  # YARD artifacts
20
21
  .yardoc
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ - jruby-19mode
data/Gemfile CHANGED
@@ -1,10 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'httparty'
3
+ gem 'httparty', '~> 0.11.0'
4
4
 
5
5
  group :test do
6
- gem 'rspec'
7
- gem 'webmock'
8
- gem 'vcr'
9
- gem 'rake'
6
+ gem "rspec", "~> 2.13.0"
7
+ gem "webmock", "~> 1.11.0"
8
+ gem "vcr", "~> 2.5.0"
9
+ gem "rake", "~> 10.0.4"
10
+ gem "coveralls", "~> 0.6.7", require: false
10
11
  end
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
- Octonore
1
+ Octonore [![Build Status](https://travis-ci.org/zachlatta/octonore.png?branch=master)](https://travis-ci.org/zachlatta/octonore) [![Code Climate](https://codeclimate.com/github/zachlatta/octonore.png)](https://codeclimate.com/github/zachlatta/octonore) [![Coverage Status](https://coveralls.io/repos/zachlatta/octonore/badge.png?branch=master)](https://coveralls.io/r/zachlatta/octonore?branch=master) [![Dependency Status](https://gemnasium.com/zachlatta/octonore.png)](https://gemnasium.com/zachlatta/octonore)
2
2
  ========
3
3
 
4
4
  An octolicious wrapper around the [Gitignore templates API](http://developer.github.com/v3/gitignore/).
5
5
 
6
- $ gem install octonore
6
+ $ gem install octonore
7
7
 
8
8
 
9
9
  Usage
@@ -11,10 +11,46 @@ Usage
11
11
 
12
12
  To get a gitignore template you first need to instantiate it.
13
13
 
14
- >> c_template = Octonore::Template.new('C')
15
- => #<Octonore::Template:0x007fe5f401a1d0 @name="C">
14
+ >> c_template = Octonore::Template.new('C')
15
+ => #<Octonore::Template:0x007fe65b8b2420 @name="C", @source="# Object files\n*.
16
+ o\n\n# Libraries\n*.lib\n*.a\n\n# Shared objects (inc. Windows DLLs)\n*.dll\n*.
17
+ so\n*.so.*\n*.dylib\n\n# Executables\n*.exe\n*.out\n*.app\n">
16
18
 
17
- To get a hash of its name and source code, call its `data` method.
19
+ To get the template's source code, you can call its `source` accessor.
18
20
 
19
- >> c_template.data
20
- => #<HTTParty::Response:0x7fe5f50adad8 parsed_response={"name"=>"C", "source"=>"# Object fi…
21
+ >> c_template.source
22
+ => "# Object files\n*.o\n\n# Libraries\n*.lib\n*.a\n\n# Shared objects (inc. Wi
23
+ ndows DLLs)\n*.dll\n*.so\n*.so.*\n*.dylib\n\n# Executables\n*.exe\n*.out\n*.app
24
+ \n"
25
+
26
+
27
+ You can also get the template's name with the `name` accessor.
28
+
29
+ >> c_template.name
30
+ => "C"
31
+
32
+ You can reload the template's source from Github with the `update` method.
33
+
34
+ >> c_template.update
35
+ => "# Object files\n*.o\n\n# Libraries\n*.lib\n*.a\n\n# Shared objects (inc. Wi
36
+ ndows DLLs)\n*.dll\n*.so\n*.so.*\n*.dylib\n\n# Executables\n*.exe\n*.out\n*.app
37
+ \n"
38
+
39
+
40
+ ### Example Program
41
+
42
+ The following program asks the user for the name of a gitignore template. It then writes the gitignore to a file ending in `.gitignore`. If the user enters `Java`, then it will write the Java gitignore template to `java.gitignore` in the current directory.
43
+
44
+ ```ruby
45
+ require 'octonore'
46
+
47
+ begin
48
+ print "Enter the name of a gitignore template (case sensitive): "
49
+ template = Octonore::Template.new(gets.strip)
50
+
51
+ File.open("#{template.name.downcase}.gitignore", 'w') { |file|
52
+ file.write(template.source) }
53
+ rescue GitignoreTemplateNotFoundError => e
54
+ puts e.message
55
+ end
56
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -3,7 +3,7 @@ module Octonore
3
3
  # A gitignore template. Templates consist of a name and source.
4
4
  class Template
5
5
 
6
- attr_accessor :name
6
+ attr_accessor :name, :source
7
7
 
8
8
  include HTTParty
9
9
 
@@ -11,7 +11,7 @@ module Octonore
11
11
 
12
12
  base_uri 'https://api.github.com/gitignore'
13
13
 
14
- # Create a new template!
14
+ # Create a new template.
15
15
  #
16
16
  # Example:
17
17
  # c_template = Octonore::Template.new('C')
@@ -22,21 +22,20 @@ module Octonore
22
22
 
23
23
  def initialize(name)
24
24
  self.name = name
25
+ update
25
26
  end
26
27
 
27
- # Get a Hash of the template's name and source.
28
- #
29
- # Example:
30
- # >> c_template.data["name"]
31
- # => C
32
- #
33
- # >> c_template.data["source"]
34
- # => # Object files\n*.o\n\n# Libraries\n*.lib\n*.a\n\n# Shared objects
35
- # (inc. Windows DLLs)\n*.dll\n*.so\n*.so.*\n*.dylib\n\n# Executables\n
36
- # *.exe\n*.out\n*.app\n
37
-
38
- def data(force = false)
39
- force ? @data = get_data : @data ||= get_data
28
+ # Update the Gitignore source from Github.
29
+
30
+ def update
31
+ data = get_data
32
+
33
+ if valid_template_hash? data
34
+ @source = data["source"]
35
+ else
36
+ raise GitignoreTemplateNotFoundError,
37
+ "Template '#{@name}' does not exist!"
38
+ end
40
39
  end
41
40
 
42
41
 
@@ -46,10 +45,17 @@ module Octonore
46
45
  self.class.get "/templates/#{self.name}", headers: headers
47
46
  end
48
47
 
48
+ def valid_template_hash?(template_hash)
49
+ template_hash["message"] != "Not Found"
50
+ end
51
+
49
52
  def headers
50
53
  {"User-Agent" => USER_AGENT}
51
54
  end
52
55
 
53
56
  end
54
57
 
58
+ class GitignoreTemplateNotFoundError < StandardError
59
+ end
60
+
55
61
  end
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'octonore'
3
- s.version = '0.0.2'
3
+ s.version = '0.0.3'
4
4
  s.date = '2013-05-23'
5
- s.summary = "Wrapper around the Github gitignore template API."
6
- s.description = "An octolicious wrapper around the Github gitignore template
7
- API."
5
+ s.summary = 'Wrapper around the Github gitignore template API.'
6
+ s.description = 'An octolicious wrapper around the Github gitignore template
7
+ API.'
8
8
  s.license = 'MIT'
9
9
 
10
- s.authors = ["Zach Latta"]
10
+ s.authors = ['Zach Latta']
11
11
  s.email = 'zchlatta@gmail.com'
12
12
  s.homepage = 'http://rubygems.org/gems/octonore'
13
13
 
@@ -16,5 +16,5 @@ Gem::Specification.new do |s|
16
16
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f|
17
17
  File.basename(f)
18
18
  }
19
- s.require_paths = ["lib"]
19
+ s.require_paths = ['lib']
20
20
  end
@@ -2,31 +2,56 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://api.github.com/gitignore/gitignore/templates/C
5
+ uri: https://api.github.com/gitignore/templates/C
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
- headers: {}
9
+ headers:
10
+ User-Agent:
11
+ - octocore/0.11.0
10
12
  response:
11
13
  status:
12
- code: 403
13
- message: Forbidden
14
+ code: 200
15
+ message: OK
14
16
  headers:
15
17
  Server:
16
18
  - GitHub.com
17
19
  Date:
18
- - Thu, 23 May 2013 08:52:40 GMT
20
+ - Fri, 24 May 2013 01:15:28 GMT
19
21
  Content-Type:
20
- - application/octet-stream
21
- Content-Length:
22
- - '107'
22
+ - application/json; charset=utf-8
23
23
  Connection:
24
24
  - keep-alive
25
+ Status:
26
+ - 200 OK
27
+ X-Ratelimit-Limit:
28
+ - '60'
29
+ X-Ratelimit-Remaining:
30
+ - '49'
31
+ X-Github-Media-Type:
32
+ - github.beta; format=json
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ Content-Length:
36
+ - '180'
37
+ Access-Control-Allow-Credentials:
38
+ - 'true'
39
+ Access-Control-Expose-Headers:
40
+ - ETag, Link, X-RateLimit-Limit, X-RateLimit-Remaining, X-OAuth-Scopes, X-Accepted-OAuth-Scopes
41
+ Access-Control-Allow-Origin:
42
+ - '*'
43
+ Etag:
44
+ - '"547a43504d718cb7bc42ed51aae7f643"'
45
+ Cache-Control:
46
+ - max-age=0, private, must-revalidate
47
+ Vary:
48
+ - Accept-Encoding
25
49
  body:
26
50
  encoding: UTF-8
27
- string: '{"message":"Missing or invalid User Agent string. See http://developer.github.com/v3/#user-agent-required"}'
51
+ string: '{"name":"C","source":"# Object files\n*.o\n\n# Libraries\n*.lib\n*.a\n\n#
52
+ Shared objects (inc. Windows DLLs)\n*.dll\n*.so\n*.so.*\n*.dylib\n\n# Executables\n*.exe\n*.out\n*.app\n"}'
28
53
  http_version:
29
- recorded_at: Thu, 23 May 2013 08:52:40 GMT
54
+ recorded_at: Fri, 24 May 2013 01:15:29 GMT
30
55
  - request:
31
56
  method: get
32
57
  uri: https://api.github.com/gitignore/templates/C
@@ -44,7 +69,7 @@ http_interactions:
44
69
  Server:
45
70
  - GitHub.com
46
71
  Date:
47
- - Thu, 23 May 2013 08:52:40 GMT
72
+ - Fri, 24 May 2013 01:15:29 GMT
48
73
  Content-Type:
49
74
  - application/json; charset=utf-8
50
75
  Connection:
@@ -54,7 +79,7 @@ http_interactions:
54
79
  X-Ratelimit-Limit:
55
80
  - '60'
56
81
  X-Ratelimit-Remaining:
57
- - '51'
82
+ - '48'
58
83
  X-Github-Media-Type:
59
84
  - github.beta; format=json
60
85
  X-Content-Type-Options:
@@ -78,5 +103,50 @@ http_interactions:
78
103
  string: '{"name":"C","source":"# Object files\n*.o\n\n# Libraries\n*.lib\n*.a\n\n#
79
104
  Shared objects (inc. Windows DLLs)\n*.dll\n*.so\n*.so.*\n*.dylib\n\n# Executables\n*.exe\n*.out\n*.app\n"}'
80
105
  http_version:
81
- recorded_at: Thu, 23 May 2013 08:52:40 GMT
106
+ recorded_at: Fri, 24 May 2013 01:15:29 GMT
107
+ - request:
108
+ method: get
109
+ uri: https://api.github.com/gitignore/templates/invalid
110
+ body:
111
+ encoding: US-ASCII
112
+ string: ''
113
+ headers:
114
+ User-Agent:
115
+ - octocore/0.11.0
116
+ response:
117
+ status:
118
+ code: 404
119
+ message: Not Found
120
+ headers:
121
+ Server:
122
+ - GitHub.com
123
+ Date:
124
+ - Fri, 24 May 2013 01:15:29 GMT
125
+ Content-Type:
126
+ - application/json; charset=utf-8
127
+ Connection:
128
+ - keep-alive
129
+ Status:
130
+ - 404 Not Found
131
+ X-Ratelimit-Limit:
132
+ - '60'
133
+ X-Ratelimit-Remaining:
134
+ - '47'
135
+ X-Github-Media-Type:
136
+ - github.beta; format=json
137
+ X-Content-Type-Options:
138
+ - nosniff
139
+ Content-Length:
140
+ - '23'
141
+ Access-Control-Allow-Credentials:
142
+ - 'true'
143
+ Access-Control-Expose-Headers:
144
+ - ETag, Link, X-RateLimit-Limit, X-RateLimit-Remaining, X-OAuth-Scopes, X-Accepted-OAuth-Scopes
145
+ Access-Control-Allow-Origin:
146
+ - '*'
147
+ body:
148
+ encoding: UTF-8
149
+ string: '{"message":"Not Found"}'
150
+ http_version:
151
+ recorded_at: Fri, 24 May 2013 01:15:29 GMT
82
152
  recorded_with: VCR 2.5.0
@@ -18,10 +18,18 @@ describe Octonore::Template do
18
18
 
19
19
  let(:template) { Octonore::Template.new('C') }
20
20
 
21
+ before { VCR.insert_cassette 'template', :record => :new_episodes }
22
+
23
+ after { VCR.eject_cassette }
24
+
21
25
  it "should have a name attribute" do
22
26
  template.should respond_to :name
23
27
  end
24
28
 
29
+ it "should have a source attribute" do
30
+ template.should respond_to :source
31
+ end
32
+
25
33
  it "should have the right name" do
26
34
  template.name.should eq('C')
27
35
  end
@@ -36,35 +44,21 @@ describe Octonore::Template do
36
44
 
37
45
  after { VCR.eject_cassette }
38
46
 
39
- it "should have a data method" do
40
- template.should respond_to :data
47
+ it "should have an update method" do
48
+ template.should respond_to :update
41
49
  end
42
50
 
43
- it "should parse the api response from JSON to Hash" do
44
- template.data.should be_instance_of Hash
51
+ it "should be able to refresh data from Github" do
52
+ template.source = nil
53
+ template.update
54
+ template.source.should_not equal nil
45
55
  end
46
56
 
47
- it "should get the right data" do
48
- template.data["name"].should eq('C')
57
+ it "should raise an error if template doesn't exist" do
58
+ expect {
59
+ bad_template = Octonore::Template.new('invalid') }.to raise_error
49
60
  end
50
61
 
51
- describe "caching" do
52
-
53
- before do
54
- template.data
55
- stub_request(:any, /api.github.com/).to_timeout
56
- end
57
-
58
- it "must cache the data" do
59
- template.data.should be_instance_of Hash
60
- end
61
-
62
- it "must refresh the data if forced" do
63
- lambda { template.data(true) }.should raise_error Timeout::Error
64
- end
65
-
66
- end
67
-
68
62
  end
69
63
 
70
64
  end
@@ -1,3 +1,6 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  require_relative '../lib/octonore'
2
5
 
3
6
  require 'webmock/rspec'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octonore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Latta
@@ -18,9 +18,10 @@ executables: []
18
18
  extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
+ - .coveralls.yml
21
22
  - .gitignore
23
+ - .travis.yml
22
24
  - Gemfile
23
- - Gemfile.lock
24
25
  - LICENSE
25
26
  - README.md
26
27
  - Rakefile
@@ -1,34 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- addressable (2.3.4)
5
- crack (0.3.2)
6
- diff-lcs (1.2.4)
7
- httparty (0.11.0)
8
- multi_json (~> 1.0)
9
- multi_xml (>= 0.5.2)
10
- multi_json (1.7.3)
11
- multi_xml (0.5.3)
12
- rake (10.0.4)
13
- rspec (2.13.0)
14
- rspec-core (~> 2.13.0)
15
- rspec-expectations (~> 2.13.0)
16
- rspec-mocks (~> 2.13.0)
17
- rspec-core (2.13.1)
18
- rspec-expectations (2.13.0)
19
- diff-lcs (>= 1.1.3, < 2.0)
20
- rspec-mocks (2.13.1)
21
- vcr (2.5.0)
22
- webmock (1.11.0)
23
- addressable (>= 2.2.7)
24
- crack (>= 0.3.2)
25
-
26
- PLATFORMS
27
- ruby
28
-
29
- DEPENDENCIES
30
- httparty
31
- rake
32
- rspec
33
- vcr
34
- webmock