interpol 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -26,33 +26,20 @@ module Interpol
26
26
  # Public: Defines interpol configuration.
27
27
  class Configuration
28
28
  attr_reader :endpoint_definition_files, :endpoints
29
- attr_accessor :validation_mode, :documentation_title
29
+ attr_accessor :validation_mode, :documentation_title, :endpoint_definition_merge_key_files
30
30
 
31
31
  def initialize
32
- api_version do
33
- raise ConfigurationError, "api_version has not been configured"
34
- end
35
-
36
- validate_if do |env, status, headers, body|
37
- headers['Content-Type'].to_s.include?('json') &&
38
- (200..299).cover?(status) && status != 204 # No Content
39
- end
40
-
41
- on_unavailable_request_version do |requested, available|
42
- message = "The requested API version is invalid. " +
43
- "Requested: #{requested}. " +
44
- "Available: #{available}"
45
- halt 406, JSON.dump(error: message)
46
- end
47
-
48
32
  self.endpoint_definition_files = []
33
+ self.endpoint_definition_merge_key_files = []
49
34
  self.documentation_title = "API Documentation Provided by Interpol"
35
+ register_default_callbacks
36
+
50
37
  yield self if block_given?
51
38
  end
52
39
 
53
40
  def endpoint_definition_files=(files)
54
41
  self.endpoints = files.map do |file|
55
- Endpoint.new(YAML.load_file file)
42
+ Endpoint.new(deserialized_hash_from file)
56
43
  end
57
44
  @endpoint_definition_files = files
58
45
  end
@@ -98,6 +85,46 @@ module Interpol
98
85
  block ||= lambda { |c| }
99
86
  dup.tap(&block)
100
87
  end
88
+
89
+ private
90
+
91
+ def deserialized_hash_from(file)
92
+ YAML.load(yaml_content_for file)
93
+ rescue TypeError => e
94
+ raise ConfigurationError.new \
95
+ "Received an error while loading YAML from #{file}: \"" +
96
+ "#{e.class}: #{e.message}\" If you are using YAML merge keys " +
97
+ "to declare shared types, you must configure endpoint_definition_merge_key_files " +
98
+ "before endpoint_definition_files.", e
99
+ end
100
+
101
+ def yaml_content_for(file)
102
+ File.read(file).gsub(/\A---\n/, "---\n" + endpoint_merge_keys + "\n\n")
103
+ end
104
+
105
+ def endpoint_merge_keys
106
+ @endpoint_merge_keys ||= endpoint_definition_merge_key_files.map { |f|
107
+ File.read(f).gsub(/\A---\n/, '')
108
+ }.join("\n\n")
109
+ end
110
+
111
+ def register_default_callbacks
112
+ api_version do
113
+ raise ConfigurationError, "api_version has not been configured"
114
+ end
115
+
116
+ validate_if do |env, status, headers, body|
117
+ headers['Content-Type'].to_s.include?('json') &&
118
+ (200..299).cover?(status) && status != 204 # No Content
119
+ end
120
+
121
+ on_unavailable_request_version do |requested, available|
122
+ message = "The requested API version is invalid. " +
123
+ "Requested: #{requested}. " +
124
+ "Available: #{available}"
125
+ halt 406, JSON.dump(error: message)
126
+ end
127
+ end
101
128
  end
102
129
  end
103
130
 
@@ -3,7 +3,14 @@ module Interpol
3
3
  class Error < StandardError; end
4
4
 
5
5
  # Error raised when the configuration is invalid.
6
- class ConfigurationError < Error; end
6
+ class ConfigurationError < Error
7
+ attr_reader :original_error
8
+
9
+ def initialize(message=nil, original_error=nil)
10
+ @original_error = original_error
11
+ super(message)
12
+ end
13
+ end
7
14
 
8
15
  # Error raised when data fails to validate against the schema
9
16
  # for an endpoint.
