Grape의 expose 소스 코드 만들기/읽기
rspec의 describe와 it를 직접 만듭니다
코드 객체 읽기
나는 루비의 코드를 조금만 읽으면 끝까지 읽을 수 있을 것이라고 생각한다.
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
의 코드를 읽고 루비의 사용 방법에 대한 이해를 깊이 있게 했습니다.다음은 본론입니다. 저는 Rspec
describe
을 직접 쓰고 싶습니다.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
청크를 전달하지 않을 때
만약 내가 이 정도까지 할 수 있다면 나는 루비의 매개 변수 주인이라고 생각한다
block.call
블록을 실행합니다.
block.call
Rspec의 소스 코드 정보
창고가 여기.일 수도 있지만
describe
나 어디에 설치되었는지 직접 읽지 않았습니다.아시는 분들은 기사를 쓸 때 즐겁게 읽으시니까 댓글로 읽어주세요~최후
자신이 평소에 사용하는 소스 코드는 마음에 드는 부분만 읽어봐도 된다.이것만으로도 OSS를 쓰는 것처럼 (형식부터 시작하는 사람) 문서에 제대로 쓰여있지 않은 것을 알 수 있어서 다행이다.(이번
expose
마지막 매개 변수는 문서죠?이렇게 생각하면)입을 피해도 자세한 내용은 말할 수 없으니 자세한 홍보나 댓글창에서 안내를 받으면 좋겠다.끝까지 읽어주셔서 감사합니다!!
Reference
이 문제에 관하여(Grape의 expose 소스 코드 만들기/읽기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ykhirao/items/b13334dc90df2e2c8c14텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)