api_problem 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -5,11 +5,15 @@
5
5
  Status](https://coveralls.io/repos/guillec/api-problem/badge.png)](https://coveralls.io/r/guillec/api_problem)
6
6
 
7
7
  With this gem you can return api errors that follow the api-problem draft specs
8
- - http://tools.ietf.org/html/draft-nottingham-http-problem-04
8
+ =======
9
+ With this gem you can return api errors that follow the http api problem draft
10
+ - http://tools.ietf.org/html/draft-nottingham-http-problem-06
9
11
 
10
12
  Here is a explanation behind the draft:
11
13
  - http://www.mnot.net/blog/2013/05/15/http_problem
12
14
 
15
+ ## VERSION 0.0.2 almost ready this is what you will be able to do....
16
+
13
17
  ## Installation
14
18
 
15
19
  Add this line to your application's Gemfile:
@@ -24,47 +28,42 @@ Or install it yourself as:
24
28
 
25
29
  $ gem install api_problem
26
30
 
27
- ## Basics on Gem
28
-
29
- This gem installs the following method:
30
-
31
- api_problem( problem_type, title, { optional stuff } )
32
-
33
- The method params:
34
-
35
- problem_type = required
36
- title = required
37
- args = optional values
38
-
39
31
  ## Usage in Rails
40
32
  ApiProblem provides a Railtie that registers the proper MIME types with Rails:
41
33
  - application/api-problem+json
42
34
  - application/api-problem+xml
43
35
 
44
-
45
- To use create your api problems controller:
46
-
47
- rails g controller api_problems first_error_name second_error_name
48
-
49
- The urls to these views is what you will pass to the api_problem method as the problem_type.
50
-
51
- Here is an example of how to return a api_error:
52
-
53
- format.api_problem_json do
54
- render json: api_problem first_errors_name_url, "You are out of credits", { }
55
- end
56
-
57
- This will respond to the client with something like:
58
-
59
- {
60
- "problemType": "http://example.com/problem_details/first_error_name",
61
- "title": "You are out of credits",
62
- ...
63
- }
64
-
65
- Sample curl call
66
-
67
- curl -i "http://localhost:3000/emails" -H 'ACCEPT: application/api-problem+json'
36
+ This gem installs a generator for your project
37
+
38
+ rail g api_problem bad_token_error
39
+
40
+ You can specify the problem detail object members
41
+
42
+ rail g api_problem bad_token_error type:"http://example.com/probs/out-of-credit" status:403 title:"You do not have enough credit." detail:"Your current balance is 30, but that costs 50."
43
+
44
+ You can also namespace it with the ns key
45
+
46
+ rail g api_problem bad_token_error ns:api
47
+
48
+ About the type, if you DON'T want a type you need to specify with false
49
+
50
+ rail g api_problem bad_token_error type:false
51
+
52
+ About the type, if you dont set a type, it will default to the error name
53
+
54
+ # This will create a bad_token_error type for you.
55
+ rail g api_problem bad_token_error
56
+
57
+ Files that get created for you
58
+
59
+ create app/views/api_problems/bad_token_error.jbuilder
60
+ create app/views/errors/bad_token_error.html.erb
61
+ create app/controllers/errors_controller.rb
62
+ route match '/bad_token_error' => 'errors#bad_token_error', :via => :get, :as => :bad_token_error
63
+
64
+ ## TODO
65
+ - The XML views
66
+ - Tests for the genrator
68
67
 
69
68
  ## Contributing
70
69
 
@@ -20,4 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
+
24
+ spec.add_runtime_dependency "jbuilder"
23
25
  end
@@ -1,3 +1,3 @@
1
1
  module ApiProblem
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate api_problem Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,69 @@
1
+ class ApiProblemGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('../templates', __FILE__)
3
+ argument :one, :type => :hash, :required => false, :default => {}
4
+
5
+ def build_http_error
6
+ template "api_problem_layout.jbuilder.erb", "app/views#{ns_path}api_problems/#{name}.jbuilder"
7
+ template "api_problem_layout.xml.erb", "app/views#{ns_path}api_problems/#{name}.xml.erb"
8
+ end
9
+
10
+ def build_error_html
11
+ template "errors_view.html.erb", "app/views#{ns_path}errors/#{name}.html.erb"
12
+ template "errors_controller.erb", "app/controllers#{ns_path}errors_controller.rb"
13
+ end
14
+
15
+ def build_route
16
+ route "match '#{ns_path}#{name}' => '#{ns_class_name}errors##{name}', :via => :get, :as => :#{problem}"
17
+ inject_into_class "app/controllers/#{ns_path}errors_controller.rb", "#{ns_class_name}ErrorsController".classify, "def #{name}\nend\n"
18
+ end
19
+
20
+ private
21
+ # User must specify that they don't a type by setting type:false
22
+ def type
23
+ if one["type"].nil?
24
+ problem_url
25
+ elsif one["type"] && one["type"] != "false"
26
+ "'#{one["type"]}'"
27
+ elsif one["type"] && one["type"] == "false"
28
+ nil
29
+ end
30
+ end
31
+
32
+ def title
33
+ one["title"]
34
+ end
35
+
36
+ def status
37
+ one["status"] ? Integer(one["status"]) : nil
38
+ end
39
+
40
+ def detail
41
+ one["detail"]
42
+ end
43
+
44
+ def instance
45
+ one["instance"]
46
+ end
47
+
48
+ # Namespace
49
+ def ns
50
+ one["ns"]
51
+ end
52
+
53
+ def ns_path
54
+ ns ? "/#{ns}/" : "/"
55
+ end
56
+
57
+ def ns_class_name
58
+ ns ? "#{ns.classify}::" : ""
59
+ end
60
+
61
+ def problem
62
+ ns ? "#{ns}_#{name}" : "#{name}"
63
+ end
64
+
65
+ def problem_url
66
+ "#{problem}_url"
67
+ end
68
+
69
+ end
@@ -0,0 +1,5 @@
1
+ <% if type %>json.set! :type, <%= type %><% end %>
2
+ <% if title %>json.set! :title, "<%= title %>"<% end %>
3
+ <% if status %>json.set! :status, <%= status %><% end %>
4
+ <% if detail %>json.set! :detail, "<%= detail %>"<% end %>
5
+ <% if instance %>json.set! :instance, "<%= instance %>"<% end %>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <problem xmlns="urn:ietf:rfc:XXXX">
3
+ <% if type %>
4
+ <type><%%= type %></type>
5
+ <% end %>
6
+ <% if status %>
7
+ <statu><%= status %></status>
8
+ <% end %>
9
+ <% if title %>
10
+ <title><%= title %></title>
11
+ <% end %>
12
+ <% if detail %>
13
+ <detail><%= detail %></detail>
14
+ <% end %>
15
+ <% if instance %>
16
+ <instance><%= instance %></instance>
17
+ <% end %>
18
+ </problem>
@@ -0,0 +1,2 @@
1
+ class <%= ns_class_name %>ErrorsController < ApplicationController
2
+ end
@@ -0,0 +1,2 @@
1
+ <h1><%= name.classify %></h1>
2
+ When dereferenced, it SHOULD provide human-readable documentation for the problem type
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+ require 'api_problem'
3
+
4
+ class CellGeneratorTest < Rails::Generators::TestCase
5
+ p "asflkasflksadjflaksdjfl;k"
6
+ destination File.join(Rails.root, "tmp")
7
+ setup :prepare_destination
8
+ tests ::Cells::Generators::CellGenerator
9
+
10
+ test "create the standard assets" do
11
+ run_generator %w(Blog post latest)
12
+
13
+ assert_file "app/cells/blog_cell.rb", /class BlogCell < Cell::Rails/
14
+ assert_file "app/cells/blog_cell.rb", /def post/
15
+ assert_file "app/cells/blog_cell.rb", /def latest/
16
+ assert_file "app/cells/blog/post.html.erb", %r(app/cells/blog/post.html.erb)
17
+ assert_file "app/cells/blog/latest.html.erb", %r(app/cells/blog/latest.html.erb)
18
+ assert_file "test/cells/blog_cell_test.rb"
19
+ end
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_problem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-16 00:00:00.000000000 Z
12
+ date: 2014-03-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: jbuilder
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  description: An implementation of draft-nottingham-http-problem.
47
63
  email:
48
64
  - guille@bitpop.in
@@ -59,7 +75,14 @@ files:
59
75
  - lib/api_problem.rb
60
76
  - lib/api_problem/railtie.rb
61
77
  - lib/api_problem/version.rb
78
+ - lib/generators/api_problem/USAGE
79
+ - lib/generators/api_problem/api_problem_generator.rb
80
+ - lib/generators/api_problem/templates/api_problem_layout.jbuilder.erb
81
+ - lib/generators/api_problem/templates/api_problem_layout.xml.erb
82
+ - lib/generators/api_problem/templates/errors_controller.erb
83
+ - lib/generators/api_problem/templates/errors_view.html.erb
62
84
  - test/api_problem_draft_spec_test.rb
85
+ - test/api_problem_generator.rb
63
86
  - test/api_problem_test.rb
64
87
  - test/test_helper.rb
65
88
  homepage: https://github.com/guillec/api_problem
@@ -89,6 +112,7 @@ specification_version: 3
89
112
  summary: An implementation of draft-nottingham-http-problem.
90
113
  test_files:
91
114
  - test/api_problem_draft_spec_test.rb
115
+ - test/api_problem_generator.rb
92
116
  - test/api_problem_test.rb
93
117
  - test/test_helper.rb
94
118
  has_rdoc: