Skip to content

Instantly share code, notes, and snippets.

@juanazam
Created July 29, 2015 17:58
Show Gist options
  • Save juanazam/5a551df902922191bec9 to your computer and use it in GitHub Desktop.
Save juanazam/5a551df902922191bec9 to your computer and use it in GitHub Desktop.
Ejercicio para el jueves tecnico!

Hagamos una gema!

Requisitos

  • Tener ruby andando (de 1.8 para arriba vamos a estar bien)
  • Tener instalado bundler.
  • Tener algun servidor de base de datos, sqlite, mysql o postgres andando.
  • Tener un pequeño proyecto de prueba instalado.

Proyecto de prueba

El proyecto tiene que tener el siguiente Gemfile.

source "https://rubygems.org/"

gem "sequel"
gem "sqlite3"

y un archivo database con el siguiente contenido

require 'sequel'

DB = Sequel.sqlite # memory database

DB.create_table :items do
  primary_key :id
  String :name
  Float :price
end

Requisitos de la gema

Queremos hacer una gema que implemente proxies a la consultas que se van a ejecutar en la base de datos a traves de la interfaz que nos provee Sequel.

Queremos poder definir algo de este estilo:

require 'sequel_proxy'

class SimpleProxy < SequelProxy::BaseProxy
  def execute(sql, opts = nil, &block)
    puts "Proxied"
    super
  end
end

SequelProxy.configure do |config|
  config.adapter adaptador_sql_lite_de_sequel
  config.use SimpleProxy
end

SequelProxy.enable!

Para eso vamos a crear una gema con bundler!

http://bundler.io/v1.10/rubygems.html

Test de integracion de lo que quisieramos tener andando:

describe "integration tests" do
  before do
    module Sequel::Dummy; end
    class ::Sequel::Dummy::Database
      def execute(sql, options = nil, &block)
        sql
      end
    end

    class DummyProxy < BaseProxy
      def execute(sql, options = nil, &block)
        if sql =~ /users/
          sql.gsub!('users', 'new_users')
        end
        super
      end
    end

    SequelProxy.configure do |conf|
      conf.adapter ::Sequel::Dummy::Database
      conf.use DummyProxy
    end

    SequelProxy.enable!
  end

  it "runs all configured proxies in order" do
    ::Sequel::Dummy::Database.new.execute("SELECT * FROM users").must_equal("SELECT * FROM new_users")
  end
end

Como prueba final, incluir la gema en el proyecto de prueba, y agregar el snippet de código de la seccion requsitos de la gema y verificar que el proxy funciona en el proyecto, y que no afecta el funcionamiento de Sequel en si mismo (las consultas siguen funcionando).

Recursos que vale la pena leer

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment