armg 0.3.0 → 0.4.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/README.md +47 -1
- data/lib/armg.rb +2 -0
- data/lib/armg/armg.rb +10 -10
- data/lib/armg/mysql_geometry.rb +4 -17
- data/lib/armg/version.rb +1 -1
- data/lib/armg/wkb_generator.rb +16 -0
- data/lib/armg/wkb_parser.rb +18 -0
- metadata +5 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 469ae0fd83f0f67d9e31b66f79c25f2a8649ab6a
         | 
| 4 | 
            +
              data.tar.gz: fe09fd8a362b915e18be5462b76f17c4b74deab3
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: eb3abcf2d2a06ffff03a1a94fee61efc2f2acee1e2fb2c4aebf2bf12811447920bf20e5b25472b212258c482708de2de246f4e943f01c28af816e8fb3c7fb6f1
         | 
| 7 | 
            +
              data.tar.gz: 2c23cea430e9e830a64ac1cb66b15421ba15e4e44a595af089ff3ff8a4f32e5c2e40fb8da1e64ddb38e5826bd747419539ef2540a015a3f48b9576be80628770
         | 
    
        data/README.md
    CHANGED
    
    | @@ -2,6 +2,7 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            Add MySQL geometry type to Active Record.
         | 
| 4 4 |  | 
| 5 | 
            +
            [](https://badge.fury.io/rb/armg)
         | 
| 5 6 | 
             
            [](https://travis-ci.org/winebarrel/armg)
         | 
| 6 7 |  | 
| 7 8 | 
             
            ## Installation
         | 
| @@ -26,7 +27,7 @@ Or install it yourself as: | |
| 26 27 | 
             
            require 'active_record'
         | 
| 27 28 | 
             
            require 'armg'
         | 
| 28 29 |  | 
| 29 | 
            -
            ActiveRecord::Base.establish_connection(adapter: 'mysql2', database: 'my_db') | 
| 30 | 
            +
            ActiveRecord::Base.establish_connection(adapter: 'mysql2', database: 'my_db')
         | 
| 30 31 |  | 
| 31 32 | 
             
            ActiveRecord::Migration.create_table :geoms, options: 'ENGINE=MyISAM' do |t|
         | 
| 32 33 | 
             
              t.geometry 'location', null: false
         | 
| @@ -42,3 +43,48 @@ Geom.create!(location: point) | |
| 42 43 | 
             
            Geom.first
         | 
| 43 44 | 
             
            #=> #<Geom id: 1, location: #<RGeo::Cartesian::PointImpl:0x... "POINT (-122.1 47.3)">>
         | 
| 44 45 | 
             
            ```
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            ## Using custom WKB parser
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            ```ruby
         | 
| 50 | 
            +
            class CustomParser
         | 
| 51 | 
            +
              def initialize
         | 
| 52 | 
            +
                factory = RGeo::Geographic.spherical_factory(srid: 0)
         | 
| 53 | 
            +
                @parser = RGeo::WKRep::WKBParser.new(factory, support_ewkb: true)
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              def parse(wkb)
         | 
| 57 | 
            +
                wkb_without_srid = wkb.bytes[4..-1].pack('c*')
         | 
| 58 | 
            +
                @parser.parse(wkb_without_srid)
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            Armg.wkb_parser = CustomParser.new
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            Geom.take
         | 
| 65 | 
            +
            #=> #<Geom id: 1, location: #<RGeo::Geographic::SphericalPointImpl:0x... "POINT (-122.1 47.3)">>
         | 
| 66 | 
            +
            ```
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            ## Using custom WKB generator
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            ```ruby
         | 
| 71 | 
            +
            class CustomGenerator
         | 
| 72 | 
            +
              def initialize
         | 
| 73 | 
            +
                @wkt_parser = RGeo::WKRep::WKTParser.new(nil, support_ewkt: true)
         | 
| 74 | 
            +
                @generator = RGeo::WKRep::WKBGenerator.new(type_format: :ewkb, little_endian: true)
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              def generate(value)
         | 
| 78 | 
            +
                if value.is_a?(String)
         | 
| 79 | 
            +
                  value = @wkt_parser.parse(value)
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                srid = "\x00\x00\x00\x00"
         | 
| 83 | 
            +
                srid + @generator.generate(value)
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
            end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            Armg.wkb_generator = CustomGenerator.new
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            Geom.create!(id: 4, location: 'Point(-122.1 47.3)')
         | 
| 90 | 
            +
            ```
         | 
    
        data/lib/armg.rb
    CHANGED
    
    | @@ -4,6 +4,8 @@ require 'armg/version' | |
| 4 4 |  | 
| 5 5 | 
             
            ActiveSupport.on_load(:active_record) do
         | 
| 6 6 | 
             
              require 'active_record/connection_adapters/abstract_mysql_adapter'
         | 
| 7 | 
            +
              require 'armg/wkb_generator'
         | 
| 8 | 
            +
              require 'armg/wkb_parser'
         | 
| 7 9 | 
             
              require 'armg/abstract_mysql_adapter_ext'
         | 
| 8 10 | 
             
              require 'armg/mysql_geometry'
         | 
| 9 11 | 
             
              require 'armg/table_definition_ext'
         | 
    
        data/lib/armg/armg.rb
    CHANGED
    
    | @@ -1,22 +1,22 @@ | |
| 1 1 | 
             
            module Armg
         | 
| 2 | 
            -
              @ | 
| 3 | 
            -
              @ | 
| 2 | 
            +
              @wkb_parser = Armg::MysqlGeometry::DEFAULT_WKB_PARSER
         | 
| 3 | 
            +
              @wkb_generator = Armg::MysqlGeometry::DEFAULT_WKB_GENERATOR
         | 
| 4 4 |  | 
| 5 5 | 
             
              class << self
         | 
| 6 | 
            -
                def  | 
| 7 | 
            -
                  @ | 
| 6 | 
            +
                def wkb_parser
         | 
| 7 | 
            +
                  @wkb_parser
         | 
| 8 8 | 
             
                end
         | 
| 9 9 |  | 
| 10 | 
            -
                def  | 
| 11 | 
            -
                  @ | 
| 10 | 
            +
                def wkb_parser=(parser)
         | 
| 11 | 
            +
                  @wkb_parser = parser
         | 
| 12 12 | 
             
                end
         | 
| 13 13 |  | 
| 14 | 
            -
                def  | 
| 15 | 
            -
                  @ | 
| 14 | 
            +
                def wkb_generator
         | 
| 15 | 
            +
                  @wkb_generator
         | 
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 | 
            -
                def  | 
| 19 | 
            -
                  @ | 
| 18 | 
            +
                def wkb_generator=(generator)
         | 
| 19 | 
            +
                  @wkb_generator = generator
         | 
| 20 20 | 
             
                end
         | 
| 21 21 | 
             
              end
         | 
| 22 22 | 
             
            end
         | 
    
        data/lib/armg/mysql_geometry.rb
    CHANGED
    
    | @@ -1,18 +1,8 @@ | |
| 1 1 | 
             
            class Armg::MysqlGeometry < ActiveModel::Type::Value
         | 
| 2 2 | 
             
              include ActiveModel::Type::Helpers::Mutable
         | 
| 3 3 |  | 
| 4 | 
            -
               | 
| 5 | 
            -
             | 
| 6 | 
            -
                [ RGeo::WKRep::WKBParser.new(nil, support_ewkb: true, default_srid: srid),
         | 
| 7 | 
            -
                  wkb[4..-1],
         | 
| 8 | 
            -
                ]
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
              DEFAULT_WKB_GENERATOR_FACTORY = proc do |value|
         | 
| 12 | 
            -
                [ RGeo::WKRep::WKBGenerator.new(type_format: :ewkb, little_endian: true),
         | 
| 13 | 
            -
                  [value.srid].pack('L<'),
         | 
| 14 | 
            -
                ]
         | 
| 15 | 
            -
              end
         | 
| 4 | 
            +
              DEFAULT_WKB_PARSER = Armg::WkbParser.new
         | 
| 5 | 
            +
              DEFAULT_WKB_GENERATOR = Armg::WkbGenerator.new
         | 
| 16 6 |  | 
| 17 7 | 
             
              def type
         | 
| 18 8 | 
             
                :geometry
         | 
| @@ -20,8 +10,7 @@ class Armg::MysqlGeometry < ActiveModel::Type::Value | |
| 20 10 |  | 
| 21 11 | 
             
              def deserialize(value)
         | 
| 22 12 | 
             
                if value.is_a?(::String)
         | 
| 23 | 
            -
                   | 
| 24 | 
            -
                  wkb_parser.parse(value)
         | 
| 13 | 
            +
                  Armg.wkb_parser.parse(value)
         | 
| 25 14 | 
             
                else
         | 
| 26 15 | 
             
                  value
         | 
| 27 16 | 
             
                end
         | 
| @@ -31,9 +20,7 @@ class Armg::MysqlGeometry < ActiveModel::Type::Value | |
| 31 20 | 
             
                if value.nil?
         | 
| 32 21 | 
             
                  nil
         | 
| 33 22 | 
             
                else
         | 
| 34 | 
            -
                   | 
| 35 | 
            -
                  wkb = wkb_generator.generate(value)
         | 
| 36 | 
            -
                  srid + wkb
         | 
| 23 | 
            +
                  Armg.wkb_generator.generate(value)
         | 
| 37 24 | 
             
                end
         | 
| 38 25 | 
             
              end
         | 
| 39 26 | 
             
            end
         | 
    
        data/lib/armg/version.rb
    CHANGED
    
    
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            class Armg::WkbGenerator
         | 
| 2 | 
            +
              DEFAULT_OPTIONS = {
         | 
| 3 | 
            +
                type_format: :ewkb,
         | 
| 4 | 
            +
                little_endian: true,
         | 
| 5 | 
            +
              }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              def initialize(factory = nil, options = {})
         | 
| 8 | 
            +
                options = DEFAULT_OPTIONS.merge(options)
         | 
| 9 | 
            +
                @generator = RGeo::WKRep::WKBGenerator.new(options)
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def generate(deserialized_value)
         | 
| 13 | 
            +
                srid = [deserialized_value.srid].pack('L<')
         | 
| 14 | 
            +
                srid + @generator.generate(deserialized_value)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            class Armg::WkbParser
         | 
| 2 | 
            +
              DEFAULT_OPTIONS = {
         | 
| 3 | 
            +
                support_ewkb: true,
         | 
| 4 | 
            +
              }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def initialize(factory = nil, options = {})
         | 
| 7 | 
            +
                options = DEFAULT_OPTIONS.merge(options)
         | 
| 8 | 
            +
                @parser = RGeo::WKRep::WKBParser.new(factory, options)
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              def parse(wkb)
         | 
| 12 | 
            +
                wkb = wkb.bytes
         | 
| 13 | 
            +
                srid = wkb.slice!(0..3)
         | 
| 14 | 
            +
                wkb[4] = 0x20
         | 
| 15 | 
            +
                wkb.insert(5, *srid)
         | 
| 16 | 
            +
                @parser.parse(wkb.pack('c*'))
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: armg
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Genki Sugawara
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017-08- | 
| 11 | 
            +
            date: 2017-08-12 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activerecord
         | 
| @@ -132,6 +132,8 @@ files: | |
| 132 132 | 
             
            - lib/armg/mysql_geometry.rb
         | 
| 133 133 | 
             
            - lib/armg/table_definition_ext.rb
         | 
| 134 134 | 
             
            - lib/armg/version.rb
         | 
| 135 | 
            +
            - lib/armg/wkb_generator.rb
         | 
| 136 | 
            +
            - lib/armg/wkb_parser.rb
         | 
| 135 137 | 
             
            homepage: https://github.com/winebarrel/armg
         | 
| 136 138 | 
             
            licenses:
         | 
| 137 139 | 
             
            - MIT
         | 
| @@ -152,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 152 154 | 
             
                  version: '0'
         | 
| 153 155 | 
             
            requirements: []
         | 
| 154 156 | 
             
            rubyforge_project: 
         | 
| 155 | 
            -
            rubygems_version: 2. | 
| 157 | 
            +
            rubygems_version: 2.5.2
         | 
| 156 158 | 
             
            signing_key: 
         | 
| 157 159 | 
             
            specification_version: 4
         | 
| 158 160 | 
             
            summary: Add MySQL geometry type to Active Record.
         |