etcd-completion 0.0.2 → 0.0.4
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/Rakefile +8 -1
- data/bin/etcd-completion +8 -50
- data/etcd-completion.gemspec +3 -3
- data/lib/etcd-completion.rb +55 -0
- data/spec/etcd-completion_spec.rb +73 -0
- data/travis.yml +5 -0
- metadata +35 -5
- data/lib/etcd/completion.rb +0 -7
- data/lib/etcd/completion/version.rb +0 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: ef72e192e9d4f8bcddac95655bf6388c24fdd1ad
         | 
| 4 | 
            +
              data.tar.gz: 6872c7b5aa8bebd8eb4c70b93d50a2921be8b9fd
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ab9a0a0b5b93acc1c7e43790b5e51a589aab6995cf9d149da7fb215f0b13a22bcff9c000215127ddb8393f937228b563cd44bde118fe78fe544803136ad1d2e2
         | 
| 7 | 
            +
              data.tar.gz: 3700fab2ed814c1c9c4f58ab8ad6ce7d8bbf151054825631a5ddb8035d510ed149d12249a8433836163ad5cb003ccfc4e9c99607b2f1a042bab8160ef65fa2a8
         | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/bin/etcd-completion
    CHANGED
    
    | @@ -1,65 +1,23 @@ | |
| 1 1 | 
             
            #!/usr/bin/env ruby
         | 
| 2 | 
            -
            require 'etcd'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            def dir_ops 
         | 
| 5 | 
            -
              %w'mkdir rmdir ls setdir updatedir'
         | 
| 6 | 
            -
            end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            def node_ops
         | 
| 9 | 
            -
              %w'mk rm get set update watch'
         | 
| 10 | 
            -
            end
         | 
| 2 | 
            +
            require 'etcd-completion'
         | 
| 11 3 |  | 
| 12 4 | 
             
            def filter(prefix, key)
         | 
| 13 5 | 
             
              key.start_with?(prefix)
         | 
| 14 6 | 
             
            end
         | 
| 15 7 |  | 
| 16 8 | 
             
            def completions(op, prefix)
         | 
| 17 | 
            -
              prefix = '' if prefix.nil?
         | 
| 18 | 
            -
              if node_ops.include? op
         | 
| 19 | 
            -
                type = 'node'
         | 
| 20 | 
            -
              elsif dir_ops.include? op
         | 
| 21 | 
            -
                type = 'dir'
         | 
| 22 | 
            -
              else
         | 
| 23 | 
            -
                fail "Usage: etcdctl.rb <operation> <prefix>"
         | 
| 24 | 
            -
              end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
              client = Etcd.client
         | 
| 9 | 
            +
              prefix = '/' if prefix.nil?
         | 
| 27 10 |  | 
| 28 | 
            -
               | 
| 29 | 
            -
             | 
| 30 | 
            -
              else
         | 
| 31 | 
            -
                index = prefix.rindex('/')
         | 
| 32 | 
            -
                if index.nil?
         | 
| 33 | 
            -
                  node_name = '/'
         | 
| 34 | 
            -
                else
         | 
| 35 | 
            -
                  node_name = prefix[0, prefix.rindex('/')+1]
         | 
| 36 | 
            -
                end
         | 
| 37 | 
            -
              end
         | 
| 11 | 
            +
              completion = Etcd::Completion.new
         | 
| 12 | 
            +
              matches = completion.matches(prefix)
         | 
| 38 13 |  | 
| 39 | 
            -
               | 
| 40 | 
            -
             | 
| 41 | 
            -
                children = node.children
         | 
| 42 | 
            -
                case type
         | 
| 43 | 
            -
                when 'dir' 
         | 
| 44 | 
            -
                  result = children.select{|c|c.directory? && filter(prefix, c.key)}.map do |c|
         | 
| 45 | 
            -
                    c.key + '/'
         | 
| 46 | 
            -
                  end
         | 
| 47 | 
            -
                when 'node' 
         | 
| 48 | 
            -
                  result = children.select{|c|filter(prefix, c.key)}.map do |c|
         | 
| 49 | 
            -
                    c.directory? ? (c.key + '/') : (c.key)
         | 
| 50 | 
            -
                  end
         | 
| 51 | 
            -
                end 
         | 
| 52 | 
            -
              else
         | 
| 53 | 
            -
                result = [filter(prefix, node.key)]
         | 
| 14 | 
            +
              if Etcd::Operation.new(op).directory_only?
         | 
| 15 | 
            +
                matches = matches.select{|m| m.directory?}
         | 
