interpol 0.0.4 → 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.
@@ -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: