yml_builder 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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