| 54 16 | 
             
              end
         | 
| 55 17 |  | 
| 56 | 
            -
               | 
| 57 | 
            -
                 | 
| 58 | 
            -
                if new_prefix.end_with?('/')
         | 
| 59 | 
            -
                  result << completions(op, new_prefix) 
         | 
| 60 | 
            -
                end
         | 
| 18 | 
            +
              matches.map do |m|
         | 
| 19 | 
            +
                (m.directory? && m.key != '/') ? m.key + '/' : m.key
         | 
| 61 20 | 
             
              end
         | 
| 62 | 
            -
              result
         | 
| 63 21 | 
             
            end
         | 
| 64 22 |  | 
| 65 23 | 
             
            puts completions(ARGV[0], ARGV[1]).join(' ') 
         | 
    
        data/etcd-completion.gemspec
    CHANGED
    
    | @@ -1,11 +1,10 @@ | |
| 1 1 | 
             
            # coding: utf-8
         | 
| 2 2 | 
             
            lib = File.expand_path('../lib', __FILE__)
         | 
| 3 3 | 
             
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 4 | 
            -
            require 'etcd/completion/version'
         | 
| 5 4 |  | 
| 6 5 | 
             
            Gem::Specification.new do |spec|
         | 
| 7 6 | 
             
              spec.name          = "etcd-completion"
         | 
| 8 | 
            -
              spec.version       =  | 
| 7 | 
            +
              spec.version       = "0.0.4"
         | 
| 9 8 | 
             
              spec.authors       = ["Michael Shea"]
         | 
| 10 9 | 
             
              spec.email         = ["mike.shea@gmail.com"]
         | 
| 11 10 | 
             
              spec.summary       = %q{Utility for etcd autocompletion}
         | 
| @@ -20,6 +19,7 @@ Gem::Specification.new do |spec| | |
| 20 19 |  | 
| 21 20 | 
             
              spec.add_development_dependency "bundler", "~> 1.5"
         | 
| 22 21 | 
             
              spec.add_development_dependency "rake"
         | 
| 23 | 
            -
             | 
| 22 | 
            +
              spec.add_development_dependency "rspec", "~> 3.1"
         | 
| 23 | 
            +
              spec.add_development_dependency 'simplecov', '~> 0.9'
         | 
| 24 24 | 
             
              spec.add_dependency 'etcd', "~> 0.2"
         | 
| 25 25 | 
             
            end
         | 
| @@ -0,0 +1,55 @@ | |
| 1 | 
            +
            require 'etcd'
         | 
| 2 | 
            +
            module Etcd
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              class Operation
         | 
| 5 | 
            +
                attr_reader :name
         | 
| 6 | 
            +
                def initialize(name)
         | 
| 7 | 
            +
                  @name = name
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def directory_only?
         | 
| 11 | 
            +
                  %w'mkdir rmdir ls setdir updatedir'.include? name
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              class Completion
         | 
| 16 | 
            +
                attr_reader :client
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def initialize(opts={})
         | 
| 19 | 
            +
                  @client = opts[:client] || Etcd.client(opts)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def node_name(prefix)
         | 
| 23 | 
            +
                  if (prefix == '/')
         | 
| 24 | 
            +
                    '/' 
         | 
| 25 | 
            +
                  else
         | 
| 26 | 
            +
                    index = prefix.rindex('/')
         | 
| 27 | 
            +
                    if index.nil?
         | 
| 28 | 
            +
                      '/' 
         | 
| 29 | 
            +
                    else
         | 
| 30 | 
            +
                      prefix[0..index]
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def filter(nodes, prefix) 
         | 
| 36 | 
            +
                  nodes.select do |n|
         | 
| 37 | 
            +
                    n.key.start_with?(prefix)
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def matches(prefix)
         | 
| 42 | 
            +
                  node = client.get(node_name(prefix)).node
         | 
| 43 | 
            +
                  nodes = [node] + node.children
         | 
| 44 | 
            +
                  nodes = filter(nodes, prefix)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  if nodes.size == 1  
         | 
| 47 | 
            +
                    if nodes[0].directory?
         | 
| 48 | 
            +
                      nodes += client.get(nodes[0].key).node.children
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  nodes
         | 
| 53 | 
            +
                end 
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
         | 
| 2 | 
            +
            require 'rspec'
         | 
| 3 | 
            +
            require 'simplecov'
         | 
| 4 | 
            +
            SimpleCov.start
         | 
| 5 | 
            +
            require 'etcd-completion'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Etcd
         | 
| 8 | 
            +
              %w'mkdir rmdir ls setdir updatedir'.each do |op|
         | 
| 9 | 
            +
                describe "#{op} #directory_only?" do
         | 
| 10 | 
            +
                  let(:operation){ Operation.new(op) }
         | 
| 11 | 
            +
                  it 'should be true' do
         | 
| 12 | 
            +
                    expect(operation.directory_only?).to eq(true)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              describe Completion do
         | 
| 18 | 
            +
                describe '#matches' do
         | 
| 19 | 
            +
                  let (:completion){ Completion.new(:client=>client) }
         | 
| 20 | 
            +
                  let (:client) { double('client') }
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  it 'should return matches for the prefix' do
         | 
| 23 | 
            +
                    allow(client).to receive(:get).with('/'){root}
         | 
| 24 | 
            +
                    expect(completion.matches('/prefix').map(&:key)).to eq %w'/prefix1 /prefix2 /prefix3'
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  it 'should include children if only one immediate dir match' do
         | 
| 28 | 
            +
                    allow(client).to receive(:get).with('/'){root}
         | 
| 29 | 
            +
                    allow(client).to receive(:get).with('/prefix1'){subdir}
         | 
| 30 | 
            +
                    expect(completion.matches('/prefix1').map(&:key)).to eq %w'/prefix1 /prefix1/key' 
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def subdir
         | 
| 35 | 
            +
                  double('subdir-result').tap do |r|
         | 
| 36 | 
            +
                    allow(r).to receive(:node) {
         | 
| 37 | 
            +
                      dir('/prefix1', [ key('/prefix1/key') ])
         | 
| 38 | 
            +
                    }
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def root
         | 
| 43 | 
            +
                  double('result').tap do |r|
         | 
| 44 | 
            +
                    allow(r).to receive(:node) do 
         | 
| 45 | 
            +
                      dir(
         | 
| 46 | 
            +
                        '/', 
         | 
| 47 | 
            +
                        [
         | 
| 48 | 
            +
                          dir('/prefix1'),
         | 
| 49 | 
            +
                          dir('/prefix2'),
         | 
| 50 | 
            +
                          key('/prefix3')
         | 
| 51 | 
            +
                        ])
         | 
| 52 | 
            +
                    end 
         | 
| 53 | 
            +
                  end   
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def dir(name, children=[])
         | 
| 57 | 
            +
                  node(name, true).tap do |n|
         | 
| 58 | 
            +
                    allow(n).to receive(:children){children}
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def key(name) 
         | 
| 63 | 
            +
                  node(name, false)
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def node(name, directory)
         | 
| 67 | 
            +
                  double(name).tap do |n|
         | 
| 68 | 
            +
                    allow(n).to receive(:key){name}
         | 
| 69 | 
            +
                    allow(n).to receive(:directory?){directory}
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
    
        data/travis.yml
    ADDED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: etcd-completion
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.4
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Michael Shea
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014-09- | 
| 11 | 
            +
            date: 2014-09-28 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -38,6 +38,34 @@ dependencies: | |
| 38 38 | 
             
                - - '>='
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 40 | 
             
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: rspec
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - ~>
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '3.1'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ~>
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '3.1'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: simplecov
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - ~>
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '0.9'
         | 
| 62 | 
            +
              type: :development
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - ~>
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '0.9'
         | 
| 41 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 70 | 
             
              name: etcd
         | 
| 43 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -67,8 +95,9 @@ files: | |
| 67 95 | 
             
            - Rakefile
         | 
| 68 96 | 
             
            - bin/etcd-completion
         | 
| 69 97 | 
             
            - etcd-completion.gemspec
         | 
| 70 | 
            -
            - lib/etcd | 
| 71 | 
            -
            -  | 
| 98 | 
            +
            - lib/etcd-completion.rb
         | 
| 99 | 
            +
            - spec/etcd-completion_spec.rb
         | 
| 100 | 
            +
            - travis.yml
         | 
| 72 101 | 
             
            homepage: ''
         | 
| 73 102 | 
             
            licenses:
         | 
| 74 103 | 
             
            - MIT
         | 
| @@ -93,4 +122,5 @@ rubygems_version: 2.2.2 | |
| 93 122 | 
             
            signing_key: 
         | 
| 94 123 | 
             
            specification_version: 4
         | 
| 95 124 | 
             
            summary: Utility for etcd autocompletion
         | 
| 96 | 
            -
            test_files: | 
| 125 | 
            +
            test_files:
         | 
| 126 | 
            +
            - spec/etcd-completion_spec.rb
         | 
    
        data/lib/etcd/completion.rb
    DELETED