interpol 0.0.5 → 0.0.6

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/Gemfile CHANGED
@@ -4,8 +4,12 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  group :extras do
7
- gem 'debugger' if RUBY_ENGINE == 'ruby' && RUBY_VERSION == '1.9.3'
7
+ gem 'debugger' if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby' && RUBY_VERSION == '1.9.3'
8
8
  end
9
9
 
10
- gem 'json-jruby', platform: 'jruby'
11
- gem 'compass_twitter_bootstrap', git: 'git://github.com/vwall/compass-twitter-bootstrap.git'
10
+ gem 'json-jruby', :platform => 'jruby'
11
+ gem 'compass_twitter_bootstrap', :git => 'git://github.com/vwall/compass-twitter-bootstrap.git'
12
+
13
+ gem 'json', :platform => 'ruby_18'
14
+
15
+ gem 'sinatra', '>= 1.3.2', '< 2.0.0'
File without changes
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # Interpol
2
+ ![Interpol Logo](https://github.com/seomoz/interpol/blob/assets/interpol-logo.png?raw=true)
2
3
 
3
4
  [![Build Status](https://secure.travis-ci.org/seomoz/interpol.png)](http://travis-ci.org/seomoz/interpol)
4
5
 
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ RSpec::Core::RakeTask.new(:spec) do |t|
7
7
  t.ruby_opts = "-Ispec -rsimplecov_setup"
8
8
  end
9
9
 
10
- if RUBY_ENGINE == 'ruby' # MRI only
10
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby' # MRI only
11
11
  require 'cane/rake_task'
12
12
 
13
13
  desc "Run cane to check quality metrics"
@@ -20,7 +20,7 @@ else
20
20
  task(:quality) { } # no-op
21
21
  end
22
22
 
23
- task default: [:spec, :quality]
23
+ task :default => [:spec, :quality]
24
24
 
25
25
  desc "Watch Documentation App Compass Files"
26
26
  task :compass_watch do
@@ -1,6 +1,7 @@
1
1
  require 'interpol/endpoint'
2
2
  require 'interpol/errors'
3
3
  require 'yaml'
4
+ require 'interpol/configuration_ruby_18_extensions' if RUBY_VERSION.to_f < 1.9
4
5
 
5
6
  module Interpol
6
7
  module DefinitionFinder
@@ -88,15 +89,21 @@ module Interpol
88
89
 
89
90
  private
90
91
 
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
92
+ # 1.9 version
93
+ include Module.new {
94
+ def deserialized_hash_from(file)
95
+ YAML.load(yaml_content_for file)
96
+ rescue TypeError => e
97
+ raise ConfigurationError.new \
98
+ "Received an error while loading YAML from #{file}: \"" +
99
+ "#{e.class}: #{e.message}\" If you are using YAML merge keys " +
100
+ "to declare shared types, you must configure endpoint_definition_merge_key_files " +
101
+ "before endpoint_definition_files.", e
102
+ end
103
+ }
104
+
105
+ # Needed to override deserialized_hash_from for Ruby 1.8
106
+ include Interpol::ConfigurationRuby18Extensions if RUBY_VERSION.to_f < 1.9
100
107
 
101
108
  def yaml_content_for(file)
102
109
  File.read(file).gsub(/\A---\n/, "---\n" + endpoint_merge_keys + "\n\n")
@@ -115,14 +122,14 @@ module Interpol
115
122
 
116
123
  validate_if do |env, status, headers, body|
117
124
  headers['Content-Type'].to_s.include?('json') &&
118
- (200..299).cover?(status) && status != 204 # No Content
125
+ status >= 200 && status <= 299 && status != 204 # No Content
119
126
  end
120
127
 
121
128
  on_unavailable_request_version do |requested, available|
122
129
  message = "The requested API version is invalid. " +
123
130
  "Requested: #{requested}. " +
124
131
  "Available: #{available}"
125
- halt 406, JSON.dump(error: message)
132
+ halt 406, JSON.dump(:error => message)
126
133
  end
127
134
  end
128
135
  end
@@ -0,0 +1,27 @@
1
+ module Interpol
2
+ module ConfigurationRuby18Extensions
3
+ def deserialized_hash_from(file)
4
+ YAML.load(yaml_content_for file).tap do |yaml|
5
+ if bad_class = bad_deserialized_yaml(yaml)
6
+ raise ConfigurationError.new \
7
+ "Received an error while loading YAML from #{file}: \"" +
8
+ "Got object of type: #{bad_class}\"\n If you are using YAML merge keys " +
9
+ "to declare shared types, you must configure endpoint_definition_merge_key_files " +
10
+ "before endpoint_definition_files."
11
+ end
12
+ end
13
+ end
14
+
15
+ # returns nil if the YAML has been only partially deserialized by Syck
16
+ # and there are YAML::Syck objects.
17
+ def bad_deserialized_yaml(yaml)
18
+ if [Hash, Array].include? yaml.class
19
+ yaml.map { |elem| bad_deserialized_yaml(elem) }.compact.first
20
+ elsif yaml.class.name =~ /YAML::Syck::/
21
+ yaml.class.name # Bad!
22
+ else
23
+ nil
24
+ end
25
+ end
26
+ end
27
+ end
@@ -32,20 +32,38 @@ module Interpol
32
32
 
33
33
  def schema_description(doc, schema)
34
34
  return unless schema.has_key?('description')
35
- doc.h3(class: "description") { doc.text(schema['description']) }
35
+ doc.h3(:class => "description") { doc.text(schema['description']) }
36
+ end
37
+
38
+ def render_properties_and_items(doc, schema)
39
+ render_properties(doc, Array(schema['properties']))
40
+ render_items(doc, schema['items'])
36
41
  end
37
42
 
38
43
  def schema_definition(doc, schema)
39
- doc.div(class: "schema-definition") do
44
+ doc.div(:class => "schema-definition") do
40
45
  schema_description(doc, schema)
41
- render_properties(doc, Array(schema['properties']))
46
+ render_properties_and_items(doc, schema)
42
47
  end
43
48
  end
44
49
 
50
+ def render_items(doc, items)
51
+ # No support for tuple-typing, just basic array typing
52
+ return if items.nil?
53
+ doc.dl(:class => "items") do
54
+ doc.dt(:class => "name") { doc.text("(array contains #{items['type']}s)") }
55
+ if items.has_key?('description')
56
+ doc.dd { doc.text(items['description']) }
57
+ end
58
+ render_properties_and_items(doc, items)
59
+ end
60
+
61
+ end
62
+
45
63
  def render_properties(doc, properties)
46
64
  return if properties.none?
47
65
 
48
- doc.dl(class: "properties") do
66
+ doc.dl(:class => "properties") do
49
67
  properties.each do |name, property|
50
68
  property_definition(doc, name, property)
51
69
  end
@@ -53,13 +71,13 @@ module Interpol
53
71
  end
54
72
 
55
73
  def property_definition(doc, name, property)
56
- doc.dt(class: "name") { doc.text(property_title name, property) }
74
+ doc.dt(:class => "name") { doc.text(property_title name, property) } if name
57
75
 
58
76
  if property.has_key?('description')
59
77
  doc.dd { doc.text(property['description']) }
60
78
  end
61
79
 
62
- render_properties(doc, Array(property['properties']))
80
+ render_properties_and_items(doc, property)
63
81
  end
64
82
 
65
83
  def property_title(name, property)
@@ -15,7 +15,7 @@ module Interpol
15
15
  def render_static_page(&block)
16
16
  require 'rack/mock'
17
17
  app = build(&block)
18
- status, headers, body = app.call(Rack::MockRequest.env_for "/", method: "GET")
18
+ status, headers, body = app.call(Rack::MockRequest.env_for "/", :method => "GET")
19
19
  AssetInliner.new(body.join, app.public_folder).standalone_page
20
20
  end
21
21
 
@@ -36,13 +36,13 @@ module Interpol
36
36
 
37
37
  def inline_stylesheets
38
38
  @doc.css("link[rel=stylesheet]").map do |link|
39
- inline_asset link, "style", link['href'], type: "text/css"
39
+ inline_asset link, "style", link['href'], :type => "text/css"
40
40
  end
41
41
  end
42
42
 
43
43
  def inline_javascript
44
44
  @doc.css("script[src]").each do |script|
45
- inline_asset script, "script", script['src'], type: "text/javascript"
45
+ inline_asset script, "script", script['src'], :type => "text/javascript"
46
46
  end
47
47
  end
48
48
 
@@ -77,6 +77,15 @@ module Interpol
77
77
  def title
78
78
  interpol_config.documentation_title
79
79
  end
80
+
81
+ def url_path(*path_parts)
82
+ [ path_prefix, path_parts ].join("/").squeeze('/')
83
+ end
84
+ alias_method :u, :url_path
85
+
86
+ def path_prefix
87
+ request.env['SCRIPT_NAME']
88
+ end
80
89
  end
81
90
 
82
91
  # Private: Builds a stub sinatra app for the given interpol
@@ -93,7 +102,8 @@ module Interpol
93
102
  helpers Helpers
94
103
 
95
104
  get('/') do
96
- erb :layout, locals: { endpoints: endpoints, current_endpoint: current_endpoint }
105
+ erb :layout, :locals => { :endpoints => endpoints,
106
+ :current_endpoint => current_endpoint }
97
107
  end
98
108
  end
99
109
  end
@@ -4227,6 +4227,6 @@ a.thumbnail:hover {
4227
4227
  visibility: hidden;
4228
4228
  }
4229
4229
 
4230
- dl.properties {
4230
+ dl.properties, dl.items {
4231
4231
  margin-left: 25px;
4232
4232
  }
@@ -1,7 +1,7 @@
1
1
  @import "compass/reset";
2
2
  @import "compass_twitter_bootstrap";
3
3
 
4
- dl.properties {
4
+ dl.properties, dl.items {
5
5
  margin-left: 25px;
6
6
  }
7
7
 
@@ -8,7 +8,7 @@
8
8
  <meta name="author" content="">
9
9
 
10
10
  <!-- The styles -->
11
- <link href="/stylesheets/screen.css" rel="stylesheet">
11
+ <link href="<%= u '/stylesheets/screen.css' %>" rel="stylesheet">
12
12
  <style type="text/css">
13
13
  body {
14
14
  padding-top: 60px;
@@ -56,7 +56,7 @@
56
56
  </div><!--/span-->
57
57
 
58
58
  <% endpoints.each do |endpoint| %>
59
- <%= erb :endpoint, locals: { endpoint: endpoint, visible: (endpoint == current_endpoint) } %>
59
+ <%= erb :endpoint, :locals => { :endpoint => endpoint, :visible => (endpoint == current_endpoint) } %>
60
60
  <% end %>
61
61
  </div><!--/row-->
62
62
  <hr>
@@ -70,8 +70,8 @@
70
70
  <!-- The javascript
71
71
  ================================================== -->
72
72
  <!-- Placed at the end of the document so the pages load faster -->
73
- <script src="/javascripts/jquery.1.7.2.min.js"></script>
74
- <script src="/javascripts/interpol.js"></script>
73
+ <script src="<%= u '/javascripts/jquery.1.7.2.min.js' %>"></script>
74
+ <script src="<%= u '/javascripts/interpol.js' %>"></script>
75
75
  </body>
76
76
  </html>
77
77
 
@@ -34,9 +34,9 @@ module Interpol
34
34
  @app = Sinatra.new do
35
35
  set :interpol_config, config
36
36
  helpers Helpers
37
- not_found { JSON.dump(error: "The requested resource could not be found") }
37
+ not_found { JSON.dump(:error => "The requested resource could not be found") }
38
38
  before { content_type "application/json;charset=utf-8" }
39
- get('/__ping') { JSON.dump(message: "Interpol stub app running.") }
39
+ get('/__ping') { JSON.dump(:message => "Interpol stub app running.") }
40
40
  end
41
41
  end
42
42
 
@@ -1,3 +1,3 @@
1
1
  module Interpol
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
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.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,25 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-17 00:00:00.000000000 Z
12
+ date: 2012-05-24 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: sinatra
16
- requirement: &2152129140 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: 1.3.2
22
- - - <
23
- - !ruby/object:Gem::Version
24
- version: 2.0.0
25
- type: :runtime
26
- prerelease: false
27
- version_requirements: *2152129140
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: json-schema
30
- requirement: &2152127380 !ruby/object:Gem::Requirement
16
+ requirement: &2156420460 !ruby/object:Gem::Requirement
31
17
  none: false
32
18
  requirements:
33
19
  - - ~>
@@ -35,10 +21,10 @@ dependencies:
35
21
  version: 1.0.5
36
22
  type: :runtime
37
23
  prerelease: false
38
- version_requirements: *2152127380
24
+ version_requirements: *2156420460
39
25
  - !ruby/object:Gem::Dependency
40
26
  name: nokogiri
41
- requirement: &2152126360 !ruby/object:Gem::Requirement
27
+ requirement: &2156419960 !ruby/object:Gem::Requirement
42
28
  none: false
43
29
  requirements:
44
30
  - - ~>
@@ -46,10 +32,10 @@ dependencies:
46
32
  version: '1.5'
47
33
  type: :runtime
48
34
  prerelease: false
49
- version_requirements: *2152126360
35
+ version_requirements: *2156419960
50
36
  - !ruby/object:Gem::Dependency
51
37
  name: rspec
52
- requirement: &2152125580 !ruby/object:Gem::Requirement
38
+ requirement: &2156419120 !ruby/object:Gem::Requirement
53
39
  none: false
54
40
  requirements:
55
41
  - - ~>
@@ -57,10 +43,10 @@ dependencies:
57
43
  version: '2.9'
58
44
  type: :development
59
45
  prerelease: false
60
- version_requirements: *2152125580
46
+ version_requirements: *2156419120
61
47
  - !ruby/object:Gem::Dependency
62
48
  name: rspec-fire
63
- requirement: &2152125020 !ruby/object:Gem::Requirement
49
+ requirement: &2156418120 !ruby/object:Gem::Requirement
64
50
  none: false
65
51
  requirements:
66
52
  - - ~>
@@ -68,10 +54,10 @@ dependencies:
68
54
  version: '0.4'
69
55
  type: :development
70
56
  prerelease: false
71
- version_requirements: *2152125020
57
+ version_requirements: *2156418120
72
58
  - !ruby/object:Gem::Dependency
73
59
  name: simplecov
74
- requirement: &2152124120 !ruby/object:Gem::Requirement
60
+ requirement: &2156417400 !ruby/object:Gem::Requirement
75
61
  none: false
76
62
  requirements:
77
63
  - - ~>
@@ -79,10 +65,10 @@ dependencies:
79
65
  version: '0.6'
80
66
  type: :development
81
67
  prerelease: false
82
- version_requirements: *2152124120
68
+ version_requirements: *2156417400
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: cane
85
- requirement: &2152123560 !ruby/object:Gem::Requirement
71
+ requirement: &2156416760 !ruby/object:Gem::Requirement
86
72
  none: false
87
73
  requirements:
88
74
  - - ~>
@@ -90,10 +76,10 @@ dependencies:
90
76
  version: '1.2'
91
77
  type: :development
92
78
  prerelease: false
93
- version_requirements: *2152123560
79
+ version_requirements: *2156416760
94
80
  - !ruby/object:Gem::Dependency
95
81
  name: tailor
96
- requirement: &2152122640 !ruby/object:Gem::Requirement
82
+ requirement: &2156415980 !ruby/object:Gem::Requirement
97
83
  none: false
98
84
  requirements:
99
85
  - - ~>
@@ -101,10 +87,10 @@ dependencies:
101
87
  version: '0'
102
88
  type: :development
103
89
  prerelease: false
104
- version_requirements: *2152122640
90
+ version_requirements: *2156415980
105
91
  - !ruby/object:Gem::Dependency
106
92
  name: rake
107
- requirement: &2152122040 !ruby/object:Gem::Requirement
93
+ requirement: &2156415020 !ruby/object:Gem::Requirement
108
94
  none: false
109
95
  requirements:
110
96
  - - ~>
@@ -112,10 +98,10 @@ dependencies:
112
98
  version: 0.9.2.2
113
99
  type: :development
114
100
  prerelease: false
115
- version_requirements: *2152122040
101
+ version_requirements: *2156415020
116
102
  - !ruby/object:Gem::Dependency
117
103
  name: rack-test
118
- requirement: &2152121500 !ruby/object:Gem::Requirement
104
+ requirement: &2156413800 !ruby/object:Gem::Requirement
119
105
  none: false
120
106
  requirements:
121
107
  - - =
@@ -123,7 +109,7 @@ dependencies:
123
109
  version: 0.6.1
124
110
  type: :development
125
111
  prerelease: false
126
- version_requirements: *2152121500
112
+ version_requirements: *2156413800
127
113
  description: Interpol is a toolkit for working with API endpoint definition files,
128
114
  giving you a stub app, a schema validation middleware, and browsable documentation.
129
115
  email:
@@ -133,10 +119,11 @@ extensions: []
133
119
  extra_rdoc_files: []
134
120
  files:
135
121
  - README.md
136
- - License
122
+ - LICENSE
137
123
  - Gemfile
138
124
  - Rakefile
139
125
  - lib/interpol/configuration.rb
126
+ - lib/interpol/configuration_ruby_18_extensions.rb
140
127
  - lib/interpol/documentation.rb
141
128
  - lib/interpol/documentation_app/config.rb
142
129
  - lib/interpol/documentation_app.rb