Grape의 expose 소스 코드 만들기/읽기

17171 단어 RubyRails

rspec의 describe와 it를 직접 만듭니다


코드 객체 읽기


나는 루비의 코드를 조금만 읽으면 끝까지 읽을 수 있을 것이라고 생각한다.
  • 루비에 대한 매개변수가 상세해졌습니다.
  • Grape이라는 API를 간단하게 만들 수 있는 OSS의 소스 코드를 조금 같이 읽고 싶어서 매일 사용하는 코드가 친절하다
  • 마지막으로 우리는 아래의 문법이 무엇인지 알 수 있다.
    describe "RspecでこちらのコードがRuby内部でどういう文法で動いているか" do
    
      puts "分かるようになります"
    
    end
    
    class Status < Grape::Entity
        # またGrapeのこのあたりのコードにも詳しくなります
        expose :style
        expose :html, documentation: { type: String, desc: 'html' } do |f|
            f.body
        end
    end
    
    이것do end{ }같은ブロック이라 불리는 것에 대한 이해가 좀 넓어지고 싶습니다.

    배경.


    안녕하세요, 저예요.이 이야기는, Vue입니다.제이스에서 API를 치고 싶고, 레일스에서 그랩을 만드는 API부터 시작한다.그때 Grapeエラーでるよ〜〜あああああ〜〜라고 생각하고 소스 코드를 쫓아가서 그때 순서대로 말했어요.(설명서를 본 후 설치를 시작하며 나무라지 마세요)

    Grape 코드를 추적해 보세요.


    Enity 샘플


    Grape: Enity의 GiitHub
    class Status < Grape::Entity
        expose :style
        expose :html, documentation: { type: String, desc: 'html' } do |f|
            f.body
        end
    end
    
    이렇게 쓰면...
    present s, with: Status
    
    그래프는 이렇게'JSON 반납'느낌을 준다.
    이번에는 이것expose의 매개 변수에 무엇을 건네야 할지 전혀 몰라서 그 부근의 코드를 추적해야 한다.

    Ruby 매개 변수에 대한 검토

    
    def x1(text)
        puts text
    end
    
    def x2 text
        puts text
    end
    
    x1("it calls x1") # it calls x1
    x2 "it calls x2"  # it calls x2
    
    
    Terminal과 irb로 천천히 전화를 걸면 Ruby는 대화 모드에서 사용할 수 있습니다(MacUser) 위에 있는 코드를 적당히 직접 입력해 보세요.!!
    $ irb
    $ irb(main):001:0>
    

    이런 느낌은 루비는 생략할 수 있다().
    참조: 루비의 인코딩 스타일

    Grape의 expose 사용법을 다시 한 번 보도록 하겠습니다.


    지난번에 루비의 () 생략을 배웠기 때문에 아래 코드를 이해할 수 있을 거예요.
    expose :user_name
    
    즉, expose는 하나의 방법으로 :user_name이라는 기호를 매개 변수에 건네주는 것이 보기에 이렇다.(잘못하면 지도자가 알려줄 테니 평론란을 참조하세요!)
    지금까지 루비에 대해 좀 익숙해진 것 같아.
    그래서 다음에 expose이 방법을 보러 가자.

    Grape의 expose 소스 코드 보기


    소스 코드 여기 있음lib/grape_entity/entity.rb
    def self.expose(*args, &block)
        options = merge_options(args.last.is_a?(Hash) ? args.pop : {})
    
        if args.size > 1
            raise ArgumentError, 'You may not use the :as option on multi-attribute exposures.' if options[:as]
            raise ArgumentError, 'You may not use the :expose_nil on multi-attribute exposures.' if options.key?(:expose_nil)
            raise ArgumentError, 'You may not use block-setting on multi-attribute exposures.' if block_given?
        end
    
        raise ArgumentError, 'You may not use block-setting when also using format_with' if block_given? && options[:format_with].respond_to?(:call)
    
        if block_given?
            if block.parameters.any?
                options[:proc] = block
            else
                options[:nesting] = true
            end
        end
    
        @documentation = nil
        @nesting_stack ||= []
        args.each { |attribute| build_exposure_for_attribute(attribute, @nesting_stack, options, block) }
    end
    
    20줄 정도밖에 안 되니까 금방 이해하실 수 있겠죠(참고로 제가 이해를 못해서 이 기사를 쓰면서 이해)

    Grape의 expose 소스 코드를 적당히 이해하기

    def self.expose(*args, &block)
        options = "引数の *args からオプションをいい感じに整形する"
    
        if args.size > 1
            "問題あったらエラーだす"
        end
    
        raise ArgumentError, '問題ないよね…?'
    
        if block_given?
            "引数として &block が渡されてるとごにょごにょ"
        end
    
        @documentation = nil
        @nesting_stack ||= []
        args.each { |attribute| "いい感じにゴニョゴニョしてデータ作り出す" }
    end
    
    솔직히 잘 모르겠어요 def self.expose(*args, &block) 이것*args引数はたくさん渡せるよ!이고 마지막&block引数の最後にブロック渡せるぜ!!!!이라는 뜻이에요.(강행)
    ※ 블록do end 또는 {}이란 루비block_given?의 방법으로 블록을 매개 변수로 교부할 수 있습니다.

    Grape의 expose 사용법 다시 보기(3회)


    그래서 나도 읽을 수 있을 거야..
    expose :html, documentation: { type: String, desc: 'html' } do |f|
        f.body
    end
    
    expose 이 방법의 매개 변수는
  • :html
  • documentation: { type: String, desc: 'html' })
  • do |f| f.body; end
  • 에서 마지막 세 개는 블록 요소로 식별됩니다.
    def self.expose(*args, &block)
        options = merge_options(args.last.is_a?(Hash) ? args.pop : {})
    end
    
    그리고 expose 방법을 보면 1과 2는 (*args), 3은 블록(&block)으로 들어간다.args.last.is_a?(Hash) *args の最後がハッシュなら이라는 뜻이긴 하지만 이 *args의 마지막에 documentation 문서를 놓지 않으면 오류가 발생할 수 있다고 생각해요. (이번엔 그걸 쫓지 않아요)

    블록이 전달되었는지 확인하기 (&block)


    Rubby 방법이 block_given?에서 통과되었는지 확인할 수 있습니다.
    def self.expose(*args, &block)
        if block_given?
            "引数として &block が渡されてるとごにょごにょ"
        end
    end
    
    그래서 expose는 두 가지 문법이 있다.
    class Status < Grape::Entity
        expose :style
        expose :html, documentation: { type: String, desc: 'html' } do |f|
            f.body
        end
    end
    
    do; end;의 문법, 아무것도 덧붙이지 않은 문법은 모두 문법이 정확하다expose로 설계되었다.
    평소 의도치 않게 사용하던 코드를 추적해 봤는데 개인적으로 루비를 잘 몰라서 쓰면 엔지니어로서 성장할 수 없다고 생각했어요.
    block_given? 의 문서

    Rspec 코드는 쫓지 않지만 해봐


    Rspec 서문


    여기까지expose의 코드를 읽고 루비의 사용 방법에 대한 이해를 깊이 있게 했습니다.
    다음은 본론입니다. 저는 Rspecdescribe을 직접 쓰고 싶습니다.
    describe "xxxをテストする" do
      puts "これで合ってるかな…"
    end
    
    여기까지 읽은 독자들은 describe 이 방법의 매개 변수는 (text, block) 문장과 네모난 블록이라는 것을 이미 알았을 것이다.

    Rspec 제작 편

    # encoding: utf-8
    
    def describe(msg, &block)
        if block_given?
            block.call
        else
            puts msg
        end
    end
    
    puts "~~~~~~~~~~~~~~~~~~~~~~~~~~"
    
    describe "こちらテストですよ!!!!!!"
    
    
    puts "~~~~~~~~~~~~~~~~~~~~~~~~~~"
    
    describe "こちらテストです" do
      puts "ブロック渡したらどうなるかテスト"
    end
    
    # 返ってくる値
    #
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~
    # こちらテストですよ!!!!!!
    # ~~~~~~~~~~~~~~~~~~~~~~~~~~
    # ブロック渡したらどうなるかテスト
    
    
    이번에 제작된 describe은 블록을 건네주고 지점을 나누어 처리해 봤습니다.

  • 블록을 내는 상황
  • block_given?true

  • 실행block.call

  • 청크를 전달하지 않을 때
  • 첫 번째 매개 변수에서 건네준 msg만puts합니다.
  • Paiza.조작 견본
    만약 내가 이 정도까지 할 수 있다면 나는 루비의 매개 변수 주인이라고 생각한다

    block.call


    블록을 실행합니다.
    block.call
    

    Rspec의 소스 코드 정보


    창고가 여기.일 수도 있지만 describe나 어디에 설치되었는지 직접 읽지 않았습니다.아시는 분들은 기사를 쓸 때 즐겁게 읽으시니까 댓글로 읽어주세요~

    최후


    자신이 평소에 사용하는 소스 코드는 마음에 드는 부분만 읽어봐도 된다.이것만으로도 OSS를 쓰는 것처럼 (형식부터 시작하는 사람) 문서에 제대로 쓰여있지 않은 것을 알 수 있어서 다행이다.(이번expose 마지막 매개 변수는 문서죠?이렇게 생각하면)
    입을 피해도 자세한 내용은 말할 수 없으니 자세한 홍보나 댓글창에서 안내를 받으면 좋겠다.끝까지 읽어주셔서 감사합니다!!

    좋은 웹페이지 즐겨찾기