elasticsearch-resources 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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +12 -0
- data/Gemfile +4 -0
- data/LICENSE +201 -0
- data/README.md +276 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/elasticsearch-resources.gemspec +32 -0
- data/lib/elasticsearch/resources.rb +35 -0
- data/lib/elasticsearch/resources/cluster.rb +59 -0
- data/lib/elasticsearch/resources/clusterable.rb +34 -0
- data/lib/elasticsearch/resources/configurable.rb +52 -0
- data/lib/elasticsearch/resources/configuration.rb +11 -0
- data/lib/elasticsearch/resources/configuration/cluster.rb +67 -0
- data/lib/elasticsearch/resources/configuration/index.rb +45 -0
- data/lib/elasticsearch/resources/configuration/settings.rb +25 -0
- data/lib/elasticsearch/resources/configuration/type.rb +29 -0
- data/lib/elasticsearch/resources/describable.rb +49 -0
- data/lib/elasticsearch/resources/document.rb +73 -0
- data/lib/elasticsearch/resources/document_factory.rb +49 -0
- data/lib/elasticsearch/resources/identifiable.rb +34 -0
- data/lib/elasticsearch/resources/index.rb +108 -0
- data/lib/elasticsearch/resources/indexable.rb +34 -0
- data/lib/elasticsearch/resources/locales/en.yml +29 -0
- data/lib/elasticsearch/resources/nameable.rb +28 -0
- data/lib/elasticsearch/resources/queryable.rb +36 -0
- data/lib/elasticsearch/resources/resource.rb +39 -0
- data/lib/elasticsearch/resources/response_factory.rb +49 -0
- data/lib/elasticsearch/resources/type.rb +99 -0
- data/lib/elasticsearch/resources/typeable.rb +34 -0
- data/lib/elasticsearch/resources/version.rb +5 -0
- metadata +188 -0
    
        data/Rakefile
    ADDED
    
    
    
        data/bin/console
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "bundler/setup"
         | 
| 4 | 
            +
            require "elasticsearch/resources"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # You can add fixtures and/or initialization code here to make experimenting
         | 
| 7 | 
            +
            # with your gem easier. You can also use a different console, if you like.
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # (If you use this, don't forget to add pry to your Gemfile!)
         | 
| 10 | 
            +
            # require "pry"
         | 
| 11 | 
            +
            # Pry.start
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            require "irb"
         | 
| 14 | 
            +
            IRB.start
         | 
    
        data/bin/setup
    ADDED
    
    
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
            lib = File.expand_path('../lib', __FILE__)
         | 
| 3 | 
            +
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 4 | 
            +
            require 'elasticsearch/resources/version'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Gem::Specification.new do |spec|
         | 
| 7 | 
            +
              spec.name          = "elasticsearch-resources"
         | 
| 8 | 
            +
              spec.version       = Elasticsearch::Resources::VERSION
         | 
| 9 | 
            +
              spec.authors       = ["David Elner"]
         | 
| 10 | 
            +
              spec.email         = ["david@davidelner.com"]
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              spec.summary       = %q{Access well-known Elasticsearch indexes like resources.}
         | 
| 13 | 
            +
              spec.description   = %q{Allows you to strongly-type Elasticsearch types and query them more easily.}
         | 
| 14 | 
            +
              spec.homepage      = "https://github.com/delner/elasticsearch-resources"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              spec.files         = `git ls-files -z`.split("\x0").reject do |f|
         | 
| 17 | 
            +
                f.match(%r{^(test|spec|features)/})
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
              spec.bindir        = "exe"
         | 
| 20 | 
            +
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 21 | 
            +
              spec.require_paths = ["lib"]
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              spec.add_dependency "i18n", "~> 0.7"
         | 
| 24 | 
            +
              spec.add_dependency "elasticsearch", "~> 5.0"
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              spec.add_development_dependency "bundler", "~> 1.13"
         | 
| 27 | 
            +
              spec.add_development_dependency "rake", "~> 10.0"
         | 
| 28 | 
            +
              spec.add_development_dependency "pry", "~> 0.10"
         | 
| 29 | 
            +
              spec.add_development_dependency "rspec", "~> 3.0"
         | 
| 30 | 
            +
              spec.add_development_dependency "rspec-collection_matchers", "~> 1.1"
         | 
| 31 | 
            +
              spec.add_development_dependency "simplecov", "~> 0.12"
         | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # Load library dependencies
         | 
| 2 | 
            +
            require 'i18n'
         | 
| 3 | 
            +
            require 'elasticsearch'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # Load classes and modules
         | 
| 6 | 
            +
            require "elasticsearch/resources/version"
         | 
| 7 | 
            +
            require 'elasticsearch/resources/configuration'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            require 'elasticsearch/resources/configurable'
         | 
| 10 | 
            +
            require 'elasticsearch/resources/identifiable'
         | 
| 11 | 
            +
            require 'elasticsearch/resources/describable'
         | 
| 12 | 
            +
            require 'elasticsearch/resources/nameable'
         | 
| 13 | 
            +
            require 'elasticsearch/resources/clusterable'
         | 
| 14 | 
            +
            require 'elasticsearch/resources/indexable'
         | 
| 15 | 
            +
            require 'elasticsearch/resources/typeable'
         | 
| 16 | 
            +
            require 'elasticsearch/resources/queryable'
         | 
| 17 | 
            +
            require 'elasticsearch/resources/document_factory'
         | 
| 18 | 
            +
            require 'elasticsearch/resources/response_factory'
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            require 'elasticsearch/resources/resource'
         | 
| 21 | 
            +
            require 'elasticsearch/resources/document'
         | 
| 22 | 
            +
            require 'elasticsearch/resources/type'
         | 
| 23 | 
            +
            require 'elasticsearch/resources/index'
         | 
| 24 | 
            +
            require 'elasticsearch/resources/cluster'
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            module Elasticsearch
         | 
| 27 | 
            +
              module Resources
         | 
| 28 | 
            +
                def self.locales_paths
         | 
| 29 | 
            +
                  Dir[File.join(File.expand_path('../resources', __FILE__), '**/locales/*.yml')]
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            # Load i18n locales
         | 
| 35 | 
            +
            I18n.load_path += Elasticsearch::Resources.locales_paths
         | 
| @@ -0,0 +1,59 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                class Cluster
         | 
| 4 | 
            +
                  include Resource
         | 
| 5 | 
            +
                  include Queryable
         | 
| 6 | 
            +
                  include Configurable
         | 
| 7 | 
            +
                  include Nameable
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  define_configuration class_name: Configuration::Cluster
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize(&block)
         | 
| 12 | 
            +
                    configure(id: self.class.configuration.id, &block)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def setup!
         | 
| 16 | 
            +
                    client
         | 
| 17 | 
            +
                    super
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def client
         | 
| 21 | 
            +
                    settings.client
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def indexes
         | 
| 25 | 
            +
                    []
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  def search(body, options = {})
         | 
| 29 | 
            +
                    params = {
         | 
| 30 | 
            +
                      body: body
         | 
| 31 | 
            +
                    }.merge(options)
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    query(:search, params)
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def count(body, options = {})
         | 
| 37 | 
            +
                    params = {
         | 
| 38 | 
            +
                      body: body
         | 
| 39 | 
            +
                    }.merge(options)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    query(:count, params)
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  def find_cluster
         | 
| 45 | 
            +
                    self
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  def find_index(index:)
         | 
| 49 | 
            +
                    indexes.find do |i|
         | 
| 50 | 
            +
                      i.find_index(index: index)
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  def find_type(index:, type:)
         | 
| 55 | 
            +
                    find_index(index: index)&.find_type(index: index, type: type)
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                module Clusterable
         | 
| 4 | 
            +
                  def self.included(base)
         | 
| 5 | 
            +
                    base.extend(ClassMethods)
         | 
| 6 | 
            +
                    base.include(InstanceMethods)
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  module ClassMethods
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  module InstanceMethods
         | 
| 13 | 
            +
                    attr_reader :cluster
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    protected
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    def cluster=(cluster)
         | 
| 18 | 
            +
                      raise NullClusterError.new if cluster.nil?
         | 
| 19 | 
            +
                      @cluster = cluster
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  class NullClusterError < ArgumentError
         | 
| 24 | 
            +
                    def initialize
         | 
| 25 | 
            +
                      super(message)
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    def message
         | 
| 29 | 
            +
                      I18n.t('elasticsearch.resources.clusterable.null_cluster_error.message')
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                module Configurable
         | 
| 4 | 
            +
                  def self.included(base)
         | 
| 5 | 
            +
                    base.extend(ClassMethods)
         | 
| 6 | 
            +
                    base.include(InstanceMethods)
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  module ClassMethods
         | 
| 10 | 
            +
                    def configuration
         | 
| 11 | 
            +
                      @configuration ||= superclass.respond_to?(:configuration) ? superclass.configuration.dup : Configuration.new
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    protected
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    def define_configuration(options = {})
         | 
| 17 | 
            +
                      @configuration = configuration.tap do |c|
         | 
| 18 | 
            +
                        options.each do |name, value|
         | 
| 19 | 
            +
                          c.send("#{name.to_s}=", value) if c.respond_to?("#{name.to_s}=") && !value.nil?
         | 
| 20 | 
            +
                        end
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  module InstanceMethods
         | 
| 26 | 
            +
                    attr_reader :settings
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    def default_settings
         | 
| 29 | 
            +
                      default_expression = self.class.configuration.default
         | 
| 30 | 
            +
                      default_expression ? self.instance_exec(&default_expression) : nil
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    def configure(options = {}, &block)
         | 
| 34 | 
            +
                      @settings = default_settings&.dup || self.class.configuration.class_name&.new(**options)
         | 
| 35 | 
            +
                      settings.tap do |s|
         | 
| 36 | 
            +
                        yield(s) if block_given?
         | 
| 37 | 
            +
                      end
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  class Configuration
         | 
| 42 | 
            +
                    ATTRIBUTES = [:id, :class_name, :default].freeze
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    attr_accessor *ATTRIBUTES
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    def ==(obj)
         | 
| 47 | 
            +
                      ATTRIBUTES.all? { |a| obj.send(a) == self.send(a) }
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            require 'elasticsearch/resources/configuration/type'
         | 
| 2 | 
            +
            require 'elasticsearch/resources/configuration/index'
         | 
| 3 | 
            +
            require 'elasticsearch/resources/configuration/cluster'
         | 
| 4 | 
            +
            require 'elasticsearch/resources/configuration/settings'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Elasticsearch
         | 
| 7 | 
            +
              module Resources
         | 
| 8 | 
            +
                module Configuration
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
            end
         | 
| @@ -0,0 +1,67 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                module Configuration
         | 
| 4 | 
            +
                  class Cluster
         | 
| 5 | 
            +
                    attr_reader :id, :name
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                    def initialize(id:)
         | 
| 8 | 
            +
                      @id = id
         | 
| 9 | 
            +
                    end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                    def client
         | 
| 12 | 
            +
                      @client ||= Elasticsearch::Client.new(host: host)
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    def indexes
         | 
| 16 | 
            +
                      @indexes ||= default_indexes
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def index(id)
         | 
| 20 | 
            +
                      indexes.find { |t| t.id == id.to_sym }.tap do |t|
         | 
| 21 | 
            +
                        yield(t) if block_given?
         | 
| 22 | 
            +
                      end
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    def name=(name)
         | 
| 26 | 
            +
                      raise NullNameError.new if name.nil?
         | 
| 27 | 
            +
                      @name = name.to_s
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def host
         | 
| 31 | 
            +
                      @host ||= '127.0.0.1:9200'
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def host=(host)
         | 
| 35 | 
            +
                      raise NullHostError.new if host.nil?
         | 
| 36 | 
            +
                      @host = host
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    class NullNameError < ArgumentError
         | 
| 40 | 
            +
                      def initialize
         | 
| 41 | 
            +
                        super(message)
         | 
| 42 | 
            +
                      end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                      def message
         | 
| 45 | 
            +
                        I18n.t('elasticsearch.resources.configuration.cluster.null_name_error.message')
         | 
| 46 | 
            +
                      end
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    class NullHostError < ArgumentError
         | 
| 50 | 
            +
                      def initialize
         | 
| 51 | 
            +
                        super(message)
         | 
| 52 | 
            +
                      end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                      def message
         | 
| 55 | 
            +
                        I18n.t('elasticsearch.resources.configuration.cluster.null_host_error.message')
         | 
| 56 | 
            +
                      end
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    protected
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    def default_indexes
         | 
| 62 | 
            +
                      []
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            end
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                module Configuration
         | 
| 4 | 
            +
                  class Index
         | 
| 5 | 
            +
                    attr_reader :id, :name, :cluster
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                    def initialize(id:, cluster:)
         | 
| 8 | 
            +
                      @id = id
         | 
