2014-04-14 2 views
0

나는 생각을 가지고있다. 그러나 그것은 의미가있다. 아마 당신, 친애하는 독자, 도울 수 있습니다. :)YAML 파일에 루비 저장하기

내가 YAML 파일을 통해 사용자를 구성 할 수 있습니다 루비 기반의 CLI 응용 프로그램을 만들었습니다

설정. 이 파일에는 사용자가 메시지를 표시하는 사전 및 사후 "작업"을 정의 할 수있는 시나리오가 있습니다 (중간에 임의의 관련이없는 코드가 있음). 예를 들어이 경우

actions: 
    - action 
     # ...other keys... 
     pre: 
     message: 'This is the pre message' 
     action: puts 'PRE COMMAND' 
     post: 
     message: 'This is the post message' 
     action: puts 'POST COMMAND' 

, 내 응용 프로그램이 출력 This is the pre message, (따라서 PRE COMMAND를 출력)은 "전"행동을 평가하는 것입니다, 일부 관련이없는 물건, 출력 This is the post message을, 그리고 마지막으로 이렇게 (이하 "게시물"행동을 평가 POST COMMAND을 출력).

문제점

당신은 이미 문제를 추측 할 수있다; 내가 "평가하다"라는 말을 사용했을 때 나타났다. 그것은 무서운 것입니다. 이것은 로컬에서 실행되는 클라이언트 중심의 앱이지만 임의의 루비를 평가하는 아이디어는 두려운 것입니다.

솔루션 아이디어 # 1

첫 번째 아이디어는 바로 그 것이었다 : 작업을 평가 후면. 나는 그것을 빨리 파괴했다. (당신이 알지 못한다면 - Ruby-than-me 타입은 나를 다르게 설득 할 수있다.)

솔루션 아이디어 # 2

는 명령이 "유효"어떻게 든 것을 검증하기 위해 (아마도, 정규 표현식을 통해) 일부 "확인"마십시오. 그것은 크게 크고 어렵게 보입니다.

솔루션 아이디어 # 3

또 다른 아이디어는 (따라서 사용자가 정의 할 수있는 가능성을 제한) 내 자신의 데이터 구조에서 허용 명령을 포장했다. 예를 들어 open_url 작업을 만들어 기본 브라우저에서 안전하게 URL의 유효성을 검사하고 엽니 다.

저는이 아이디어가 마음에 들지만 다소 제한적으로 보입니다. 시간이 지남에 따라 많은 랩퍼를 정의해야 할 것 같습니다. 그러나 아마도 그것은 안전을 위해 지불하는 가격입니까?

귀하의 전원을 켜고

나는 당신이 추가 생각 주셔서 감사합니다!

+0

그러나 이것은 사용자 정의 가능한 프레임 워크가 직면 한 문제의 변형 일뿐입니다. Ruby On Rails가 나에게 돌아 왔고 페이지 렌더링 프로세스에 내 자신의 코드를 삽입 할 수있게되면 아무 일도 일어나지 않습니다. 인생이 다 그렇지; 그것은 프로그래밍입니다. 나는 문자열의'eval'을 조언하지 않을 것이다; "작업"이 _script 파일에 대한 참조 인 경우로드 (필요)하고 호출 할 수있는 것이 더 좋을 수 있습니다. 그러나 이런 종류의 일은 협력 적 벤처입니다. 사용자가 발을 쏘려는 경우이를 막을 수 없습니다. – matt

+0

맞음, @matt. 묻고 싶다는 나의 의도는 두뇌가 문제를 해결할 수있는 우아한 방법이라고 생각하는 것입니다 (그 중 귀하의 의견은 하나임). – ABach

답변

0

Ruby 플러그인을 허용하는 간단한 프레임 워크를 작성하는 것이 YAML과 코드 스 니펫 (snippet)을 결합하는 것보다 훨씬 낫습니다.

"eval"은 무서운 것이지요. 그래야하지만 때로는 모든 가능한 세련되지 않은 솔루션 중에서 가장 우아한 솔루션입니다. 나는 이번이 그 사건들 중 하나가 아니라고 주장 할 것이다.

그것은 모든 하드는 코드 구성을 표현할 수있는 루비에서 아주 간단한 DSL을 작성하는 아니에요 :

action.pre.message = 'This is the pre message' 
action.pre.command do 
    puts "PRE COMMAND" 
end 

모든이 같은 방법을 미리 정의 된 구조의 수를 데에 달려있다 message= 문자열을 인수로 사용하거나 command 블록을 사용합니다. 마음에 드는 사람이라면 method_missing 핸들러를 작성하고 진행하면서 최대한의 것을 만들어 낼 수 있으므로 최대한의 유연성을 얻을 수 있습니다.

Rakefile에서 capistrano까지 여러 가지 예를 볼 수 있으며 일반적으로 루비가 아닌 구성 파일 형식을 사용하는 것보다 훨씬 효과적입니다.

+0

감사합니다. 현재, 내 응용 프로그램은 특정 데이터 구조/등으로 번역 된 몇 가지 YAML 키를 번역합니다. 앱 자체에서 나는 YAML 키에 매핑되는 DSL의 조합이라고 생각하고 있습니다. 내가 원하는 보안을 적용하면서 유연성을 유지할 수 있습니다. (일명, 내가 뭘보고있는 지 알 수 있습니다.)) – ABach