@@ -1,3 +1,3 @@
1
1
  module Interpol
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interpol
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-09 00:00:00.000000000 Z
12
+ date: 2012-04-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &2152424620 !ruby/object:Gem::Requirement
16
+ requirement: &2152129140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -24,10 +24,10 @@ dependencies:
24
24
  version: 2.0.0
25
25
  type: :runtime
26
26
  prerelease: false
27
- version_requirements: *2152424620
27
+ version_requirements: *2152129140
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: json-schema
30
- requirement: &2152423160 !ruby/object:Gem::Requirement
30
+ requirement: &2152127380 !ruby/object:Gem::Requirement
31
31
  none: false
32
32
  requirements:
33
33
  - - ~>
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: 1.0.5
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *2152423160
38
+ version_requirements: *2152127380
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: nokogiri
41
- requirement: &2152422460 !ruby/object:Gem::Requirement
41
+ requirement: &2152126360 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ~>
@@ -46,10 +46,10 @@ dependencies:
46
46
  version: '1.5'
47
47
  type: :runtime
48
48
  prerelease: false
49
- version_requirements: *2152422460
49
+ version_requirements: *2152126360
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: rspec
52
- requirement: &2152421220 !ruby/object:Gem::Requirement
52
+ requirement: &2152125580 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ~>
@@ -57,10 +57,10 @@ dependencies:
57
57
  version: '2.9'
58
58
  type: :development
59
59
  prerelease: false
60
- version_requirements: *2152421220
60
+ version_requirements: *2152125580
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rspec-fire
63
- requirement: &2152420760 !ruby/object:Gem::Requirement
63
+ requirement: &2152125020 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ~>
@@ -68,10 +68,10 @@ dependencies:
68
68
  version: '0.4'
69
69
  type: :development
70
70
  prerelease: false
71
- version_requirements: *2152420760
71
+ version_requirements: *2152125020
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: simplecov
74
- requirement: &2152420260 !ruby/object:Gem::Requirement
74
+ requirement: &2152124120 !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
77
  - - ~>
@@ -79,10 +79,10 @@ dependencies:
79
79
  version: '0.6'
80
80
  type: :development
81
81
  prerelease: false
82
- version_requirements: *2152420260
82
+ version_requirements: *2152124120
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: cane
85
- requirement: &2152419540 !ruby/object:Gem::Requirement
85
+ requirement: &2152123560 !ruby/object:Gem::Requirement
86
86
  none: false
87
87
  requirements:
88
88
  - - ~>
@@ -90,10 +90,21 @@ dependencies:
90
90
  version: '1.2'
91
91
  type: :development
92
92
  prerelease: false
93
- version_requirements: *2152419540
93
+ version_requirements: *2152123560
94
+ - !ruby/object:Gem::Dependency
95
+ name: tailor
96
+ requirement: &2152122640 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: *2152122640
94
105
  - !ruby/object:Gem::Dependency
95
106
  name: rake
96
- requirement: &2152418880 !ruby/object:Gem::Requirement
107
+ requirement: &2152122040 !ruby/object:Gem::Requirement
97
108
  none: false
98
109
  requirements:
99
110
  - - ~>
@@ -101,10 +112,10 @@ dependencies:
101
112
  version: 0.9.2.2
102
113
  type: :development
103
114
  prerelease: false
104
- version_requirements: *2152418880
115
+ version_requirements: *2152122040
105
116
  - !ruby/object:Gem::Dependency
106
117
  name: rack-test
107
- requirement: &2152418180 !ruby/object:Gem::Requirement
118
+ requirement: &2152121500 !ruby/object:Gem::Requirement
108
119
  none: false
109
120
  requirements:
110
121
  - - =
@@ -112,7 +123,7 @@ dependencies:
112
123
  version: 0.6.1
113
124
  type: :development
114
125
  prerelease: false
115
- version_requirements: *2152418180
126
+ version_requirements: *2152121500
116
127
  description: Interpol is a toolkit for working with API endpoint definition files,
117
128
  giving you a stub app, a schema validation middleware, and browsable documentation.
118
129
  email: