yml_builder 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b10e44faa9d509c11bbe34e4e0add97bb5956f15
4
- data.tar.gz: 9e7634b0d218b487480bb242a404e9705d5a7991
3
+ metadata.gz: f345347a313447611efffb080f9fe5c71bd41702
4
+ data.tar.gz: aaa36cfb2590870a030f1b39756114ea43e06f74
5
5
  SHA512:
6
- metadata.gz: 14847041d19be93067fb9f0c2ca4cab96030115071191841b55bfcd0fbe0057c90b598140be1db47fad77018bb5551568271881b182f1a276559425d2b217f8f
7
- data.tar.gz: 1239542340171ddf325f154722a8678787e06d50e19731c699c656ad4180c200522545b05d23043599b37424a32d7ae0e7c817a73624f78d7979378848a7e7df
6
+ metadata.gz: fa385fbdb34c75143286a4fb69d1ceed58df439faed06663adf657f0b4456201947d2d23e3a8f249a9d59bb34344aa4f57485994a6453dd304d2a13256019cd0
7
+ data.tar.gz: dda2773df6b790eb697709c5790275f5368bae2dfd1c9697cb834bccc83f868fc8452da1fcbd3b7549ecb5515eb4844fed3d32e48a70dd9ee023a70989e4e94f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.1.1 (2015-05-14)
2
+
3
+ * Добавлен метод .categories.has?, который проверяет наличие категории в формируемом прайс-листе.
4
+
5
+
1
6
  ## 0.1.0 (2015-05-11)
2
7
 
3
8
  * Начальная версия
@@ -1,7 +1,12 @@
1
+ # Класс обеспечивает добавление в парйс-лист Yandex.Market категорий Интернет-магазинов
2
+
1
3
  module YmlBuilder
2
4
  class Categories
3
5
  # Переменная содержит список id категорий, для которых необходимо формировать прайс-лист.
4
6
  # Если переменная пуста, то включаются все категории
7
+ # @example Примеры использования
8
+ # price = YmlBuilder::Yml.new
9
+ # price.categories.filter = [1, 3, 4, 5]
5
10
  attr_reader :filter
6
11
 
7
12
  def initialize(stats)
@@ -9,6 +14,17 @@ module YmlBuilder
9
14
  init_class
10
15
  end
11
16
 
17
+ # Метод добавляет категорию Интернет-магазина в прайс-лист с учетом выставленных в значении filter настроек.
18
+ #
19
+ # @param [Hash] opts параметры категорий Интернет-магазина
20
+ # @option opts [Object] :id идентификатор категории (обязательно)
21
+ # @option opts [Integer] :parent_id идентификатор родительской категории (опционально)
22
+ # @option opts [String] :name название категории (обязательно)
23
+ # @return [Boolean] true, если категория была добавлена, и false, если добавление запрещено в filter
24
+ # @example Примеры использования
25
+ # price = YmlBuilder::Yml.new
26
+ # price.categories.add(id: 1, name: 'Игрушки')
27
+ # price.categories.add(id: 2, name: 'Игрушки для девочек', parent_id: 1)
12
28
  def add(opts = {})
13
29
  return false unless can_add?(opts[:id])
14
30
  allow = [:id, :parent_id, :name]
@@ -34,6 +50,9 @@ module YmlBuilder
34
50
  # Filter может принимать значения nil или [], тогда считается, что допустимо включение в прайс-лист
35
51
  # всех товаров.
36
52
  # @param [Array] allow массив id категорий, который должны попадать в результирующий прайс-лист
53
+ # @example Примеры использования
54
+ # price = YmlBuilder::Yml.new
55
+ # price.categories.filter = [1, 3, 4, 5]
37
56
  def filter=(allow)
38
57
  @filter = allow || Array.new
39
58
  end
@@ -41,7 +60,7 @@ module YmlBuilder
41
60
  # Метод формирует фрагмент YML файла каталога Яндекс.Маркет, содержащий список категорий
42
61
  #
43
62
  # @param [Integer] ident отступ от левого края в символах
44
- # @return [String] фрагмент YML файла каталога Яндекс.Маркет, содержащий список категорий
63
+ # @return [String] фрагмент YML файла каталога Яндекс.Маркет
45
64
  def to_yml(ident = 4)
46
65
  out = Array.new
47
66
  out << '<categories>'
@@ -61,6 +80,14 @@ module YmlBuilder
61
80
  out.join("\n")
62
81
  end
63
82
 
83
+ # Метод возвращает true, если категория, передаваемая в качестве параметра, уже добавлена в прайс-лист
84
+ #
85
+ # @param [Object] id идентификатор категории
86
+ # @return [Boolean] true, если категория с заданным id уже была добавлена в прайс-лист
87
+ def has?(id)
88
+ @params[id].nil? ? false : true
89
+ end
90
+
64
91
  private
65
92
 
66
93
  def init_class
@@ -1,4 +1,4 @@
1
- module YmlBuilder
1
+ module YmlBuilder # :nodoc:
2
2
  class Common
3
3
 
4
4
  def self.encode_special_chars(out)
@@ -1,29 +1,34 @@
1
1
  module YmlBuilder
2
2
  class CommonOffer
3
+ # Уникальный идентификатор товара
4
+ # @example Примеры использования
5
+ # offer = YmlBuilder::Offer.new('simple')
6
+ # offer.id = 10
3
7
  attr_accessor :id
8
+ # Уникальный идентификатор типа товара, в соответствии с классификацией Yandex.MArket. Устанавливается в конструкторе
9
+ # @example Примеры использования
10
+ # offer = YmlBuilder::Offer.new('simple')
11
+ # puts offer.type #=> 'simple'
4
12
  attr_accessor :type
13
+ # Наличие товара на складе
14
+ # @example Примеры использования
15
+ # offer = YmlBuilder::Offer.new('simple')
16
+ # puts offer.available = true
5
17
  attr_accessor :available
6
18
  attr_accessor :bid
7
19
 
20
+ # Список обязательных полей для данного типа оффера
8
21
  attr_accessor :mandatories
9
22
 
10
23
  def initialize
11
24
  init_class
12
25
  end
13
26
 
14
- def init_class
15
- @params = Hash.new
16
- @meta = Hash.new
17
- @picture = Array.new
18
-
19
- @id = 0
20
- @type = 'unknown'
21
- @available = false
22
- @bid = nil
23
-
24
- @mandatories = Array.new
25
- end
26
-
27
+ # Метод добавляет ссылку на фотографию товара в конец списка, и ограничивает список 10-ю фотографиями
28
+ # @param [String] url ссылка на фотографию товара
29
+ # @example Примеры использования
30
+ # offer = YmlBuilder::Offer.new('simple')
31
+ # offer.add_picture('http://example-site.ru/image1.jpg')
27
32
  def add_picture(url)
28
33
  @picture << url
29
34
  @picture.uniq!
@@ -31,6 +36,11 @@ module YmlBuilder
31
36
  @picture = @picture[0,9]
32
37
  end
33
38
 
39
+ # Метод добавляет ссылку на фотографию товара в начало списка, и ограничивает список 10-ю фотографиями
40
+ # @param [String] url ссылка на фотографию товара (на основную фотографию)
41
+ # @example Примеры использования
42
+ # offer = YmlBuilder::Offer.new('simple')
43
+ # offer.add_cover_picture('http://example-site.ru/cover_image1.jpg')
34
44
  def add_cover_picture(url)
35
45
  @picture.unshift(url)
36
46
  @picture.uniq!
@@ -38,10 +48,45 @@ module YmlBuilder
38
48
  @picture = @picture[0,9]
39
49
  end
40
50
 
51
+ # Метод добавляет характеристики товара (для секции 'param')
52
+ #
53
+ # @param [String] name наименование параметра, например "Количество товара"
54
+ # @param [String] unit суффикс параметра, например "шт."
55
+ # @param [Object] value значение параметра
56
+ # @example Примеры использования
57
+ # offer = YmlBuilder::Offer.new('simple')
58
+ # offer.add_param(name: "Количество", unit: "шт.", value: 100)
59
+ # offer.add_param(name: "Обложка", value: "мягкая")
41
60
  def add_param(name:, unit: nil, value:)
