api_problem 0.0.1 → 0.0.2

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.
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: