nyny 1.0.2 → 2.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 +4 -4
- data/CHANGELOG +9 -0
- data/README.md +59 -5
- data/examples/active_record/Gemfile +1 -0
- data/examples/active_record/database.rb +1 -0
- data/examples/data_mapper/database.rb +1 -1
- data/examples/data_mapper/db/.gitignore +1 -0
- data/examples/web_sockets/Gemfile +4 -0
- data/lib/nyny/app.rb +5 -7
- data/lib/nyny/{runner.rb → core-ext/runner.rb} +0 -0
- data/lib/nyny/request_scope.rb +10 -8
- data/lib/nyny/route_signature.rb +7 -16
- data/lib/nyny/version.rb +1 -1
- data/lib/nyny.rb +9 -2
- data/spec/app_spec.rb +25 -4
- data/spec/runner_spec.rb +9 -16
- metadata +6 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: fa8bdccd5f35a66eaa05e512117950e230350185
         | 
| 4 | 
            +
              data.tar.gz: 9932d345a2b696477bb9eef615671ce9db598de1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 941652c537350c79204235b9d62af1dd7a55f0e2074a4c75043fad5f793c5ec87c1f85f6d02ec28d7df3286ac56270b1f2d7aaef07f272d5480ae6f13db3ea27
         | 
| 7 | 
            +
              data.tar.gz: a4a63feaf107bc95a0981f7b087c2a1e03d918bcf63fc1fbe23d3bf3e059a39b3124f3f8c5582fc03563deb4ca3866e3542f1803d6ca58186e03a36954aafb6f
         | 
    
        data/CHANGELOG
    ADDED
    
    | @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            2.0.0
         | 
| 2 | 
            +
              - Simplified and improved RouteSignature implementation
         | 
| 3 | 
            +
              - Simplified and improved RequestScope implementation
         | 
| 4 | 
            +
              - Made response object available in RequestScope
         | 
| 5 | 
            +
              - removed .use_protection! (the rack-protection) middleware can be easily
         | 
| 6 | 
            +
                used manually
         | 
| 7 | 
            +
              - add .register, which registers an extension (works the same way as in sinatra)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            1.0.0 Initial release
         | 
    
        data/README.md
    CHANGED
    
    | @@ -4,6 +4,8 @@ | |
| 4 4 | 
             
            [](https://travis-ci.org/alisnic/nyny)
         | 
| 5 5 | 
             
            [](https://coveralls.io/r/alisnic/nyny)
         | 
| 6 6 | 
             
            [](https://codeclimate.com/repos/521b7ee513d637348712864a/feed)
         | 
| 7 | 
            +
            [](https://gemnasium.com/alisnic/nyny)
         | 
| 8 | 
            +
            [](http://badge.fury.io/rb/nyny)
         | 
| 7 9 |  | 
| 8 10 | 
             
                # myapp.rb
         | 
| 9 11 |  | 
| @@ -37,6 +39,7 @@ Open the browser at [http://localhost:9292](http://localhost:9292) | |
| 37 39 | 
             
                - [Filters](#filters)
         | 
| 38 40 | 
             
                - [Middleware](#middleware)
         | 
| 39 41 | 
             
                - [Helpers](#helpers)
         | 
| 42 | 
            +
                - [Extensions](#extensions)
         | 
| 40 43 | 
             
            - [FAQ](#f-a-q)
         | 
| 41 44 | 
             
            - [Contributing](#contributing)
         | 
| 42 45 |  | 
| @@ -138,8 +141,9 @@ As was said above, when you pass a block to a route definition, | |
| 138 141 | 
             
            that block is evaluated in the context of a [RequestScope][2].
         | 
| 139 142 | 
             
            This means that several methods/objects available inside that block:
         | 
| 140 143 |  | 
| 141 | 
            -
            - `request` - A `Rack::Request` object which encapsulates the request | 
| 144 | 
            +
            - `request` - A `Rack::Request` object which encapsulates the request
         | 
| 142 145 | 
             
              to that route. (see [Rack::Request documentation][3] for more info)
         | 
| 146 | 
            +
            - `response` - A `Rack::Response` object which encapsulates the response
         | 
| 143 147 | 
             
            - `params` - a hash which contains both POST body params and GET querystring params.
         | 
| 144 148 | 
             
            - `headers` - allows you to read/add headers to the response
         | 
| 145 149 | 
             
              (ex: `headers 'Content-Type' => 'text/html'`)
         | 
| @@ -175,10 +179,6 @@ if the request.path matches a pattern. | |
| 175 179 | 
             
                  end
         | 
| 176 180 | 
             
                end
         | 
| 177 181 |  | 
| 178 | 
            -
            Before and after filters are also evaluated in a RequestScope context.
         | 
| 179 | 
            -
            A little exception are the after filters, which can access
         | 
| 180 | 
            -
            the __response__ object ([Rack::Response][4]).
         | 
| 181 | 
            -
             | 
| 182 182 | 
             
            ## Middleware
         | 
| 183 183 |  | 
| 184 184 | 
             
            A NYNY app is a Rack middleware, which means that it can be used inside 
         | 
| @@ -211,6 +211,60 @@ Using a helper implies that the helper module is included in the [RequestScope][ | |
| 211 211 | 
             
            and that all the methods in that module will be available inside a route
         | 
| 212 212 | 
             
            definition block.
         | 
| 213 213 |  | 
| 214 | 
            +
            ## Extensions
         | 
| 215 | 
            +
             | 
| 216 | 
            +
            Since version 2.0.0, NYNY added support for extensions.
         | 
| 217 | 
            +
            This makes possible to include helpers, middlewares and custom app class
         | 
| 218 | 
            +
            methods inside a single module:
         | 
| 219 | 
            +
             | 
| 220 | 
            +
                module MyKewlExtension
         | 
| 221 | 
            +
                  class Middleware
         | 
| 222 | 
            +
                    def initialize app
         | 
| 223 | 
            +
                      @app = app
         | 
| 224 | 
            +
                    end
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                    def call env
         | 
| 227 | 
            +
                      env['KEWL'] = true
         | 
| 228 | 
            +
                      @app.call(env) if @app
         | 
| 229 | 
            +
                    end
         | 
| 230 | 
            +
                  end
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                  module Helpers
         | 
| 233 | 
            +
                    def the_ultimate_answer
         | 
| 234 | 
            +
                      42
         | 
| 235 | 
            +
                    end
         | 
| 236 | 
            +
                  end
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                  def get_or_post route, &block
         | 
| 239 | 
            +
                    get route, &block
         | 
| 240 | 
            +
                    post route, &block
         | 
| 241 | 
            +
                  end
         | 
| 242 | 
            +
             | 
| 243 | 
            +
                  def self.registered app
         | 
| 244 | 
            +
                    app.use Middleware
         | 
| 245 | 
            +
                    app.helpers Helpers
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                    app.get_or_post '/' do
         | 
| 248 | 
            +
                      "After many years of hard computation, the answer is #{the_ultimate_answer}"
         | 
| 249 | 
            +
                    end
         | 
| 250 | 
            +
                  end
         | 
| 251 | 
            +
                end
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                class App < NYNY::App
         | 
| 254 | 
            +
                  register MyKewlExtension
         | 
| 255 | 
            +
                end
         | 
| 256 | 
            +
             | 
| 257 | 
            +
                App.run!
         | 
| 258 | 
            +
             | 
| 259 | 
            +
            By default, the App class will `extend` the provided extension module.
         | 
| 260 | 
            +
            Optionally, an extension can add a `registered` method, which will be invoked
         | 
| 261 | 
            +
            once the extension is registered. That method will be called with the app class
         | 
| 262 | 
            +
            as a parameter.
         | 
| 263 | 
            +
             | 
| 264 | 
            +
            Since NYNY has the same extension interface as Sinatra, some Sinatra extensions
         | 
| 265 | 
            +
            might work with NYNY, although that is not guaranteed. However, an extension
         | 
| 266 | 
            +
            written for NYNY will always work with Sinatra. (Forward compatible)
         | 
| 267 | 
            +
             | 
| 214 268 | 
             
            # F. A. Q.
         | 
| 215 269 | 
             
            TBD.
         | 
| 216 270 |  | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            *.sqlite3
         | 
    
        data/lib/nyny/app.rb
    CHANGED
    
    | @@ -1,7 +1,6 @@ | |
| 1 1 | 
             
            module NYNY
         | 
| 2 2 | 
             
              class App
         | 
| 3 3 | 
             
                HTTP_VERBS = [:delete, :get, :head, :options, :patch, :post, :put, :trace]
         | 
| 4 | 
            -
                extend Runner
         | 
| 5 4 |  | 
| 6 5 | 
             
                attr_reader :middleware_chain, :router
         | 
| 7 6 | 
             
                def initialize app=nil
         | 
| @@ -36,12 +35,11 @@ module NYNY | |
| 36 35 | 
             
                  def before_hooks; @before_hooks ||= []  end
         | 
| 37 36 | 
             
                  def after_hooks;  @after_hooks  ||= []  end
         | 
| 38 37 |  | 
| 39 | 
            -
                   | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
                       | 
| 43 | 
            -
             | 
| 44 | 
            -
                      puts "WARN: to use protection, you must install 'rack-protection' gem"
         | 
| 38 | 
            +
                  # move middleware chain and runner to core-ext
         | 
| 39 | 
            +
                  def register *extensions
         | 
| 40 | 
            +
                    extensions.each do |ext|
         | 
| 41 | 
            +
                      extend ext
         | 
| 42 | 
            +
                      ext.registered(self) if ext.respond_to?(:registered)
         | 
| 45 43 | 
             
                    end
         | 
| 46 44 | 
             
                  end
         | 
| 47 45 |  | 
| 
            File without changes
         | 
    
        data/lib/nyny/request_scope.rb
    CHANGED
    
    | @@ -7,9 +7,8 @@ module NYNY | |
| 7 7 | 
             
                end
         | 
| 8 8 |  | 
| 9 9 | 
             
                def initialize request
         | 
| 10 | 
            -
                  @headers = {'Content-Type' => 'text/html'}
         | 
| 11 | 
            -
                  @status = 200
         | 
| 12 10 | 
             
                  @request = request
         | 
| 11 | 
            +
                  @response = Response.new '', 200, {'Content-Type' => 'text/html'}
         | 
| 13 12 | 
             
                end
         | 
| 14 13 |  | 
| 15 14 | 
             
                def params
         | 
| @@ -17,7 +16,7 @@ module NYNY | |
| 17 16 | 
             
                end
         | 
| 18 17 |  | 
| 19 18 | 
             
                def headers hash={}
         | 
| 20 | 
            -
                   | 
| 19 | 
            +
                  response.headers.merge! hash
         | 
| 21 20 | 
             
                end
         | 
| 22 21 |  | 
| 23 22 | 
             
                def session
         | 
| @@ -29,11 +28,14 @@ module NYNY | |
| 29 28 | 
             
                end
         | 
| 30 29 |  | 
| 31 30 | 
             
                def status code
         | 
| 32 | 
            -
                   | 
| 31 | 
            +
                  response.status = code
         | 
| 33 32 | 
             
                end
         | 
| 34 33 |  | 
| 35 34 | 
             
                def halt status, headers={}, body=''
         | 
| 36 | 
            -
                   | 
| 35 | 
            +
                  response.status = status
         | 
| 36 | 
            +
                  response.headers.merge! headers
         | 
| 37 | 
            +
                  response.body = body
         | 
| 38 | 
            +
                  throw :halt, response
         | 
| 37 39 | 
             
                end
         | 
| 38 40 |  | 
| 39 41 | 
             
                def redirect_to uri, status=302
         | 
| @@ -42,9 +44,9 @@ module NYNY | |
| 42 44 | 
             
                alias_method :redirect, :redirect_to
         | 
| 43 45 |  | 
| 44 46 | 
             
                def apply_to &handler
         | 
| 45 | 
            -
                   | 
| 46 | 
            -
                  cookies.each {|k,v|  | 
| 47 | 
            -
                   | 
| 47 | 
            +
                  response.body = instance_eval(&handler)
         | 
| 48 | 
            +
                  cookies.each {|k,v| response.set_cookie k,v }
         | 
| 49 | 
            +
                  response
         | 
| 48 50 | 
             
                end
         | 
| 49 51 | 
             
              end
         | 
| 50 52 | 
             
            end
         | 
    
        data/lib/nyny/route_signature.rb
    CHANGED
    
    | @@ -7,15 +7,14 @@ module NYNY | |
| 7 7 | 
             
                  @pattern = pattern_for signature
         | 
| 8 8 | 
             
                end
         | 
| 9 9 |  | 
| 10 | 
            -
                def pattern_for  | 
| 11 | 
            -
                  return  | 
| 12 | 
            -
                   | 
| 13 | 
            -
             | 
| 14 | 
            -
                  signature = string.start_with?('/') ? string : "/#{string}"
         | 
| 15 | 
            -
                  build_regex signature
         | 
| 10 | 
            +
                def pattern_for signature
         | 
| 11 | 
            +
                  return signature if signature.is_a? Regexp
         | 
| 12 | 
            +
                  build_regex(signature.start_with?('/') ? signature : "/#{signature}")
         | 
| 16 13 | 
             
                end
         | 
| 17 14 |  | 
| 18 15 | 
             
                def build_regex signature
         | 
| 16 | 
            +
                  return %r(^#{signature}$) unless signature.include?(':')
         | 
| 17 | 
            +
             | 
| 19 18 | 
             
                  groups = signature.split('/').map do |part|
         | 
| 20 19 | 
             
                    next part if part.empty?
         | 
| 21 20 | 
             
                    next part unless part.start_with? ':'
         | 
| @@ -23,21 +22,13 @@ module NYNY | |
| 23 22 | 
             
                    %Q{(?<#{name}>\\S+)}
         | 
| 24 23 | 
             
                  end.select {|s| !s.empty? }.join('\/')
         | 
| 25 24 |  | 
| 26 | 
            -
                  %r( | 
| 25 | 
            +
                  %r(^\/#{groups}$)
         | 
| 27 26 | 
             
                end
         | 
| 28 27 |  | 
| 29 28 | 
             
                def match path
         | 
| 30 | 
            -
                  return (pattern == path ? {} : nil) if pattern.is_a?(String)
         | 
| 31 29 | 
             
                  data = pattern.match path
         | 
| 32 | 
            -
             | 
| 33 30 | 
             
                  if data
         | 
| 34 | 
            -
                     | 
| 35 | 
            -
                      Hash[data.names.map {|n| [n.to_sym, URI.unescape(data[n])]}]
         | 
| 36 | 
            -
                    else
         | 
| 37 | 
            -
                      {}
         | 
| 38 | 
            -
                    end
         | 
| 39 | 
            -
                  else
         | 
| 40 | 
            -
                    nil
         | 
| 31 | 
            +
                    Hash[data.names.map {|n| [n.to_sym, URI.unescape(data[n])]}]
         | 
| 41 32 | 
             
                  end
         | 
| 42 33 | 
             
                end
         | 
| 43 34 | 
             
              end
         | 
    
        data/lib/nyny/version.rb
    CHANGED
    
    
    
        data/lib/nyny.rb
    CHANGED
    
    | @@ -5,7 +5,14 @@ require 'nyny/version' | |
| 5 5 | 
             
            require 'nyny/primitives'
         | 
| 6 6 | 
             
            require 'nyny/request_scope'
         | 
| 7 7 | 
             
            require 'nyny/route_signature'
         | 
| 8 | 
            -
            require 'nyny/runner'
         | 
| 9 8 | 
             
            require 'nyny/middleware_chain'
         | 
| 10 | 
            -
            require 'nyny/router'
         | 
| 11 9 | 
             
            require 'nyny/app'
         | 
| 10 | 
            +
            require 'nyny/router'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
            # Register core extensions
         | 
| 14 | 
            +
            require 'nyny/core-ext/runner'
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            module NYNY
         | 
| 17 | 
            +
              App.register NYNY::Runner
         | 
| 18 | 
            +
            end
         | 
    
        data/spec/app_spec.rb
    CHANGED
    
    | @@ -13,12 +13,29 @@ describe App do | |
| 13 13 | 
             
                response.status.should == 404
         | 
| 14 14 | 
             
              end
         | 
| 15 15 |  | 
| 16 | 
            -
              it ' | 
| 17 | 
            -
                 | 
| 18 | 
            -
                   | 
| 16 | 
            +
              it 'should able to register a extension' do
         | 
| 17 | 
            +
                module Foo
         | 
| 18 | 
            +
                  def foo
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                kls = mock_app_class {}
         | 
| 23 | 
            +
                kls.register(Foo)
         | 
| 24 | 
            +
                kls.should respond_to(:foo)
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              it 'should call registered method on extension' do
         | 
| 28 | 
            +
                module Foo
         | 
| 29 | 
            +
                  def self.registered app
         | 
| 30 | 
            +
                    #
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                class SomeApp < NYNY::App
         | 
| 19 35 | 
             
                end
         | 
| 20 36 |  | 
| 21 | 
            -
                 | 
| 37 | 
            +
                Foo.should_receive(:registered).with(SomeApp)
         | 
| 38 | 
            +
                SomeApp.register(Foo)
         | 
| 22 39 | 
             
              end
         | 
| 23 40 |  | 
| 24 41 | 
             
              it 'should match a route for any supported verbs' do
         | 
| @@ -37,6 +54,10 @@ describe App do | |
| 37 54 |  | 
| 38 55 | 
             
              it 'should support route patterns' do
         | 
| 39 56 | 
             
                app = mock_app do
         | 
| 57 | 
            +
                  get '/some/:name' do
         | 
| 58 | 
            +
                    'foo'
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
             | 
| 40 61 | 
             
                  get '/:name' do
         | 
| 41 62 | 
             
                    "hello #{params[:name]}"
         | 
| 42 63 | 
             
                  end
         | 
    
        data/spec/runner_spec.rb
    CHANGED
    
    | @@ -1,23 +1,16 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 |  | 
| 3 3 | 
             
            describe Runner do
         | 
| 4 | 
            -
               | 
| 5 | 
            -
                before do
         | 
| 6 | 
            -
                  handler = begin
         | 
| 7 | 
            -
                              Rack::Handler::Thin
         | 
| 8 | 
            -
                            rescue LoadError
         | 
| 9 | 
            -
                              Rack::Handler::WEBrick
         | 
| 10 | 
            -
                            end
         | 
| 11 | 
            -
                  handler.stub :run
         | 
| 12 | 
            -
                end
         | 
| 4 | 
            +
              let (:kls) { mock_app_class {} }
         | 
| 13 5 |  | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 6 | 
            +
              before do
         | 
| 7 | 
            +
                kls.optimal_runner.stub :run
         | 
| 8 | 
            +
              end
         | 
| 17 9 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
                 | 
| 10 | 
            +
              it 'should include the default middleware on top' do
         | 
| 11 | 
            +
                kls.run!
         | 
| 12 | 
            +
                kls.middlewares.first.should == Rack::ShowExceptions
         | 
| 13 | 
            +
                kls.middlewares[1].should == Rack::CommonLogger
         | 
| 22 14 | 
             
              end
         | 
| 15 | 
            +
             | 
| 23 16 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: nyny
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 2.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Andrei Lisnic
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2013-09- | 
| 11 | 
            +
            date: 2013-09-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rack
         | 
| @@ -77,6 +77,7 @@ files: | |
| 77 77 | 
             
            - .rspec
         | 
| 78 78 | 
             
            - .ruby-version
         | 
| 79 79 | 
             
            - .travis.yml
         | 
| 80 | 
            +
            - CHANGELOG
         | 
| 80 81 | 
             
            - Gemfile
         | 
| 81 82 | 
             
            - LICENSE.txt
         | 
| 82 83 | 
             
            - Performance.md
         | 
| @@ -100,11 +101,13 @@ files: | |
| 100 101 | 
             
            - examples/active_record/server.rb
         | 
| 101 102 | 
             
            - examples/data_mapper/Gemfile
         | 
| 102 103 | 
             
            - examples/data_mapper/database.rb
         | 
| 104 | 
            +
            - examples/data_mapper/db/.gitignore
         | 
| 103 105 | 
             
            - examples/data_mapper/models/shout.rb
         | 
| 104 106 | 
             
            - examples/data_mapper/server.rb
         | 
| 105 107 | 
             
            - examples/json_api.rb
         | 
| 106 108 | 
             
            - examples/templates/server.rb
         | 
| 107 109 | 
             
            - examples/templates/views/index.haml
         | 
| 110 | 
            +
            - examples/web_sockets/Gemfile
         | 
| 108 111 | 
             
            - examples/web_sockets/public/FABridge.js
         | 
| 109 112 | 
             
            - examples/web_sockets/public/WebSocketMain.swf
         | 
| 110 113 | 
             
            - examples/web_sockets/public/index.html
         | 
| @@ -113,12 +116,12 @@ files: | |
| 113 116 | 
             
            - examples/web_sockets/server.rb
         | 
| 114 117 | 
             
            - lib/nyny.rb
         | 
| 115 118 | 
             
            - lib/nyny/app.rb
         | 
| 119 | 
            +
            - lib/nyny/core-ext/runner.rb
         | 
| 116 120 | 
             
            - lib/nyny/middleware_chain.rb
         | 
| 117 121 | 
             
            - lib/nyny/primitives.rb
         | 
| 118 122 | 
             
            - lib/nyny/request_scope.rb
         | 
| 119 123 | 
             
            - lib/nyny/route_signature.rb
         | 
| 120 124 | 
             
            - lib/nyny/router.rb
         | 
| 121 | 
            -
            - lib/nyny/runner.rb
         | 
| 122 125 | 
             
            - lib/nyny/version.rb
         | 
| 123 126 | 
             
            - nyny.gemspec
         | 
| 124 127 | 
             
            - spec/app_spec.rb
         |