42
61
  @meta[name] = { unit: unit, value: value}
43
62
  end
44
63
 
64
+ # Метод формирует фрагмент YML файла каталога Яндекс.Маркет для одного товара
65
+ #
66
+ # @param [Integer] ident отступ от левого края в символах
67
+ # @return [String] фрагмент YML файла каталога Яндекс.Маркет
68
+ def to_yml(ident = 4)
69
+ out = Array.new
70
+ out << header_line
71
+
72
+ @params.each do |key, value|
73
+ if [:picture, :param].include?(key)
74
+ out += to_yml_subsections(key)
75
+ elsif @mandatories.include?(key)
76
+ out << to_yml_mandatories(key, value)
77
+ else
78
+ out << to_yml_optional(key, value)
79
+ end
80
+ end
81
+ out.compact!
82
+
83
+ out << footer_line
84
+ out.map! { |line| ' '.rjust(ident, ' ') + line }
85
+ out.join("\n")
86
+ end
87
+
88
+ private
89
+
45
90
  def method_missing(method_sym, *arguments, &block)
46
91
  if @params.include?(method_sym.to_s.gsub(/=$/, '').to_sym)
47
92
  processing_method(method_sym, arguments.first)
@@ -54,8 +99,8 @@ module YmlBuilder
54
99
  if method_sym.to_s.match(/=$/)
55
100
  key = method_sym.to_s.gsub(/=$/, '')
56
101
  warn "Предупреждение: url не должен превышать 512 символов" if key == 'url' && value.length > 512
57
- warn "Предупреждение: price не может быть равен нулю" if key == 'price' && value.to_f == 0
58
- warn "Предупреждение: weight не может быть равен нулю" if key == 'weight' && value.to_f == 0
102
+ warn "Предупреждение: price не может быть равен нулю (offer id #{@id})" if key == 'price' && value.to_f == 0
103
+ warn "Предупреждение: weight не может быть равен нулю (offer id #{@id})" if key == 'weight' && value.to_f == 0
59
104
  @params[key.to_sym] = value
60
105
  else
61
106
  @params[method_sym.to_s.gsub(/=$/, '').to_sym]
@@ -111,24 +156,17 @@ module YmlBuilder
111
156
  " <#{key_xml}>#{::YmlBuilder::Common.encode_special_chars(value)}</#{key_xml}>"
112
157
  end
113
158
 
114
- def to_yml(ident = 4)
115
- out = Array.new
116
- out << header_line
159
+ def init_class
160
+ @params = Hash.new
161
+ @meta = Hash.new
162
+ @picture = Array.new
117
163
 
118
- @params.each do |key, value|
119
- if [:picture, :param].include?(key)
120
- out += to_yml_subsections(key)
121
- elsif @mandatories.include?(key)
122
- out << to_yml_mandatories(key, value)
123
- else
124
- out << to_yml_optional(key, value)
125
- end
126
- end
127
- out.compact!
164
+ @id = 0
165
+ @type = 'unknown'
166
+ @available = false
167
+ @bid = nil
128
168
 
129
- out << footer_line
130
- out.map! { |line| ' '.rjust(ident, ' ') + line }
131
- out.join("\n")
169
+ @mandatories = Array.new
132
170
  end
133
171
 
134
172
  end
@@ -5,25 +5,28 @@ module YmlBuilder
5
5
  init_class
6
6
  end
7
7
 
8
- def init_class
9
- @params = Hash.new
10
-
11
- @params[:rur] = nil
12
- @params[:rub] = nil
13
- @params[:usd] = nil
14
- @params[:eur] = nil
15
- @params[:uah] = nil
16
- @params[:kzt] = nil
17
- end
8
+ # Метод формирует фрагмент YML файла каталога Яндекс.Маркет, содержащий список валют
9
+ #
10
+ # @param [Integer] ident отступ от левого края в символах
11
+ # @return [String] фрагмент YML файла каталога Яндекс.Маркет
12
+ def to_yml(ident = 4)
13
+ out = Array.new
14
+ out << '<currencies>'
18
15
 
19
- def method_missing(method_sym, *arguments, &block)
20
- if @params.include?(method_sym.to_s.gsub(/=$/, '').to_sym)
21
- processing_method(method_sym, arguments.first)
22
- else
23
- super
16
+ @params.each do |key, value|
17
+ out << " <currency id=#{key.to_s.upcase.inspect} rate=#{value.to_s.upcase.inspect}/>" unless value.nil?
24
18
  end
19
+ warn "Предупреждение: не указано ни одной валюты в секции 'currencies'" if out.count == 1
20
+
21
+ out << '</currencies>'
22
+
23
+ out.map! { |line| line = ' '.rjust(ident, ' ') + line }
24
+
25
+ out.join("\n")
25
26
  end
26
27
 
28
+ private
29
+
27
30
  def valid?(method_sym, allow, value)
28
31
  return true if value.to_s.match(/^\s*[+-]?((\d+_?)*\d+(\.(\d+_?)*\d+)?|\.(\d+_?)*\d+)(\s*|([eE][+-]?(\d+_?)*\d+)\s*)$/)
29
32
  return true if allow.include?(value)
@@ -43,20 +46,23 @@ module YmlBuilder
43
46
  end
44
47
  end
45
48
 
46
- def to_yml(ident = 4)
47
- out = Array.new
48
- out << '<currencies>'
49
-
50
- @params.each do |key, value|
51
- out << " <currency id=#{key.to_s.upcase.inspect} rate=#{value.to_s.upcase.inspect}/>" unless value.nil?
52
- end
53
- warn "Предупреждение: не указано ни одной валюты в секции 'currencies'" if out.count == 1
54
-
55
- out << '</currencies>'
49
+ def init_class
50
+ @params = Hash.new
56
51
 
57
- out.map! { |line| line = ' '.rjust(ident, ' ') + line }
52
+ @params[:rur] = nil
53
+ @params[:rub] = nil
54
+ @params[:usd] = nil
55
+ @params[:eur] = nil
56
+ @params[:uah] = nil
57
+ @params[:kzt] = nil
58
+ end
58
59
 
59
- out.join("\n")
60
+ def method_missing(method_sym, *arguments, &block)
61
+ if @params.include?(method_sym.to_s.gsub(/=$/, '').to_sym)
62
+ processing_method(method_sym, arguments.first)
63
+ else
64
+ super
65
+ end
60
66
  end
61
67
 
62
68
  end
@@ -1,3 +1,6 @@
1
+ # Модуль является рамочным. При создании товара данного типа, в реальности
2
+ # будет возвращен класс товара заданного типа
3
+
1
4
  module YmlBuilder
2
5
  class Offer
3
6
 
@@ -1,4 +1,4 @@
1
- module YmlBuilder
1
+ module YmlBuilder # :nodoc:
2
2
  class OfferSimple < YmlBuilder::CommonOffer
3
3
 
4
4
  def initialize
@@ -1,3 +1,6 @@
1
+ # Модуль управления карточками товара разного типа. По сути - это класс-массив, в котором
2
+ # хранятся все товары
3
+
1
4
  module YmlBuilder
2
5
  class Offers
3
6
 
@@ -7,10 +10,12 @@ module YmlBuilder
7
10
  init_class
8
11
  end
9
12
 
10
- def init_class
11
- @offers = Hash.new
12
- end
13
-
13
+ # Метод добавляет товар в прайс-лист с учетом выставленных в значении filter настроек.
14
+ #
15
+ # @param [{YmlBuilder::CommonOffer}] offer карточка товара
16
+ # @example Примеры использования
17
+ # price = YmlBuilder::Yml.new
18
+ # price.offers.add(offer)
14
19
  def add(offer)
15
20
  return false unless @categories.can_add?(offer.category_id)
16
21
  @offers[offer.id] = offer
@@ -24,6 +29,10 @@ module YmlBuilder
24
29
  true
25
30
  end
