-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Новый DSL (обсуждение) #1
Comments
надо в map или параметр с названием вложенных элементов передавать map :categories do
element :category do
attributes :id, :parentId => :parent_id
end
end |
@vkuznetsov обновил |
А почему у тебя обращение не вот такое? parser.parse(STDIN) do |tag|
case tag.name
when :category
p [tag.name, tag.id, tag.parent_id]
when :offer
p [
tag.id,
tag.available,
tag.name,
tag.category_id,
tag.price.currency_id,
tag.price.text,
tag.params[0].name,
tag.params[0].text,
tag.params[1].name,
tag.params[1].text
]
end
end |
@Strech можно, конечно, и использовать method_missing, но это будет не оч. быстро, да и непонятно тогда, как быть, если встретится атрибут |
@take-five А если без миссинга, а по карте создавать методы доступа? |
@Strech да можно и так, только не в первую очередь Я все же сначала хочу сделать хороший DSL для описания структуры документа |
А что есть для namespace? <stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' xml:lang='en' id='33758cb8-0122-4f54-8807-2936de0e20f4' from='vines.machines.dev' version='1.0'> или <stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls></stream:features> |
Можно то же самое, только строками: Ox::Mapper.document do
map 'stream:stream' do
end
end Можно передавать параметр: Ox::Mapper.document do
map :stream, :namespace => :stream do
end
end Можно делать, как в рельсе: Ox::Mapper.document do
namespace :stream do
map :stream do
end
end
end Как лучше? |
Мне понравились вариант 1 и 2, 3-ий выглядит запутано А еще вопрос, т.е для доступа к Ox::Mapper.document do
map :stream, :namespace => :features do
map :starttls do
element :required
end
end
end |
Не оч. понял, а что именно ты хочешь получить из второго примера? |
Элемент required да/нет есть он или нет |
Тогда так Ox::Mapper.document do
map :starttls, :scope => 'stream:features' do
element :required
end
end |
Нормально вроде бы |
👍 |
1 similar comment
👍 |
@Strech а можешь прислать XML-документы, которые ты обрабатываешь? |
Господа, еще предлагаю совместно подумать над названиями методов в DSL. Имена Смотрите, сейчас есть такие слова:
Давайте подумаем, как можно лучше назвать методы |
Можно вообще установить такое правило, что в финальную выборку попадают только элементы, объявленные непосредственно в блоке |
<!-- 1 -->
<body xmlns="http://jabber.org/protocol/httpbind" xmlns:stream="http://etherx.jabber.org/streams">
<stream:features>
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>
</stream:features>
</body>
<!-- 2 -->
<body xmlns="http://jabber.org/protocol/httpbind">
<stream:features xmlns:stream="http://etherx.jabber.org/streams"/>
</body>
<!-- 3 -->
<body xmlns="http://jabber.org/protocol/httpbind">
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
</body>
<!-- 4 -->
<body xmlns="http://jabber.org/protocol/httpbind" xmlns:xmpp="urn:xmpp:xbosh" xmlns:stream="http://etherx.jabber.org/streams" charsets="UTF-8" from="im.test-pulscen.ru" hold="1" inactivity="20" polling="5" requests="2" sid="d4b05531-63ff-4ee9-b988-49aefbd7b54e" ver="1.6" wait="60" xmpp:version="1.0">
<stream:features>
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
</body> |
Поддерживаю отмену map в пользу вывода только корневого уровня (Смысла писать map внутри другого map нет) |
|
Т.о. остается три метода: |
Вместо маловнятного слова Ox::Mapper.document do
element :category, :under => :categories
under :shop do
under :offers do
element :offer
end
end
end Как считаете? |
Ox::Mapper.document do
element :category, :inside => :categories
inside :shop do
inside :offers do
element :offer
end
end
end |
Вова, как считаешь? |
А чем scope непонятен? |
Если не scope, то плюсую inside |
Подытожим: parser = Ox::Mapper.document do
inside :shop do
inside :categories do
element :category do
attribute :id
attribute :parentId, :as => :parent_id
end # </category>
end # </categories>
inside :offers do
element :offer do
attributes :id, :available
element :name
element :categoryId, :as => :category_id
element :price do
attribute :currencyId, :as => :currency_id
end
collection :params do
element :param, :attributes => :name
end
end # </offer>
end # </offers>
end # </shop>
end По-моему, получилось секси ) |
@take-five @vkuznetsov Да, вышло круто, легко читается и выглядит круто |
Предположим, у нас есть XML-документ следующей структуры:
Предлагается следующее API для создания парсера документа такой структуры:
Очень приветствуются замечания и дополнения.
The text was updated successfully, but these errors were encountered: