gogyou 0.2.2 → 0.2.3
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/HISTORY.ja.md +51 -0
- data/{LICENSE.markdown → LICENSE} +0 -0
- data/{README.markdown → README.md} +166 -90
- data/Rakefile +101 -58
- data/gemstub.rb +15 -18
- data/lib/gogyou.rb +88 -40
- data/lib/gogyou/accessor.rb +113 -58
- data/lib/gogyou/mixin.rb +8 -8
- data/lib/gogyou/model.rb +93 -53
- data/lib/gogyou/primitives.rb +6 -109
- data/lib/gogyou/typespec.rb +4 -4
- data/lib/gogyou/version.rb +3 -0
- data/mkprims.rb +7 -50
- data/spec/gogyou_spec.rb +6 -2
- metadata +19 -15
    
        data/Rakefile
    CHANGED
    
    | @@ -1,106 +1,149 @@ | |
| 1 1 |  | 
| 2 2 | 
             
            require "rake/clean"
         | 
| 3 3 |  | 
| 4 | 
            -
            DOC = FileList["{README,LICENSE,CHANGELOG,Changelog}{,.ja}{,.txt,.rd,.rdoc,.md,.markdown}"] +
         | 
| 5 | 
            -
                  FileList["ext/**/{README,LICENSE,CHANGELOG,Changelog}{,.ja}{,.txt,.rd,.rdoc,.md,.markdown}"]
         | 
| 4 | 
            +
            DOC = FileList["{README,LICENSE,CHANGELOG,Changelog,HISTORY}{,.ja}{,.txt,.rd,.rdoc,.md,.markdown}"] +
         | 
| 5 | 
            +
                  FileList["{contrib,ext}/**/{README,LICENSE,CHANGELOG,Changelog,HISTORY}{,.ja}{,.txt,.rd,.rdoc,.md,.markdown}"] +
         | 
| 6 | 
            +
                  FileList["ext/**/*.{c,C,cc,cxx,cpp,h,H,hh}"]
         | 
| 6 7 | 
             
            #EXT = FileList["ext/**/*.{h,hh,c,cc,cpp,cxx}"] +
         | 
| 7 8 | 
             
            #      FileList["ext/externals/**/*"]
         | 
| 8 9 | 
             
            EXT = FileList["ext/**/*"]
         | 
| 9 10 | 
             
            BIN = FileList["bin/*"]
         | 
| 10 11 | 
             
            LIB = FileList["lib/**/*.rb"]
         | 
| 11 12 | 
             
            SPEC = FileList["spec/**/*"]
         | 
| 13 | 
            +
            TEST = FileList["test/**/*"]
         | 
| 12 14 | 
             
            EXAMPLE = FileList["examples/**/*"]
         | 
| 13 | 
            -
             | 
| 15 | 
            +
            GEMSTUB_SRC = "gemstub.rb"
         | 
| 16 | 
            +
            RAKEFILE = [File.basename(__FILE__), GEMSTUB_SRC]
         | 
| 14 17 | 
             
            EXTRA = []
         | 
| 15 18 |  | 
| 16 | 
            -
            load  | 
| 19 | 
            +
            load GEMSTUB_SRC
         | 
| 17 20 |  | 
| 18 21 | 
             
            EXTCONF = FileList["ext/extconf.rb"]
         | 
| 19 22 | 
             
            EXTCONF.reject! { |n| !File.file?(n) }
         | 
| 20 23 | 
             
            GEMSTUB.extensions += EXTCONF
         | 
| 21 24 | 
             
            GEMSTUB.executables += FileList["bin/*"].map { |n| File.basename n }
         | 
| 25 | 
            +
            GEMSTUB.executables.sort!
         | 
| 22 26 |  | 
| 23 27 | 
             
            GEMFILE = "#{GEMSTUB.name}-#{GEMSTUB.version}.gem"
         | 
| 24 28 | 
             
            GEMSPEC = "#{GEMSTUB.name}.gemspec"
         | 
| 25 29 |  | 
| 26 | 
            -
            GEMSTUB.files += DOC + EXT + EXTCONF + BIN + LIB + SPEC + EXAMPLE + RAKEFILE + EXTRA
         | 
| 30 | 
            +
            GEMSTUB.files += DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + EXTRA
         | 
| 31 | 
            +
            GEMSTUB.files.sort!
         | 
| 27 32 | 
             
            GEMSTUB.rdoc_options ||= %w(--charset UTF-8)
         | 
| 28 33 | 
             
            GEMSTUB.extra_rdoc_files += DOC + LIB + EXT.reject { |n| n.include?("/externals/") || !%w(.h .hh .c .cc .cpp .cxx).include?(File.extname(n)) }
         | 
| 34 | 
            +
            GEMSTUB.extra_rdoc_files.sort!
         | 
| 29 35 |  | 
| 30 36 | 
             
            CLEAN << GEMSPEC
         | 
| 31 37 | 
             
            CLOBBER << GEMFILE
         | 
| 32 38 |  | 
| 33 39 | 
             
            task :default => :all
         | 
| 34 40 |  | 
| 35 | 
            -
            task :all => GEMFILE
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            task :rdoc => DOC + EXT + LIB do
         | 
| 38 | 
            -
              sh *(%w(rdoc) + GEMSTUB.rdoc_options + DOC + EXT + LIB)
         | 
| 39 | 
            -
            end
         | 
| 40 41 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
               | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 42 | 
            +
            unless EXTCONF.empty?
         | 
| 43 | 
            +
              RUBYSET ||= (ENV["RUBYSET"] || "").split(",")
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              if RUBYSET.nil? || RUBYSET.empty?
         | 
| 46 | 
            +
                $stderr.puts <<-EOS
         | 
| 47 | 
            +
            #{__FILE__}:
         | 
| 48 | 
            +
            |
         | 
| 49 | 
            +
            | If you want binary gem package, launch rake with ``RUBYSET`` enviroment
         | 
| 50 | 
            +
            | variable for set ruby interpreters by comma separated.
         | 
| 51 | 
            +
            |
         | 
| 52 | 
            +
            |   e.g.) $ rake RUBYSET=ruby
         | 
| 53 | 
            +
            |     or) $ rake RUBYSET=ruby20,ruby21,ruby22
         | 
| 54 | 
            +
            |
         | 
| 55 | 
            +
                EOS
         | 
| 56 | 
            +
              else
         | 
| 57 | 
            +
                platforms = RUBYSET.map { |ruby| `#{ruby} --disable gems -rrbconfig -e "puts RbConfig::CONFIG['arch']"`.chomp }
         | 
| 58 | 
            +
                platforms1 = platforms.uniq
         | 
| 59 | 
            +
                unless platforms1.size == 1 && !platforms1[0].empty?
         | 
| 60 | 
            +
                  raise "different platforms (#{Hash[*RUBYSET.zip(platforms).flatten].inspect})"
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
                PLATFORM = platforms1[0]
         | 
| 48 63 |  | 
| 64 | 
            +
                RUBY_VERSIONS = RUBYSET.map do |ruby|
         | 
| 65 | 
            +
                  ver = `#{ruby} --disable gem -rrbconfig -e "puts RbConfig::CONFIG['ruby_version']"`.slice(/\d+\.\d+/)
         | 
| 66 | 
            +
                  raise "failed ruby checking - ``#{ruby}''" unless $?.success?
         | 
| 67 | 
            +
                  [ver, ruby]
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
                SOFILES_SET = RUBY_VERSIONS.map { |(ver, ruby)| ["lib/#{ver}/#{GEMSTUB.name}.so", ruby] }
         | 
| 70 | 
            +
                SOFILES = SOFILES_SET.map { |(lib, ruby)| lib }
         | 
| 49 71 |  | 
| 50 | 
            -
             | 
| 72 | 
            +
                GEMSTUB_NATIVE = GEMSTUB.dup
         | 
| 73 | 
            +
                GEMSTUB_NATIVE.files += SOFILES
         | 
| 74 | 
            +
                GEMSTUB_NATIVE.platform = Gem::Platform.new(PLATFORM).to_s
         | 
| 75 | 
            +
                GEMSTUB_NATIVE.extensions.clear
         | 
| 76 | 
            +
                GEMFILE_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.version}-#{GEMSTUB_NATIVE.platform}.gem"
         | 
| 77 | 
            +
                GEMSPEC_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.platform}.gemspec"
         | 
| 51 78 |  | 
| 52 | 
            -
             | 
| 53 | 
            -
              RUBY_VERSIONS = RUBYSET.map do |ruby|
         | 
| 54 | 
            -
                ver = `#{ruby} --disable gem -rrbconfig -e "puts RbConfig::CONFIG['ruby_version']"`.chomp
         | 
| 55 | 
            -
                raise "failed ruby checking - ``#{ruby}''" unless $?.success?
         | 
| 56 | 
            -
                [ver, ruby]
         | 
| 57 | 
            -
              end
         | 
| 58 | 
            -
              SOFILES_SET = RUBY_VERSIONS.map { |(ver, ruby)| ["lib/#{ver}/#{GEMSTUB.name}.so", ruby] }
         | 
| 59 | 
            -
              SOFILES = SOFILES_SET.map { |(lib, ruby)| lib }
         | 
| 60 | 
            -
              platforms = RUBYSET.map { |ruby| `#{ruby} -rubygems -e "puts Gem::Platform.local.to_s"`.chomp }
         | 
| 61 | 
            -
              platforms.uniq!
         | 
| 62 | 
            -
              platforms.compact!
         | 
| 63 | 
            -
              unless platforms.size == 1
         | 
| 64 | 
            -
                raise "wrong platforms (#{RUBYSET.inspect} => #{platforms.inspect})"
         | 
| 65 | 
            -
              end
         | 
| 79 | 
            +
                task :all => ["native-gem", GEMFILE]
         | 
| 66 80 |  | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
              GEMSTUB_NATIVE.platform = platforms[0]
         | 
| 70 | 
            -
              GEMFILE_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.version}-#{GEMSTUB_NATIVE.platform}.gem"
         | 
| 71 | 
            -
              GEMSPEC_NATIVE = "#{GEMSTUB_NATIVE.name}-#{GEMSTUB_NATIVE.platform}.gemspec"
         | 
| 81 | 
            +
                desc "build binary gem package"
         | 
| 82 | 
            +
                task "native-gem" => GEMFILE_NATIVE
         | 
| 72 83 |  | 
| 73 | 
            -
             | 
| 84 | 
            +
                desc "generate binary gemspec"
         | 
| 85 | 
            +
                task "native-gemspec" => GEMSPEC_NATIVE
         | 
| 74 86 |  | 
| 75 | 
            -
             | 
| 87 | 
            +
                file GEMFILE_NATIVE => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + SOFILES + RAKEFILE + [GEMSPEC_NATIVE] do
         | 
| 88 | 
            +
                  sh "gem build #{GEMSPEC_NATIVE}"
         | 
| 89 | 
            +
                end
         | 
| 76 90 |  | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 91 | 
            +
                file GEMSPEC_NATIVE => RAKEFILE do
         | 
| 92 | 
            +
                  File.write(GEMSPEC_NATIVE, GEMSTUB_NATIVE.to_ruby, mode: "wb")
         | 
| 93 | 
            +
                end
         | 
| 80 94 |  | 
| 81 | 
            -
             | 
| 82 | 
            -
                 | 
| 83 | 
            -
              end
         | 
| 95 | 
            +
                desc "build c-extension libraries"
         | 
| 96 | 
            +
                task "sofiles" => SOFILES
         | 
| 84 97 |  | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 98 | 
            +
                SOFILES_SET.each do |(soname, ruby)|
         | 
| 99 | 
            +
                  sodir = File.dirname(soname)
         | 
| 100 | 
            +
                  makefile = File.join(sodir, "Makefile")
         | 
| 88 101 |  | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 102 | 
            +
                  CLEAN << GEMSPEC_NATIVE << sodir
         | 
| 103 | 
            +
                  CLOBBER << GEMFILE_NATIVE
         | 
| 91 104 |  | 
| 92 | 
            -
             | 
| 105 | 
            +
                  directory sodir
         | 
| 93 106 |  | 
| 94 | 
            -
             | 
| 95 | 
            -
                   | 
| 96 | 
            -
                     | 
| 107 | 
            +
                  desc "generate Makefile for binary extension library"
         | 
| 108 | 
            +
                  file makefile => [sodir] + EXTCONF do
         | 
| 109 | 
            +
                    cd sodir do
         | 
| 110 | 
            +
                      sh "#{ruby} ../../#{EXTCONF[0]} \"--ruby=#{ruby}\""
         | 
| 111 | 
            +
                    end
         | 
| 97 112 | 
             
                  end
         | 
| 98 | 
            -
                end
         | 
| 99 113 |  | 
| 100 | 
            -
             | 
| 101 | 
            -
                   | 
| 102 | 
            -
                     | 
| 114 | 
            +
                  desc "build binary extension library"
         | 
| 115 | 
            +
                  file soname => [makefile] + EXT do
         | 
| 116 | 
            +
                    cd sodir do
         | 
| 117 | 
            +
                      sh "make"
         | 
| 118 | 
            +
                    end
         | 
| 103 119 | 
             
                  end
         | 
| 104 120 | 
             
                end
         | 
| 105 121 | 
             
              end
         | 
| 106 122 | 
             
            end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
             | 
| 125 | 
            +
            task :all => GEMFILE
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            desc "generate local rdoc"
         | 
| 128 | 
            +
            task :rdoc => DOC + LIB do
         | 
| 129 | 
            +
              sh *(%w(rdoc) + GEMSTUB.rdoc_options + DOC + LIB)
         | 
| 130 | 
            +
            end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
            desc "launch rspec"
         | 
| 133 | 
            +
            task rspec: :all do
         | 
| 134 | 
            +
              sh "rspec"
         | 
| 135 | 
            +
            end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
            desc "build gem package"
         | 
| 138 | 
            +
            task gem: GEMFILE
         | 
| 139 | 
            +
             | 
| 140 | 
            +
            desc "generate gemspec"
         | 
| 141 | 
            +
            task gemspec: GEMSPEC
         | 
| 142 | 
            +
             | 
| 143 | 
            +
            file GEMFILE => DOC + EXT + EXTCONF + BIN + LIB + SPEC + TEST + EXAMPLE + RAKEFILE + [GEMSPEC] do
         | 
| 144 | 
            +
              sh "gem build #{GEMSPEC}"
         | 
| 145 | 
            +
            end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
            file GEMSPEC => RAKEFILE do
         | 
| 148 | 
            +
              File.write(GEMSPEC, GEMSTUB.to_ruby, mode: "wb")
         | 
| 149 | 
            +
            end
         | 
    
        data/gemstub.rb
    CHANGED
    
    | @@ -1,27 +1,24 @@ | |
| 1 1 |  | 
| 2 | 
            -
             | 
| 3 | 
            -
            hasprims = File.file?(File.join(File.dirname(__FILE__), "lib", "gogyou", "primitives.rb"))
         | 
| 4 | 
            -
            require_relative "lib/gogyou" if hasprims
         | 
| 2 | 
            +
            require_relative "lib/gogyou/version"
         | 
| 5 3 |  | 
| 6 4 | 
             
            GEMSTUB = Gem::Specification.new do |s|
         | 
| 7 5 | 
             
              s.name = "gogyou"
         | 
| 8 | 
            -
              s.version = Gogyou::VERSION | 
| 6 | 
            +
              s.version = Gogyou::VERSION
         | 
| 9 7 | 
             
              s.summary = "binary data operation library with the C liked struct and union"
         | 
| 10 8 | 
             
              s.description = <<EOS
         | 
| 11 | 
            -
            The gogyou is a library that provides auxiliary features of binary data operation for ruby.
         | 
| 9 | 
            +
            The gogyou is a library written at pure ruby that provides auxiliary features of binary data operation for ruby.
         | 
| 12 10 |  | 
| 13 11 | 
             
            The C-liked struct, union and multidimensional array definition are posible in ruby syntax.
         | 
| 14 12 |  | 
| 15 | 
            -
            *  | 
| 16 | 
            -
            *  | 
| 17 | 
            -
            *  | 
| 18 | 
            -
            *  | 
| 13 | 
            +
            * Available nested struct and union with anonymous field.
         | 
| 14 | 
            +
            * Available multidimensional array.
         | 
| 15 | 
            +
            * Available const field.
         | 
| 16 | 
            +
            * Available packed field.
         | 
| 17 | 
            +
            * Available user definition types.
         | 
| 19 18 | 
             
            EOS
         | 
| 20 19 | 
             
              s.license = "2-clause BSD License"
         | 
| 21 20 | 
             
              s.author = "dearblue"
         | 
| 22 21 | 
             
              s.email = "dearblue@users.sourceforge.jp"
         | 
| 23 | 
            -
              #s.author = "**PRIVATE**"
         | 
| 24 | 
            -
              #s.email = "**PRIVATE**"
         | 
| 25 22 | 
             
              s.homepage = "http://sourceforge.jp/projects/rutsubo/"
         | 
| 26 23 |  | 
| 27 24 | 
             
              s.required_ruby_version = ">= 2.0"
         | 
| @@ -29,12 +26,12 @@ EOS | |
| 29 26 | 
             
              s.add_development_dependency "rake", "~> 10.0"
         | 
| 30 27 | 
             
            end
         | 
| 31 28 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 29 | 
            +
            primitives = "lib/gogyou/primitives.rb"
         | 
| 30 | 
            +
            mkprims = "mkprims.rb"
         | 
| 31 | 
            +
            LIB << primitives
         | 
| 32 | 
            +
            CLEAN << primitives
         | 
| 33 | 
            +
            EXTRA << mkprims
         | 
| 35 34 |  | 
| 36 | 
            -
            file  | 
| 37 | 
            -
              sh "ruby mkprims | 
| 38 | 
            -
              require_relative "lib/gogyou"
         | 
| 39 | 
            -
              GEMSTUB.version = Gogyou::VERSION
         | 
| 35 | 
            +
            file primitives => mkprims do
         | 
| 36 | 
            +
              sh "ruby #{mkprims}"
         | 
| 40 37 | 
             
            end
         | 
    
        data/lib/gogyou.rb
    CHANGED
    
    | @@ -24,47 +24,42 @@ | |
| 24 24 | 
             
            #
         | 
| 25 25 | 
             
            # 原始的な型情報は Gogyou::Primitives で定義してあり、struct や union メソッド内で利用できる型を次の表に示します:
         | 
| 26 26 | 
             
            #
         | 
| 27 | 
            -
            # | 
| 28 | 
            -
            # | 
| 29 | 
            -
            # | 
| 30 | 
            -
            # | 
| 31 | 
            -
            # | 
| 32 | 
            -
            # | 
| 33 | 
            -
            # | 
| 34 | 
            -
            # | 
| 35 | 
            -
            # | 
| 36 | 
            -
            # | 
| 37 | 
            -
            # | 
| 38 | 
            -
            # | 
| 39 | 
            -
            #    | 
| 40 | 
            -
            #    | 
| 41 | 
            -
            #    | 
| 42 | 
            -
            #   ポインタ整数型              intptr_t    uintptr_t
         | 
| 27 | 
            +
            # ==== C 標準型
         | 
| 28 | 
            +
            #                           符号あり    符号なし
         | 
| 29 | 
            +
            #                           ----        ----
         | 
| 30 | 
            +
            #   char 型                 char        uchar
         | 
| 31 | 
            +
            #                                       unsigned_char
         | 
| 32 | 
            +
            #   short 型                short       ushort
         | 
| 33 | 
            +
            #                                       unsigned_short
         | 
| 34 | 
            +
            #   int 型                  int         uint
         | 
| 35 | 
            +
            #                                       unsigned_int
         | 
| 36 | 
            +
            #   long 型                 long        ulong
         | 
| 37 | 
            +
            #                                       unsigned_long
         | 
| 38 | 
            +
            #   long long 型            longlong    ulonglong
         | 
| 39 | 
            +
            #                           long_long   unsigned_long_long
         | 
| 40 | 
            +
            #   sizeof 型               ssize_t     size_t
         | 
| 41 | 
            +
            #   ポインタ整数型          intptr_t    uintptr_t
         | 
| 43 42 | 
             
            #
         | 
| 44 | 
            -
            # | 
| 43 | 
            +
            #                           バイトオーダー環境依存  バイトオーダー反転
         | 
| 44 | 
            +
            #                           符号あり  符号なし      符号あり    符号なし
         | 
| 45 | 
            +
            #                           ----      ----          ----        ----
         | 
| 46 | 
            +
            #   8ビット整数型           int8_t    uint8_t       N/A         N/A
         | 
| 47 | 
            +
            #   16ビット整数型          int16_t   uint16_t      int16_swap  uint16_swap
         | 
| 48 | 
            +
            #   32ビット整数型          int32_t   uint32_t      int32_swap  uint32_swap
         | 
| 49 | 
            +
            #   64ビット整数型          int64_t   uint64_t      int64_swap  uint64_swap
         | 
| 50 | 
            +
            #   32ビット浮動小数点数型  float     N/A           float_swap  N/A
         | 
| 51 | 
            +
            #   64ビット浮動小数点数型  double    N/A           double_swap N/A
         | 
| 45 52 | 
             
            #
         | 
| 46 | 
            -
            # | 
| 47 | 
            -
            # | 
| 48 | 
            -
            # | 
| 49 | 
            -
            #    | 
| 50 | 
            -
            #    | 
| 51 | 
            -
            #    | 
| 52 | 
            -
            #    | 
| 53 | 
            -
            #    | 
| 54 | 
            -
            #    | 
| 55 | 
            -
            #
         | 
| 56 | 
            -
            #                   ビッグエンディアン    リトルエンディアン
         | 
| 57 | 
            -
            #                   符号あり  符号なし    符号あり  符号なし
         | 
| 58 | 
            -
            #                   ----      ----        ----      ----
         | 
| 59 | 
            -
            #   16ビット整数型  int16_be  uint16_be   int16_le  uint16_le
         | 
| 60 | 
            -
            #   24ビット整数型  int24_be  uint24_be   int24_le  uint24_le
         | 
| 61 | 
            -
            #   32ビット整数型  int32_be  uint32_be   int32_le  uint32_le
         | 
| 62 | 
            -
            #   48ビット整数型  int48_be  uint48_be   int48_le  uint48_le
         | 
| 63 | 
            -
            #   64ビット整数型  int64_be  uint64_be   int64_le  uint64_le
         | 
| 64 | 
            -
            #
         | 
| 65 | 
            -
            #                       ビッグエンディアン  リトルエンディアン  バイトオーダー反転
         | 
| 66 | 
            -
            #   32ビット浮動少数型  float_be            float_le            float_swap
         | 
| 67 | 
            -
            #   64ビット浮動少数型  double_be           double_le           double_swap
         | 
| 53 | 
            +
            #                           ビッグエンディアン    リトルエンディアン
         | 
| 54 | 
            +
            #                           符号あり  符号なし    符号あり  符号なし
         | 
| 55 | 
            +
            #                           ----      ----        ----      ----
         | 
| 56 | 
            +
            #   16ビット整数型          int16_be  uint16_be   int16_le  uint16_le
         | 
| 57 | 
            +
            #   24ビット整数型          int24_be  uint24_be   int24_le  uint24_le
         | 
| 58 | 
            +
            #   32ビット整数型          int32_be  uint32_be   int32_le  uint32_le
         | 
| 59 | 
            +
            #   48ビット整数型          int48_be  uint48_be   int48_le  uint48_le
         | 
| 60 | 
            +
            #   64ビット整数型          int64_be  uint64_be   int64_le  uint64_le
         | 
| 61 | 
            +
            #   32ビット浮動小数点数型  float_be  N/A         float_le  N/A
         | 
| 62 | 
            +
            #   64ビット浮動小数点数型  double_be N/A         double_le N/A
         | 
| 68 63 | 
             
            #
         | 
| 69 64 | 
             
            #
         | 
| 70 65 | 
             
            # ==== 利用者定義の型情報
         | 
| @@ -141,14 +136,67 @@ | |
| 141 136 | 
             
            #
         | 
| 142 137 | 
             
            module Gogyou
         | 
| 143 138 | 
             
              Gogyou = self
         | 
| 144 | 
            -
              VERSION = Gem::Version.new("0.2.2")
         | 
| 145 139 |  | 
| 140 | 
            +
              require_relative "gogyou/version"
         | 
| 146 141 | 
             
              require_relative "gogyou/typespec"
         | 
| 147 142 | 
             
              require_relative "gogyou/mixin"
         | 
| 148 143 | 
             
              require_relative "gogyou/model"
         | 
| 149 144 | 
             
              require_relative "gogyou/primitives"
         | 
| 150 145 | 
             
              require_relative "gogyou/accessor"
         | 
| 151 146 |  | 
| 147 | 
            +
              class Model
         | 
| 148 | 
            +
                TYPEMAP = {}
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                Gogyou::Primitives.constants.each do |n|
         | 
| 151 | 
            +
                  prim = Gogyou::Primitives.const_get(n)
         | 
| 152 | 
            +
                  next unless prim.kind_of?(Gogyou::Primitives::Primitive)
         | 
| 153 | 
            +
                  TYPEMAP[prim.name.to_sym] = prim
         | 
| 154 | 
            +
                end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                TYPEMAP[:unsigned_char] = TYPEMAP[:uchar]
         | 
| 157 | 
            +
                TYPEMAP[:unsigned_short] = TYPEMAP[:ushort]
         | 
| 158 | 
            +
                TYPEMAP[:unsigned_int] = TYPEMAP[:uint]
         | 
| 159 | 
            +
                TYPEMAP[:unsigned_long] = TYPEMAP[:ulong]
         | 
| 160 | 
            +
                TYPEMAP[:unsigned_long_long] = TYPEMAP[:ulonglong]
         | 
| 161 | 
            +
                TYPEMAP[:long_long] = TYPEMAP[:longlong]
         | 
| 162 | 
            +
              end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
              class Struct < Accessor::Struct
         | 
| 165 | 
            +
                def self.struct(&block)
         | 
| 166 | 
            +
                  raise TypeError, "already defined struct" if const_defined?(:MODEL)
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                  # TODO: Accessor.define からコピペ。統一するべき。
         | 
| 169 | 
            +
                  model = Model.struct(Model::TYPEMAP.dup, &block)
         | 
| 170 | 
            +
                  const_set(:MODEL, model)
         | 
| 171 | 
            +
                  const_set(:BYTESIZE, model.bytesize)
         | 
| 172 | 
            +
                  const_set(:BYTEALIGN, model.bytealign)
         | 
| 173 | 
            +
                  const_set(:EXTENSIBLE, model.extensible?)
         | 
| 174 | 
            +
                  define_accessors(self, model)
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                  nil
         | 
| 177 | 
            +
                end
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                private_class_method :struct
         | 
| 180 | 
            +
              end
         | 
| 181 | 
            +
             | 
| 182 | 
            +
              class Union < Accessor::Union
         | 
| 183 | 
            +
                def self.union(&block)
         | 
| 184 | 
            +
                  raise TypeError, "already defined union" if const_defined?(:MODEL)
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                  # TODO: Accessor.define からコピペ。統一するべき。
         | 
| 187 | 
            +
                  model = Model.union(Model::TYPEMAP.dup, &block)
         | 
| 188 | 
            +
                  const_set(:MODEL, model)
         | 
| 189 | 
            +
                  const_set(:BYTESIZE, model.bytesize)
         | 
| 190 | 
            +
                  const_set(:BYTEALIGN, model.bytealign)
         | 
| 191 | 
            +
                  const_set(:EXTENSIBLE, model.extensible?)
         | 
| 192 | 
            +
                  define_accessors(self, model)
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                  nil
         | 
| 195 | 
            +
                end
         | 
| 196 | 
            +
             | 
| 197 | 
            +
                private_class_method :union
         | 
| 198 | 
            +
              end
         | 
| 199 | 
            +
             | 
| 152 200 | 
             
              #
         | 
| 153 201 | 
             
              # call-seq:
         | 
| 154 202 | 
             
              #   struct { ... } -> accessor class
         | 
    
        data/lib/gogyou/accessor.rb
    CHANGED
    
    | @@ -43,15 +43,15 @@ module Gogyou | |
| 43 43 | 
             
                # バイナリデータとして取り出します。
         | 
| 44 44 | 
             
                #
         | 
| 45 45 | 
             
                def to_s
         | 
| 46 | 
            -
                  buffer__GOGYOU__.byteslice(offset__GOGYOU__, self.class::BYTESIZE)
         | 
| 46 | 
            +
                  @buffer__GOGYOU__.byteslice(@offset__GOGYOU__, self.class::BYTESIZE)
         | 
| 47 47 | 
             
                end
         | 
| 48 48 |  | 
| 49 49 | 
             
                def to_buffer
         | 
| 50 | 
            -
                  buffer__GOGYOU__
         | 
| 50 | 
            +
                  @buffer__GOGYOU__
         | 
| 51 51 | 
             
                end
         | 
| 52 52 |  | 
| 53 53 | 
             
                def to_ptr
         | 
| 54 | 
            -
                  buffer__GOGYOU__.to_ptr
         | 
| 54 | 
            +
                  @buffer__GOGYOU__.to_ptr
         | 
| 55 55 | 
             
                end
         | 
| 56 56 |  | 
| 57 57 | 
             
                #
         | 
| @@ -61,8 +61,9 @@ module Gogyou | |
| 61 61 | 
             
                #
         | 
| 62 62 | 
             
                # 自身のデータ領域を指定バイト数ずらした参照体を返します。
         | 
| 63 63 | 
             
                #
         | 
| 64 | 
            -
                def slide(bytesize =  | 
| 65 | 
            -
                  self.class | 
| 64 | 
            +
                def slide(bytesize = 0)
         | 
| 65 | 
            +
                  offset = @offset__GOGYOU__ + self.class::BYTESIZE + bytesize
         | 
| 66 | 
            +
                  self.class.new(@buffer__GOGYOU__, offset)
         | 
| 66 67 | 
             
                end
         | 
| 67 68 |  | 
| 68 69 | 
             
                #
         | 
| @@ -72,10 +73,8 @@ module Gogyou | |
| 72 73 | 
             
                #
         | 
| 73 74 | 
             
                # 詳細は slide を参照して下さい。
         | 
| 74 75 | 
             
                #
         | 
| 75 | 
            -
                def slide!(bytesize =  | 
| 76 | 
            -
                  offset = offset__GOGYOU__ + bytesize
         | 
| 77 | 
            -
                  #return nil if offset < 0
         | 
| 78 | 
            -
                  #return nil if offset + buffer__GOGYOU__.bytesize > layout__GOGYOU__.bytesize
         | 
| 76 | 
            +
                def slide!(bytesize = 0)
         | 
| 77 | 
            +
                  offset = @offset__GOGYOU__ + self.class::BYTESIZE + bytesize
         | 
| 79 78 | 
             
                  @offset__GOGYOU__ = offset
         | 
| 80 79 | 
             
                  self
         | 
| 81 80 | 
             
                end
         | 
| @@ -84,25 +83,56 @@ module Gogyou | |
| 84 83 | 
             
                  self.class::BYTESIZE
         | 
| 85 84 | 
             
                end
         | 
| 86 85 |  | 
| 87 | 
            -
                def  | 
| 86 | 
            +
                def elementsize
         | 
| 88 87 | 
             
                  nil
         | 
| 89 88 | 
             
                end
         | 
| 90 89 |  | 
| 90 | 
            +
                def size
         | 
| 91 | 
            +
                  elementsize
         | 
| 92 | 
            +
                end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
                # call-seq:
         | 
| 96 | 
            +
                #   validate? -> true or false
         | 
| 97 | 
            +
                #
         | 
| 98 | 
            +
                # validation for buffer window.
         | 
| 99 | 
            +
                #
         | 
| 100 | 
            +
                def validate?
         | 
| 101 | 
            +
                  if @offset__GOGYOU__ + bytesize > @buffer__GOGYOU__.bytesize
         | 
| 102 | 
            +
                    false
         | 
| 103 | 
            +
                  else
         | 
| 104 | 
            +
                    true
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 91 108 | 
             
                def inspect
         | 
| 92 | 
            -
                   | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 109 | 
            +
                  text = "#<#{self.class}"
         | 
| 110 | 
            +
                  bufsize = @buffer__GOGYOU__.bytesize
         | 
| 111 | 
            +
                  self.class::MODEL.fields.each_with_index do |f, i|
         | 
| 112 | 
            +
                    if @offset__GOGYOU__ + f.offset + f.bytesize > bufsize
         | 
| 113 | 
            +
                      text << "#{i > 0 ? "," : ""} #{f.name}=N/A"
         | 
| 114 | 
            +
                    else
         | 
| 115 | 
            +
                      text << "#{i > 0 ? "," : ""} #{f.name}=#{__send__(f.name).inspect}"
         | 
| 116 | 
            +
                    end
         | 
| 117 | 
            +
                  end
         | 
| 118 | 
            +
                  text << ">"
         | 
| 95 119 | 
             
                end
         | 
| 96 120 |  | 
| 97 121 | 
             
                def pretty_print(q)
         | 
| 98 | 
            -
                   | 
| 99 | 
            -
             | 
| 100 | 
            -
                     | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 122 | 
            +
                  bufsize = @buffer__GOGYOU__.bytesize
         | 
| 123 | 
            +
                  q.group(2, "#<#{self.class}") do
         | 
| 124 | 
            +
                    self.class::MODEL.fields.each_with_index do |f, i|
         | 
| 125 | 
            +
                      q.text "," if i > 0
         | 
| 126 | 
            +
                      q.breakable " "
         | 
| 127 | 
            +
                      if @offset__GOGYOU__ + f.offset + f.bytesize > bufsize
         | 
| 128 | 
            +
                        q.text "#{f.name}=N/A"
         | 
| 129 | 
            +
                      else
         | 
| 130 | 
            +
                        q.group(1, "#{f.name}=") do
         | 
| 131 | 
            +
                          q.breakable ""
         | 
| 132 | 
            +
                          q.pp __send__(f.name)
         | 
| 133 | 
            +
                        end
         | 
| 134 | 
            +
                      end
         | 
| 135 | 
            +
                    end
         | 
| 106 136 | 
             
                    q.text ">"
         | 
| 107 137 | 
             
                  end
         | 
| 108 138 | 
             
                end
         | 
| @@ -150,10 +180,10 @@ module Gogyou | |
| 150 180 | 
             
                    namecheck = {}
         | 
| 151 181 | 
             
                    fieldsize = model.fields.size
         | 
| 152 182 | 
             
                    define_method(:size__GOGYOU__, -> { fieldsize })
         | 
| 183 | 
            +
                    alias_method(:elementsize, :size__GOGYOU__)
         | 
| 153 184 | 
             
                    alias_method(:size, :size__GOGYOU__)
         | 
| 154 185 | 
             
                    model.fields.each do |field|
         | 
| 155 186 | 
             
                      name = field.name
         | 
| 156 | 
            -
                      #raise NameError, "wrong field name - #{name}" unless name =~ /\A[A-Za-z_][A-Za-z_0-9]*\Z/
         | 
| 157 187 | 
             
                      name = name.intern
         | 
| 158 188 | 
             
                      raise NameError, "already exist field name - #{name}" if namecheck[name]
         | 
| 159 189 | 
             
                      namecheck[name] = true
         | 
| @@ -167,7 +197,7 @@ module Gogyou | |
| 167 197 | 
             
                      end
         | 
| 168 198 |  | 
| 169 199 | 
             
                      define_method(field.name, -> {
         | 
| 170 | 
            -
                        v = type.aref(buffer__GOGYOU__, offset__GOGYOU__ + field.offset)
         | 
| 200 | 
            +
                        v = type.aref(@buffer__GOGYOU__, @offset__GOGYOU__ + field.offset)
         | 
| 171 201 | 
             
                        v.infect_from(self, buffer) unless v.frozen?
         | 
| 172 202 | 
             
                        v.freeze if frozen? || buffer.frozen? || field.const?
         | 
| 173 203 | 
             
                        v
         | 
| @@ -176,7 +206,7 @@ module Gogyou | |
| 176 206 | 
             
                      define_method("#{field.name}=", ->(value) {
         | 
| 177 207 | 
             
                        raise TypeError, "immutable object (#<%s:0x%08X>.%s)" % [self.class, __id__, field.name], caller(2) if frozen?
         | 
| 178 208 | 
             
                        raise TypeError, "immutable field (#<%s:0x%08X>.%s)" % [self.class, __id__, field.name], caller(2) if field.const?
         | 
| 179 | 
            -
                        type.aset(buffer__GOGYOU__, offset__GOGYOU__ + field.offset, value)
         | 
| 209 | 
            +
                        type.aset(@buffer__GOGYOU__, @offset__GOGYOU__ + field.offset, value)
         | 
| 180 210 | 
             
                      })
         | 
| 181 211 | 
             
                    end
         | 
| 182 212 | 
             
                  end
         | 
| @@ -272,27 +302,29 @@ module Gogyou | |
| 272 302 | 
             
                      if model.bytesize == 0
         | 
| 273 303 | 
             
                        define_method(:check_index, ->(index) {
         | 
| 274 304 | 
             
                          index = index.to_i
         | 
| 275 | 
            -
                          unless index >= 0 && index < self. | 
| 276 | 
            -
                            raise IndexError, "out of element size (index #{index} for 0 ... #{self. | 
| 305 | 
            +
                          unless index >= 0 && index < self.elementsize
         | 
| 306 | 
            +
                            raise IndexError, "out of element size (index #{index} for 0 ... #{self.elementsize})", caller(2)
         | 
| 277 307 | 
             
                          end
         | 
| 278 308 | 
             
                          index
         | 
| 279 309 | 
             
                        })
         | 
| 280 310 |  | 
| 281 311 | 
             
                        define_method(:<<, ->(value) {
         | 
| 282 312 | 
             
                          raise TypeError, "immutable object (#<%s:0x%08X>)" % [self.class, __id__], caller(2) if frozen?
         | 
| 283 | 
            -
                          voff = (buffer__GOGYOU__.bytesize - offset__GOGYOU__).align_floor(type.bytesize)
         | 
| 284 | 
            -
                          expandsize = offset__GOGYOU__ + voff + type.bytesize
         | 
| 285 | 
            -
                          buffer__GOGYOU__.resize(expandsize)
         | 
| 286 | 
            -
                          type.aset(buffer__GOGYOU__, offset__GOGYOU__ + voff, value)
         | 
| 313 | 
            +
                          voff = (@buffer__GOGYOU__.bytesize - @offset__GOGYOU__).align_floor(type.bytesize)
         | 
| 314 | 
            +
                          expandsize = @offset__GOGYOU__ + voff + type.bytesize
         | 
| 315 | 
            +
                          @buffer__GOGYOU__.resize(expandsize)
         | 
| 316 | 
            +
                          type.aset(@buffer__GOGYOU__, @offset__GOGYOU__ + voff, value)
         | 
| 287 317 | 
             
                          self
         | 
| 288 318 | 
             
                        })
         | 
| 289 319 |  | 
| 290 | 
            -
                        define_method(: | 
| 291 | 
            -
                          (buffer__GOGYOU__.bytesize - offset__GOGYOU__).unit_floor(type.bytesize)
         | 
| 320 | 
            +
                        define_method(:elementsize, -> {
         | 
| 321 | 
            +
                          (@buffer__GOGYOU__.bytesize - @offset__GOGYOU__).unit_floor(type.bytesize)
         | 
| 292 322 | 
             
                        })
         | 
| 293 323 |  | 
| 324 | 
            +
                        alias_method(:size, :elementsize)
         | 
| 325 | 
            +
             | 
| 294 326 | 
             
                        define_method(:bytesize, -> {
         | 
| 295 | 
            -
                          (buffer__GOGYOU__.bytesize - offset__GOGYOU__).align_floor(type.bytesize)
         | 
| 327 | 
            +
                          (@buffer__GOGYOU__.bytesize - @offset__GOGYOU__).align_floor(type.bytesize)
         | 
| 296 328 | 
             
                        })
         | 
| 297 329 | 
             
                      else
         | 
| 298 330 | 
             
                        eval <<-EOS
         | 
| @@ -304,10 +336,12 @@ module Gogyou | |
| 304 336 | 
             
                            index
         | 
| 305 337 | 
             
                          end
         | 
| 306 338 |  | 
| 307 | 
            -
                          def  | 
| 339 | 
            +
                          def elementsize
         | 
| 308 340 | 
             
                            #{elements}
         | 
| 309 341 | 
             
                          end
         | 
| 310 342 |  | 
| 343 | 
            +
                          alias size elementsize
         | 
| 344 | 
            +
             | 
| 311 345 | 
             
                          def bytesize
         | 
| 312 346 | 
             
                            #{type.bytesize * elements}
         | 
| 313 347 | 
             
                          end
         | 
| @@ -315,19 +349,19 @@ module Gogyou | |
| 315 349 | 
             
                      end
         | 
| 316 350 |  | 
| 317 351 | 
             
                      define_method(:to_s, -> {
         | 
| 318 | 
            -
                        buffer__GOGYOU__.byteslice(offset__GOGYOU__, self.bytesize)
         | 
| 352 | 
            +
                        @buffer__GOGYOU__.byteslice(@offset__GOGYOU__, self.bytesize)
         | 
| 319 353 | 
             
                      })
         | 
| 320 354 |  | 
| 321 355 | 
             
                      define_method(:[], ->(index) {
         | 
| 322 | 
            -
                        v = type.aref(buffer__GOGYOU__, offset__GOGYOU__ + check_index(index) * bytesize)
         | 
| 356 | 
            +
                        v = type.aref(@buffer__GOGYOU__, @offset__GOGYOU__ + check_index(index) * bytesize)
         | 
| 323 357 | 
             
                        v.infect_from(self, buffer) unless v.frozen?
         | 
| 324 358 | 
             
                        v.freeze if frozen? || buffer.frozen? || field.const?
         | 
| 325 359 | 
             
                        v
         | 
| 326 360 | 
             
                      })
         | 
| 327 361 |  | 
| 328 362 | 
             
                      define_method(:[]=, ->(index, value) {
         | 
| 329 | 
            -
                        raise TypeError, "immutable object (#<%s:0x%08X>)" % [self.class, __id__, index], caller(2) if frozen?  | 
| 330 | 
            -
                        type.aset(buffer__GOGYOU__, offset__GOGYOU__ + check_index(index) * bytesize, value)
         | 
| 363 | 
            +
                        raise TypeError, "immutable object (#<%s:0x%08X>)" % [self.class, __id__, index], caller(2) if frozen? || field.const?
         | 
| 364 | 
            +
                        type.aset(@buffer__GOGYOU__, @offset__GOGYOU__ + check_index(index) * bytesize, value)
         | 
| 331 365 | 
             
                      })
         | 
| 332 366 | 
             
                    end
         | 
| 333 367 | 
             
                    klass
         | 
| @@ -336,7 +370,7 @@ module Gogyou | |
| 336 370 | 
             
                  def self.aset(buffer, offset, value)
         | 
| 337 371 | 
             
                    case value
         | 
| 338 372 | 
             
                    when ::String
         | 
| 339 | 
            -
                      raise ArgumentError, "buffer size too small" unless value.bytesize  | 
| 373 | 
            +
                      raise ArgumentError, "buffer size too small" unless value.bytesize <= self::BYTESIZE
         | 
| 340 374 | 
             
                      buffer.setbinary(offset, value, 0, self::BYTESIZE)
         | 
| 341 375 | 
             
                    when ::Array
         | 
| 342 376 | 
             
                      raise NotImplementedError
         | 
| @@ -351,7 +385,28 @@ module Gogyou | |
| 351 385 |  | 
| 352 386 | 
             
                  def bytesize
         | 
| 353 387 | 
             
                    return super unless self.class.extensible?
         | 
| 354 | 
            -
                    self.class::BYTESIZE * buffer__GOGYOU__.bytesize.unit_floor(self.class::SUBTYPE)
         | 
| 388 | 
            +
                    self.class::BYTESIZE * @buffer__GOGYOU__.bytesize.unit_floor(self.class::SUBTYPE)
         | 
| 389 | 
            +
                  end
         | 
| 390 | 
            +
             | 
| 391 | 
            +
                  def inspect
         | 
| 392 | 
            +
                    text = "["
         | 
| 393 | 
            +
                    elementsize.times.with_index do |n, i|
         | 
| 394 | 
            +
                      text << (i > 0 ? ", " : "") << __send__(:[], n).inspect
         | 
| 395 | 
            +
                    end
         | 
| 396 | 
            +
                    text << "]"
         | 
| 397 | 
            +
                  end
         | 
| 398 | 
            +
             | 
| 399 | 
            +
                  def pretty_print(q)
         | 
| 400 | 
            +
                    q.group(1, "[") do
         | 
| 401 | 
            +
                      elementsize.times.with_index do |n, i|
         | 
| 402 | 
            +
                        if i > 0
         | 
| 403 | 
            +
                          q.text ","
         | 
| 404 | 
            +
                          q.breakable " "
         | 
| 405 | 
            +
                        end
         | 
| 406 | 
            +
                        q.pp __send__(:[], n)
         | 
| 407 | 
            +
                      end
         | 
| 408 | 
            +
                      q.text "]"
         | 
| 409 | 
            +
                    end
         | 
| 355 410 | 
             
                  end
         | 
| 356 411 | 
             
                end
         | 
| 357 412 |  | 
| @@ -360,31 +415,31 @@ module Gogyou | |
| 360 415 |  | 
| 361 416 | 
             
                  def initialize(buffer, offset, model)
         | 
| 362 417 | 
             
                    super(buffer, offset)
         | 
| 363 | 
            -
                    @model__GOGYOU__ =  | 
| 418 | 
            +
                    @model__GOGYOU__ = model
         | 
| 364 419 | 
             
                    self.class.define_accessors(singleton_class, model)
         | 
| 365 420 | 
             
                  end
         | 
| 366 421 |  | 
| 367 422 | 
             
                  def inspect
         | 
| 368 | 
            -
                     | 
| 369 | 
            -
             | 
| 370 | 
            -
             | 
| 371 | 
            -
             | 
| 423 | 
            +
                    text = "{"
         | 
| 424 | 
            +
                    model__GOGYOU__.fields.each_with_index do |f, i|
         | 
| 425 | 
            +
                      text << "#{i > 0 ? ", " : ""}#{f.name}=#{__send__(f.name).inspect}"
         | 
| 426 | 
            +
                    end
         | 
| 427 | 
            +
                    text << "}"
         | 
| 372 428 | 
             
                  end
         | 
| 373 429 |  | 
| 374 430 | 
             
                  def pretty_print(q)
         | 
| 375 | 
            -
                    q.group(1, " | 
| 376 | 
            -
                       | 
| 377 | 
            -
             | 
| 378 | 
            -
             | 
| 379 | 
            -
             | 
| 380 | 
            -
             | 
| 381 | 
            -
             | 
| 382 | 
            -
             | 
| 383 | 
            -
             | 
| 384 | 
            -
             | 
| 385 | 
            -
                       | 
| 386 | 
            -
                      q. | 
| 387 | 
            -
                      q.text ">"
         | 
| 431 | 
            +
                    q.group(1, "{") do
         | 
| 432 | 
            +
                      model__GOGYOU__.fields.each_with_index do |f, i|
         | 
| 433 | 
            +
                        if i > 0
         | 
| 434 | 
            +
                          q.text ","
         | 
| 435 | 
            +
                          q.breakable " "
         | 
| 436 | 
            +
                        end
         | 
| 437 | 
            +
                        q.group(1, "#{f.name}=") do
         | 
| 438 | 
            +
                          q.breakable ""
         | 
| 439 | 
            +
                          q.pp __send__(f.name)
         | 
| 440 | 
            +
                        end
         | 
| 441 | 
            +
                      end
         | 
| 442 | 
            +
                      q.text "}"
         | 
| 388 443 | 
             
                    end
         | 
| 389 444 | 
             
                  end
         | 
| 390 445 | 
             
                end
         |