26
31
 
32
+ # Метод формирует фрагмент YML файла каталога Яндекс.Маркет для всего списка товаров
33
+ #
34
+ # @param [Integer] ident отступ от левого края в символах
35
+ # @return [String] фрагмент YML файла каталога Яндекс.Маркет
27
36
  def to_yml(ident = 4)
28
37
  @offers = @offers.sort_by { |id, offer| id }
29
38
 
@@ -38,5 +47,13 @@ module YmlBuilder
38
47
  out.join("\n")
39
48
  end
40
49
 
50
+
51
+ private
52
+
53
+
54
+ def init_class
55
+ @offers = Hash.new
56
+ end
57
+
41
58
  end
42
59
  end
@@ -5,6 +5,35 @@ module YmlBuilder
5
5
  init_class
6
6
  end
7
7
 
8
+ # Метод формирует фрагмент YML файла каталога Яндекс.Маркет для описания Интернет-магазина
9
+ #
10
+ # @return [String] фрагмент YML файла каталога Яндекс.Маркет
11
+ def to_yml
12
+ out = Array.new
13
+ out << ' <shop>'
14
+
15
+ @params[:m].each do |key, value|
16
+ raise "Ошибка секции 'company': не заполнено значение для обязательного ключа #{key.to_s.inspect}" if value == ''
17
+ out << " <#{key}>#{::YmlBuilder::Common.encode_special_chars(value)}</#{key}>"
18
+ end
19
+
20
+ @params[:o].each do |key, value|
21
+ unless value.nil?
22
+ out << " <#{key}>#{::YmlBuilder::Common.encode_special_chars(value)}</#{key}>"
23
+ end
24
+ end
25
+
26
+ out << ' {replace_currencies}'
27
+ out << ' {replace_categories}'
28
+ out << ' {replace_local_delivery_cost}'
29
+ out << ' {replace_offers}'
30
+ out << ' </shop>'
31
+ out.join("\n")
32
+ end
33
+
34
+
35
+ private
36
+
8
37
  def init_class
9
38
  @params = Hash.new
10
39
 
@@ -43,29 +72,6 @@ module YmlBuilder
43
72
  end
44
73
  end
45
74
 
46
- def to_yml
47
- out = Array.new
48
- out << ' <shop>'
49
-
50
- @params[:m].each do |key, value|
51
- raise "Ошибка секции 'company': не заполнено значение для обязательного ключа #{key.to_s.inspect}" if value == ''
52
- out << " <#{key}>#{::YmlBuilder::Common.encode_special_chars(value)}</#{key}>"
53
- end
54
-
55
- @params[:o].each do |key, value|
56
- unless value.nil?
57
- out << " <#{key}>#{::YmlBuilder::Common.encode_special_chars(value)}</#{key}>"
58
- end
59
- end
60
-
61
- out << ' {replace_currencies}'
62
- out << ' {replace_categories}'
63
- out << ' {replace_local_delivery_cost}'
64
- out << ' {replace_offers}'
65
- out << ' </shop>'
66
- out.join("\n")
67
- end
68
-
69
75
 
70
76
  end
71
77
  end
@@ -1,3 +1,3 @@
1
1
  module YmlBuilder # :nodoc:
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -3,15 +3,30 @@
3
3
 
4
4
  module YmlBuilder
5
5
  class Yml
6
- # Ссылка на класс, описывающий контакты Интернет-магазина
6
+ # Ссылка на класс, описывающий контакты Интернет-магазина ({YmlBuilding::Shop})
7
+ # @example Примеры использования
8
+ # price = YmlBuilder::Yml.new
9
+ # price.shop.phone = '+7 (123) 456-7890'
7
10
  attr_reader :shop
8
- # Ссылка на класс, описывающий категории
11
+ # Ссылка на класс, описывающий категории (YmlBuilding::Categories)
12
+ # @example Примеры использования
13
+ # price = YmlBuilder::Yml.new
14
+ # price.categories.add(id: 1, name: "Игрушки")
15
+ # price.categories.add(id: 4, name: "Игрушки для девочек", parent_id: 1)
9
16
  attr_reader :categories