| 9 | 
            +
                      @cluster = cluster
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    def types
         | 
| 13 | 
            +
                      @types ||= default_types
         | 
| 14 | 
            +
                    end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    def type(id)
         | 
| 17 | 
            +
                      types.find { |t| t.id == id.to_sym }.tap do |t|
         | 
| 18 | 
            +
                        yield(t) if block_given? && !t.nil?
         | 
| 19 | 
            +
                      end
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    def name=(name)
         | 
| 23 | 
            +
                      raise NullNameError.new if name.nil?
         | 
| 24 | 
            +
                      @name = name.to_s
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    class NullNameError < ArgumentError
         | 
| 28 | 
            +
                      def initialize
         | 
| 29 | 
            +
                        super(message)
         | 
| 30 | 
            +
                      end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                      def message
         | 
| 33 | 
            +
                        I18n.t('elasticsearch.resources.configuration.index.null_name_error.message')
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    protected
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    def default_types
         | 
| 40 | 
            +
                      []
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                module Configuration
         | 
| 4 | 
            +
                  class Settings
         | 
| 5 | 
            +
                    def clusters
         | 
| 6 | 
            +
                      @clusters ||= default_clusters
         | 
| 7 | 
            +
                    end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def cluster(id)
         | 
| 10 | 
            +
                      clusters.find { |t| t.id == id.to_sym }.tap do |t|
         | 
| 11 | 
            +
                        yield(t) if block_given?
         | 
| 12 | 
            +
                      end
         | 
| 13 | 
            +
                    end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                    protected
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    def default_clusters
         | 
| 18 | 
            +
                      [
         | 
| 19 | 
            +
                        Elasticsearch::Resources::Configuration::Cluster.new(id: :default)
         | 
| 20 | 
            +
                      ]
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                module Configuration
         | 
| 4 | 
            +
                  class Type
         | 
| 5 | 
            +
                    attr_reader :id, :name, :index
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                    def initialize(id:, index:)
         | 
| 8 | 
            +
                      @id = id
         | 
| 9 | 
            +
                      @index = index
         | 
| 10 | 
            +
                    end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    def name=(name)
         | 
| 13 | 
            +
                      raise NullNameError.new if name.nil?
         | 
| 14 | 
            +
                      @name = name.to_s
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    class NullNameError < ArgumentError
         | 
| 18 | 
            +
                      def initialize
         | 
| 19 | 
            +
                        super(message)
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                      def message
         | 
| 23 | 
            +
                        I18n.t('elasticsearch.resources.configuration.type.null_name_error.message')
         | 
| 24 | 
            +
                      end
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            module Elasticsearch
         | 
| 2 | 
            +
              module Resources
         | 
| 3 | 
            +
                module Describable
         | 
| 4 | 
            +
                  def self.included(base)
         | 
| 5 | 
            +
                    base.extend(ClassMethods)
         | 
| 6 | 
            +
                    base.include(InstanceMethods)
         | 
| 7 | 
            +
                  end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  module ClassMethods
         | 
| 10 | 
            +
                    def attributes
         | 
| 11 | 
            +
                      @attributes ||= []
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    protected
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    def define_attributes(*attributes)
         | 
| 17 | 
            +
                      new_attributes = attributes.collect(&:to_sym) - self.attributes.collect(&:to_sym)
         | 
| 18 | 
            +
                      self.attributes.concat(new_attributes).tap { |a| define_attribute_helpers(new_attributes) }
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    private
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    def define_attribute_helpers(attributes)
         | 
| 24 | 
            +
                      attributes.each do |attribute|
         | 
| 25 | 
            +
                        self.send(:define_method, "#{attribute}") do
         | 
| 26 | 
            +
                          self.attributes[attribute.to_s]
         | 
| 27 | 
            +
                        end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                        self.send(:define_method, "#{attribute}=") do |value|
         | 
| 30 | 
            +
                          self.attributes[attribute.to_s] = value
         | 
| 31 | 
            +
                        end
         | 
| 32 | 
            +
                      end
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  module InstanceMethods
         | 
| 37 | 
            +
                    def attributes
         | 
| 38 | 
            +
                      @attributes ||= {}
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    protected
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    def attributes=(attributes = {})
         | 
| 44 | 
            +
                      @attributes = attributes.collect { |k, v| [k.to_s, v] }.to_h
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
            end
         |