angband 1.0.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9980627b5ac321dc430b1135d6c367aee06a1ddd
4
+ data.tar.gz: 64b4c433d8d51b9b3e9a9f965af77d1d582f435c
5
+ SHA512:
6
+ metadata.gz: 1d1ba056d9ba233fef4e04c9380ff668ecd623f92f5d1a63d4226b76e861b9780f0e5db33a288fa9e453c29086a9a93383229e9d3aedb29d74ef2d43967ac5e0
7
+ data.tar.gz: 398d072a4f0fb5a686e077bb2489b5190cff018384d8d247f62eef1cac7dd6dd7d87fd266bb2c5fddb26df6ff6fa24065e5e3759445e43815620189a7dbcc42e
@@ -0,0 +1,45 @@
1
+ require 'angband/formatter'
2
+ require 'angband/gherkin_finder'
3
+ require 'rack/accept_headers'
4
+
5
+ module Angband
6
+ class Documentation
7
+ def initialize(app)
8
+ @app = app
9
+ yield self if block_given?
10
+ end
11
+
12
+ def call(env)
13
+ response = Rack::AcceptHeaders.new(@app).call(env)
14
+
15
+ if options_request?(env) && successful?(response) && !cross_origin_request?(env)
16
+ features = Angband::GherkinFinder.new(@files).call(env['PATH_INFO'])
17
+ formatter = Angband::Formatter.new(env['rack-accept_headers.request'])
18
+
19
+ headers, content = formatter.call(features)
20
+ response[1].merge!(headers)
21
+ response[2] = [content]
22
+ end
23
+
24
+ response
25
+ end
26
+
27
+ def configure(files)
28
+ @files = files
29
+ end
30
+
31
+ private
32
+
33
+ def cross_origin_request?(env)
34
+ env['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] || env['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']
35
+ end
36
+
37
+ def options_request?(env)
38
+ 'OPTIONS' == env['REQUEST_METHOD']
39
+ end
40
+
41
+ def successful?(response)
42
+ 200 == response[0].to_i
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ require 'mustache'
2
+
3
+ module Angband
4
+ class Formatter
5
+ def initialize(accept_headers)
6
+ @accept_headers = accept_headers
7
+ end
8
+
9
+ def call(features)
10
+ case @accept_headers.media_type.best_of(['application/vnd.gherkin', 'text/html'])
11
+ when 'text/html'
12
+ [
13
+ {'Content-Type' => 'text/html'},
14
+ render('templates/html.mustache', features)
15
+ ]
16
+ else
17
+ [
18
+ {'Content-Type' => 'application/vnd.gherkin'},
19
+ render('templates/plain.mustache', features)
20
+ ]
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def render(file, features)
27
+ Mustache.render(
28
+ File.read(File.expand_path("../../#{file}", __FILE__)),
29
+ :features => features
30
+ ).strip
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ require 'angband/gherkin_listener'
2
+ require 'gherkin/lexer/i18n_lexer'
3
+
4
+ module Angband
5
+ class GherkinFinder
6
+ def initialize(gherkin_files)
7
+ @gherkin_files = gherkin_files
8
+ end
9
+
10
+ def call(path_info)
11
+ listener = Angband::GherkinListener.new
12
+ lexer = Gherkin::Lexer::I18nLexer.new(listener)
13
+
14
+ listener.on(:tag) do |tag|
15
+ @path_matched = true if %r{^#{tag}$} === "@#{path_info}"
16
+ end
17
+
18
+ result = @gherkin_files.map do |file|
19
+ @path_matched = false
20
+ gherkin = File.read(file)
21
+ lexer.scan(gherkin)
22
+ gherkin if @path_matched
23
+ end
24
+
25
+ result.compact
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,18 @@
1
+ module Angband
2
+ class GherkinListener
3
+ def initialize
4
+ @callbacks = {}
5
+ end
6
+
7
+ def on(event, &block)
8
+ @callbacks[event] = block
9
+ end
10
+
11
+ [:comment, :tag, :feature, :background, :scenario, :scenario_outline, :examples, :step, :doc_string, :row, :eof, :uri, :syntax_error].each do |method|
12
+ define_method(method) do |*args|
13
+ callback = @callbacks[method]
14
+ callback.call(*args) if callback
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Angband
2
+ VERSION = '1.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: angband
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Sittercity
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gherkin
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.12'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mustache
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.99'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.99'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack-accept_headers
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.5.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.5.0
55
+ description:
56
+ email:
57
+ - dev@sittercity.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - lib/angband/documentation.rb
63
+ - lib/angband/formatter.rb
64
+ - lib/angband/gherkin_finder.rb
65
+ - lib/angband/gherkin_listener.rb
66
+ - lib/angband/version.rb
67
+ homepage: http://sittercity.com
68
+ licenses:
69
+ - ISC
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project:
87
+ rubygems_version: 2.2.2
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: Self-Documenting APIs for Rack applications
91
+ test_files: []