almodovar-server 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 042adda5c5a864f06ab2fc981ff6edf4dcca6e50
4
+ data.tar.gz: 37f2b4006bd09723713318a1038818267a7f2532
5
+ SHA512:
6
+ metadata.gz: fa3861f56194e80b8305e5b9a01025d1cab8e7a2ed7fec1a8b03bb145879b2cb6a0f81bd0520b0bb2074bbd94cfb89cb0bfb148ec5ea9e1f27f5d4db91a774e2
7
+ data.tar.gz: fe49bd306bee95c790921053144d8e8bb9ff88742e5704e5f7fe9db48ca40b50447eb925f94e62d68685a1e9a821ebdecc21ba17ee1de02ab5c3950f6dac41f4
@@ -0,0 +1,5 @@
1
+ =Almodovar Server Components {<img src="http://travis-ci.org/bebanjo/almodovar-server.png" />}[http://travis-ci.org/bebanjo/almodovar-server]
2
+
3
+ Server components to ease the creation of the awesome BeBanjo APIs
4
+
5
+ Copyright (c) 2010 BeBanjo S.L., released under the MIT license
@@ -0,0 +1,11 @@
1
+ require 'nokogiri'
2
+ begin
3
+ require 'active_support/all'
4
+ rescue LoadError
5
+ require 'active_support'
6
+ end
7
+
8
+ require 'almodovar-server/version' unless defined?(Almodovar::SERVER_VERSION)
9
+ require 'almodovar-server/resource_presenter'
10
+ require 'almodovar-server/resource_presenter/collection'
11
+ require 'almodovar-server/resource_presenter/link'
@@ -0,0 +1,61 @@
1
+ module Almodovar
2
+
3
+ class ResourcePresenter
4
+
5
+ autoload :Serializer, 'almodovar-server/resource_presenter/serializer'
6
+ autoload :XmlSerializer, 'almodovar-server/resource_presenter/xml_serializer'
7
+ autoload :JsonSerializer, 'almodovar-server/resource_presenter/json_serializer'
8
+ autoload :HtmlSerializer, 'almodovar-server/resource_presenter/html_serializer'
9
+ autoload :Metadata, 'almodovar-server/resource_presenter/metadata'
10
+
11
+ extend Metadata
12
+
13
+ attr_accessor :url
14
+
15
+ def attributes
16
+ @attributes ||= ActiveSupport::OrderedHash.new
17
+ end
18
+
19
+ def links
20
+ @links ||= []
21
+ end
22
+
23
+ def self.resource_type
24
+ name.gsub(/Resource$/, '').underscore
25
+ end
26
+
27
+ def resource_class
28
+ self.class
29
+ end
30
+
31
+ def resource_type
32
+ resource_class.resource_type
33
+ end
34
+
35
+ def to_xml(options = {})
36
+ XmlSerializer.new(self, options).to_xml
37
+ end
38
+
39
+ def to_json(options = {})
40
+ JsonSerializer.new(self, options).to_json
41
+ end
42
+
43
+ def as_json(options = {})
44
+ JsonSerializer.new(self, options).as_json
45
+ end
46
+
47
+ def to_html(options = {})
48
+ HtmlSerializer.new(self, options).to_html
49
+ end
50
+
51
+ def all_links
52
+ ([link_to_self] + links).compact
53
+ end
54
+
55
+ def link_to_self
56
+ Link.new(:self, @url) if @url
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,69 @@
1
+ module Almodovar
2
+ class ResourcePresenter
3
+ class Collection
4
+
5
+ attr_reader :resource_class
6
+
7
+ def initialize(resource_class, resources_args = [], options = {})
8
+ @resource_class = resource_class
9
+ @resources = resources_args.map { |arg| @resource_class.new(arg) }
10
+
11
+ @total = options[:total_entries]
12
+ @next = options[:next_link]
13
+ @prev = options[:prev_link]
14
+ end
15
+
16
+ def to_xml(options = {})
17
+ # Most of the following code is borrowed from ActiveSupport's Array#to_xml.
18
+ # We cannot use Array#to_xml because we need to add a few custom tags for
19
+ # pagination.
20
+ require 'active_support/builder' unless defined?(Builder)
21
+
22
+ options = options.dup
23
+ options[:indent] ||= 2
24
+ options[:builder] ||= ::Builder::XmlMarkup.new(:indent => options[:indent])
25
+
26
+ xml = options[:builder]
27
+
28
+ xml.instruct! unless options[:skip_instruct]
29
+ xml.tag! resource_type.pluralize.dasherize, :type => 'array' do
30
+ xml.tag!('total-entries', @total) if @total
31
+ prev_link.to_xml(:builder => xml) if prev_link
32
+ next_link.to_xml(:builder => xml) if next_link
33
+ @resources.each { |value| value.to_xml(options.merge(:root => resource_type.singularize, :skip_instruct => true)) }
34
+ end
35
+ end
36
+
37
+ def as_json(options = {})
38
+ message = ActiveSupport::OrderedHash.new.tap do |message|
39
+ message[:total_entries] = @total if @total
40
+ message.merge! prev_link.as_json if prev_link
41
+ message.merge! next_link.as_json if next_link
42
+ message[:entries] = @resources.map { |resource| resource.as_json(options) }
43
+ end
44
+ end
45
+
46
+ def to_json(options = {})
47
+ require 'yajl'
48
+ Yajl::Encoder.encode(as_json(options), :pretty => true) + "\n"
49
+ end
50
+
51
+ def to_html(options = {})
52
+ HtmlSerializer.new(self, options).to_html
53
+ end
54
+
55
+ def resource_type
56
+ @resource_class.resource_type
57
+ end
58
+
59
+ def next_link
60
+ Link.new(:next, @next) if @next
61
+ end
62
+
63
+ def prev_link
64
+ Link.new(:prev, @prev) if @prev
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,44 @@
1
+ %w(pygments.rb github-markdown).each do |lib|
2
+ begin
3
+ require lib.gsub('-', '/')
4
+ rescue LoadError => ex
5
+ raise ex, "In order to use the HtmlSerializer you need the gem `#{lib}` in your Gemfile"
6
+ end
7
+ end
8
+
9
+ module Almodovar
10
+ class ResourcePresenter
11
+ class HtmlSerializer < Serializer
12
+
13
+ TEMPLATE_PATH = File.join(File.dirname(__FILE__), 'template.html.erb')
14
+
15
+ def to_html
16
+ template = File.read(TEMPLATE_PATH)
17
+ ERB.new(template).result(binding)
18
+ end
19
+
20
+ def metadata
21
+ resource.resource_class.metadata
22
+ end
23
+
24
+ def beautify(representation, format)
25
+ body = Pygments.highlight(representation, :lexer => format)
26
+ body = body.gsub(/&quot;(http\S+)&quot;/) { url = $1; "&quot;<a href=\"#{url}\">#{url}</a>&quot;" }
27
+ body.html_safe
28
+ end
29
+
30
+ def metadata_text(text)
31
+ return if text.blank?
32
+
33
+ if indentation = text[/\n\s+/]
34
+ text = text.gsub(indentation, "\n")
35
+ end
36
+
37
+ text = text.strip
38
+ text = GitHub::Markdown.render text
39
+ text.html_safe
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,31 @@
1
+ module Almodovar
2
+ class ResourcePresenter
3
+ class JsonSerializer < Serializer
4
+
5
+ def to_json
6
+ require 'yajl'
7
+ Yajl::Encoder.encode(as_json, :pretty => true) + "\n"
8
+ end
9
+
10
+ def as_json
11
+ ActiveSupport::OrderedHash[:resource_type, resource.resource_type].tap do |message|
12
+ message.merge! attributes_as_json
13
+ message.merge! links_as_json
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def attributes_as_json
20
+ resource.attributes
21
+ end
22
+
23
+ def links_as_json
24
+ resource.all_links.inject(ActiveSupport::OrderedHash.new) do |message, link|
25
+ message.merge! link.as_json(options_for_link)
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,104 @@
1
+ module Almodovar
2
+ class ResourcePresenter
3
+ class Link
4
+
5
+ attr_reader :rel, :href, :expand_resource, :expand_args, :attributes
6
+
7
+ def initialize(*args)
8
+ @rel, @href, @expand_resource, @expand_args, @attributes = args
9
+ @attributes ||= {}
10
+ end
11
+
12
+ def to_xml(options = {})
13
+ XmlSerializer.new(self, options.merge(:skip_instruct => true)).to_xml
14
+ end
15
+
16
+ def as_json(options = {})
17
+ JsonSerializer.new(self, options).as_json
18
+ end
19
+
20
+ def resource
21
+ resource_collection? ? resource_collection : single_resource
22
+ end
23
+
24
+ def resource_collection?
25
+ expand_args.is_a?(Array)
26
+ end
27
+
28
+ def resource_collection
29
+ ResourcePresenter::Collection.new(expand_resource, expand_args)
30
+ end
31
+
32
+ def single_resource
33
+ expand_resource.new(*[expand_args].compact)
34
+ end
35
+
36
+ def expand_resource?
37
+ expand_resource.present?
38
+ end
39
+
40
+ class Serializer
41
+
42
+ attr_reader :link, :options
43
+
44
+ def initialize(link, options)
45
+ @link = link
46
+ @options = options
47
+ end
48
+
49
+ def expands?
50
+ link.expand_resource? &&
51
+ Array(options[:expand]).include?(link.rel) &&
52
+ !Array(options[:dont_expand]).include?(link.href)
53
+ end
54
+
55
+ def dont_expand_link!
56
+ (options[:dont_expand] ||= []) << link.href
57
+ end
58
+
59
+ end
60
+
61
+ class XmlSerializer < Serializer
62
+
63
+ def to_xml
64
+ builder.link link.attributes.merge(:rel => link.rel, :href => link.href), &expand_block
65
+ end
66
+
67
+ private
68
+
69
+ def builder
70
+ options[:builder]
71
+ end
72
+
73
+ def expand_block
74
+ Proc.new { expand_resource } if expands?
75
+ end
76
+
77
+ def expand_resource
78
+ dont_expand_link!
79
+ link.resource.to_xml(options)
80
+ end
81
+
82
+ end
83
+
84
+ class JsonSerializer < Serializer
85
+
86
+ def as_json
87
+ ActiveSupport::OrderedHash.new.tap do |message|
88
+ message["#{link.rel}_link"] = link.href
89
+ message[link.rel] = expand_resource if expands?
90
+ end
91
+ end
92
+
93
+ private
94
+
95
+ def expand_resource
96
+ dont_expand_link!
97
+ link.resource.as_json(options)
98
+ end
99
+
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,27 @@
1
+ module Almodovar
2
+ class ResourcePresenter
3
+ module Metadata
4
+
5
+ def inherited(base)
6
+ base.metadata[:name] = base.name.demodulize.titleize
7
+ end
8
+
9
+ def desc(description)
10
+ metadata[:desc] = description
11
+ end
12
+
13
+ def link(name, options)
14
+ metadata[:links][name] = options
15
+ end
16
+
17
+ def attribute(name, options)
18
+ metadata[:attributes][name] = options
19
+ end
20
+
21
+ def metadata
22
+ @metadata ||= Hash.new {|h,a| h[a] = ActiveSupport::OrderedHash.new}
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,18 @@
1
+ module Almodovar
2
+ class ResourcePresenter
3
+ class Serializer
4
+
5
+ attr_reader :resource, :options
6
+
7
+ def initialize(resource, options = {})
8
+ @resource = resource
9
+ @options = options
10
+ end
11
+
12
+ def options_for_link
13
+ options.merge(:dont_expand => Array(options[:dont_expand]) << resource.url)
14
+ end
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,125 @@
1
+ <!DOCTYPE html>
2
+ <html lang='en'>
3
+ <head>
4
+ <meta charset='utf-8'/>
5
+ <style type='text/css'>
6
+ .highlight .hll { background-color: #ffffcc }
7
+ .highlight { background: #f8f8f8; }
8
+ .highlight .c { color: #408080; font-style: italic } /* Comment */
9
+ .highlight .err { border: 1px solid #FF0000 } /* Error */
10
+ .highlight .k { color: #008000; font-weight: bold } /* Keyword */
11
+ .highlight .o { color: #666666 } /* Operator */
12
+ .highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
13
+ .highlight .cp { color: #BC7A00 } /* Comment.Preproc */
14
+ .highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
15
+ .highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
16
+ .highlight .gd { color: #A00000 } /* Generic.Deleted */
17
+ .highlight .ge { font-style: italic } /* Generic.Emph */
18
+ .highlight .gr { color: #FF0000 } /* Generic.Error */
19
+ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
20
+ .highlight .gi { color: #00A000 } /* Generic.Inserted */
21
+ .highlight .go { color: #808080 } /* Generic.Output */
22
+ .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
23
+ .highlight .gs { font-weight: bold } /* Generic.Strong */
24
+ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
25
+ .highlight .gt { color: #0040D0 } /* Generic.Traceback */
26
+ .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
27
+ .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
28
+ .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
29
+ .highlight .kp { color: #008000 } /* Keyword.Pseudo */
30
+ .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
31
+ .highlight .kt { color: #B00040 } /* Keyword.Type */
32
+ .highlight .m { color: #666666 } /* Literal.Number */
33
+ .highlight .s { color: #BA2121 } /* Literal.String */
34
+ .highlight .na { color: #7D9029 } /* Name.Attribute */
35
+ .highlight .nb { color: #008000 } /* Name.Builtin */
36
+ .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
37
+ .highlight .no { color: #880000 } /* Name.Constant */
38
+ .highlight .nd { color: #AA22FF } /* Name.Decorator */
39
+ .highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
40
+ .highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
41
+ .highlight .nf { color: #0000FF } /* Name.Function */
42
+ .highlight .nl { color: #A0A000 } /* Name.Label */
43
+ .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
44
+ .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
45
+ .highlight .nv { color: #19177C } /* Name.Variable */
46
+ .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
47
+ .highlight .w { color: #bbbbbb } /* Text.Whitespace */
48
+ .highlight .mf { color: #666666 } /* Literal.Number.Float */
49
+ .highlight .mh { color: #666666 } /* Literal.Number.Hex */
50
+ .highlight .mi { color: #666666 } /* Literal.Number.Integer */
51
+ .highlight .mo { color: #666666 } /* Literal.Number.Oct */
52
+ .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
53
+ .highlight .sc { color: #BA2121 } /* Literal.String.Char */
54
+ .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
55
+ .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
56
+ .highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
57
+ .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
58
+ .highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
59
+ .highlight .sx { color: #008000 } /* Literal.String.Other */
60
+ .highlight .sr { color: #BB6688 } /* Literal.String.Regex */
61
+ .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
62
+ .highlight .ss { color: #19177C } /* Literal.String.Symbol */
63
+ .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
64
+ .highlight .vc { color: #19177C } /* Name.Variable.Class */
65
+ .highlight .vg { color: #19177C } /* Name.Variable.Global */
66
+ .highlight .vi { color: #19177C } /* Name.Variable.Instance */
67
+ .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
68
+
69
+ body {
70
+ padding-top: 30px;
71
+ }
72
+ </style>
73
+ <link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet">
74
+ </head>
75
+ <body>
76
+ <div class='container'>
77
+
78
+ <ul class="nav nav-tabs">
79
+ <li><a href="#xml" data-toggle="tab">XML</a> </li>
80
+ <li><a href="#help" data-toggle="tab">Reference</a> </li>
81
+ </ul>
82
+
83
+ <div class="tab-content">
84
+ <div class="tab-pane" id="xml">
85
+ <%= beautify resource.to_xml(options), :xml %>
86
+ </div>
87
+ <div class="tab-pane" id="help">
88
+ <h2><%= metadata[:name] %></h2>
89
+ <%= metadata_text metadata[:desc] %>
90
+ <% if metadata[:attributes].present? %>
91
+ <h3>Attributes</h3>
92
+ <dl>
93
+ <% metadata[:attributes].each do |name, options| %>
94
+ <dt><%= name %></dt>
95
+ <dd><%= metadata_text options[:desc] %></dd>
96
+ <% end %>
97
+ </dl>
98
+ <% end %>
99
+ <% if metadata[:links].present? %>
100
+ <h3>Links</h3>
101
+ <dl>
102
+ <% metadata[:links].each do |name, options| %>
103
+ <dt><%= name %></dt>
104
+ <dd><%= metadata_text options[:desc] %></dd>
105
+ <% end %>
106
+ </dl>
107
+ <% end %>
108
+ </div>
109
+ </div>
110
+
111
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
112
+ <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>
113
+ <script>
114
+ $(function () {
115
+ var currentTab = localStorage.currentTab || '#xml'
116
+ $('ul.nav a[href="' + currentTab + '"]').tab('show')
117
+
118
+ $('a[data-toggle="tab"]').on('shown', function (e) {
119
+ localStorage.currentTab = $(e.target).attr('href')
120
+ })
121
+ })
122
+ </script>
123
+ </div>
124
+ </body>
125
+ </html>
@@ -0,0 +1,25 @@
1
+ module Almodovar
2
+ class ResourcePresenter
3
+ class XmlSerializer < Serializer
4
+
5
+ def to_xml
6
+ attributes_to_xml do |builder|
7
+ links_to_xml builder
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def attributes_to_xml(&block)
14
+ resource.attributes.to_xml(options.merge(:root => resource.resource_type), &block)
15
+ end
16
+
17
+ def links_to_xml(builder)
18
+ resource.all_links.each do |link|
19
+ link.to_xml(options_for_link.merge(:builder => builder))
20
+ end
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module Almodovar
2
+ SERVER_VERSION = '0.1.0'
3
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: almodovar-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - BeBanjo S.L.
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: builder
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: i18n
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yajl-ruby
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email: ballsbreaking@bebanjo.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files:
88
+ - README.rdoc
89
+ files:
90
+ - README.rdoc
91
+ - lib/almodovar-server/resource_presenter/collection.rb
92
+ - lib/almodovar-server/resource_presenter/html_serializer.rb
93
+ - lib/almodovar-server/resource_presenter/json_serializer.rb
94
+ - lib/almodovar-server/resource_presenter/link.rb
95
+ - lib/almodovar-server/resource_presenter/metadata.rb
96
+ - lib/almodovar-server/resource_presenter/serializer.rb
97
+ - lib/almodovar-server/resource_presenter/template.html.erb
98
+ - lib/almodovar-server/resource_presenter/xml_serializer.rb
99
+ - lib/almodovar-server/resource_presenter.rb
100
+ - lib/almodovar-server/version.rb
101
+ - lib/almodovar-server.rb
102
+ homepage: http://github.com/bebanjo/almodovar-server/
103
+ licenses: []
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options:
107
+ - --main
108
+ - README.rdoc
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 2.0.6
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: BeBanjo API server components
127
+ test_files: []