10
- # Ссылка на класс, описывающий валюты
17
+ # Ссылка на класс, описывающий валюты ({YmlBuilding::Currencies})
18
+ # @example Примеры использования
19
+ # price = YmlBuilder::Yml.new
20
+ # price.currencies.rub = 1
21
+ # price.currencies.usd = 55.04
22
+ # price.currencies.eur = :cbrf
11
23
  attr_reader :currencies
12
- # Ссылка на класс, управляющий товарами (офферами)
24
+ # Ссылка на класс, управляющий товарами (офферами) ({YmlBuilding::Offers})
13
25
  attr_reader :offers
14
26
  # Переменая, хранящая стоимость доставки в локации расположения Интернет-магазина
27
+ # @example Примеры использования
28
+ # price = YmlBuilder::Yml.new
29
+ # price.local_delivery_cost = 300
15
30
  attr_reader :local_delivery_cost
16
31
 
17
32
 
@@ -25,7 +40,7 @@ module YmlBuilder
25
40
  end
26
41
 
27
42
  # Метод устанавливает стоимость доставки в месте локации магазина. Например, если магазин находится в Москве,
28
- # то при указанни данной стоимости, она будет показана покупателям в этом же районе.
43
+ # то при указанни данной стоимости, она будет показана покупателям в этом же районе.
29
44
  #
30
45
  # @param [Float] value стоимость доставки в месте локации магазина
31
46
  # @return [None] нет
@@ -34,9 +49,12 @@ module YmlBuilder
34
49
  end
35
50
 
36
51
  # Метод возвращает статистику по результатам генерации прайс-листа: всего товаров, товаров в наличии, стоимость
37
- # товаров в наличии (без учета количества)
52
+ # товаров в наличии (без учета количества)
38
53
  #
39
54
  # @return [None] нет
55
+ # @example Примеры использования
56
+ # price = YmlBuilder::Yml.new
57
+ # price.stats #=> { :categories => 0, :total => 2, :available => 1, :price => 300.9 }
40
58
  def stats
41
59
  @stats.stats
42
60
  end
@@ -44,6 +62,9 @@ module YmlBuilder
44
62
  # Метод возвращает текстовую строку с прайс-листом в формате Яндекс.Маркет
45
63
  #
46
64
  # @return [String] строка с прайс-листом в формате utf-8
65
+ # @example Примеры использования
66
+ # price = YmlBuilder::Yml.new
67
+ # price.to_yml
47
68
  def to_yml
48
69
  out = @shop.to_yml
49
70
  out.gsub!(/^\s{0,100}\{replace\_currencies\}/, @currencies.to_yml)
@@ -58,6 +79,9 @@ module YmlBuilder
58
79
  #
59
80
  # @param [String] filename название файла для записи прайс-листа
60
81
  # @return [None] нет
82
+ # @example Примеры использования
83
+ # price = YmlBuilder::Yml.new
84
+ # price.save('price.yml')
61
85
  def save(filename)
62
86
  File.open(filename, 'w:windows-1251') {|f| f.write(to_yml) }
63
87
  end
data/test/test_yml.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="windows-1251"?>
2
2
  <!DOCTYPE yml_catalog SYSTEM "shops.dtd">
3
- <yml_catalog date="2015-05-11 14:57">
3
+ <yml_catalog date="2015-05-11 17:24">
4
4
  <shop>
5
5
  <name>������� ����</name>
6
6
  <company>��� &apos;���� &amp; ������&apos;</company>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yml_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stan Zhuravlev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-11 00:00:00.000000000 Z
11
+ date: 2015-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -40,7 +40,7 @@ dependencies:
40
40
  version: '10.0'
41
41
  description: |-
42
42
  Библиотека содержит набор классов для формирования и валидации прайс-листов
43
- в формате Яндекс YAML (Яндекс.Маркет).
43
+ в формате Яндекс YAML (Yandex.Market).
44
44
  Текущая версия поддерживает только упрощенные товарные карточки.
45
45
  email:
46
46
  - stan@post-api.ru