bitrix_on_rails 0.2.0 → 0.2.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.
- data/Gemfile +1 -1
- data/Gemfile.lock +5 -4
- data/VERSION +1 -1
- data/bitrix_on_rails.gemspec +18 -11
- data/lib/bitrix_on_rails.rb +1 -0
- data/lib/bitrix_on_rails/iblock_element.rb +37 -9
- data/lib/bitrix_on_rails/iblock_element_prop_s.rb +3 -3
- data/lib/php_serialize_encoded.rb +33 -0
- data/test/factories.rb +18 -0
- data/test/helper.rb +2 -8
- data/test/test_active_record.rb +4 -0
- data/test/test_bitrix_on_rails.rb +0 -19
- data/test/test_iblock_element.rb +33 -1
- data/test/test_iblock_element_prop_s.rb +18 -6
- data/test/test_php_serialize_encoded.rb +18 -0
- metadata +55 -30
- data/lib/active_record/connection_adapters/mysql2_downcase_adapter.rb +0 -76
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -42,6 +42,7 @@ GEM
|
|
42
42
|
abstract (>= 1.0.0)
|
43
43
|
factory_girl (2.0.2)
|
44
44
|
git (1.2.5)
|
45
|
+
growl (1.0.3)
|
45
46
|
guard (0.5.1)
|
46
47
|
thor (~> 0.14.6)
|
47
48
|
guard-test (0.3.0)
|
@@ -81,6 +82,7 @@ GEM
|
|
81
82
|
rdoc (~> 3.4)
|
82
83
|
thor (~> 0.14.4)
|
83
84
|
rake (0.9.2)
|
85
|
+
rb-fsevent (0.4.3.1)
|
84
86
|
rcov (0.9.9)
|
85
87
|
rdoc (3.9.1)
|
86
88
|
rr (1.0.3)
|
@@ -97,9 +99,6 @@ GEM
|
|
97
99
|
shoulda (2.11.3)
|
98
100
|
sqlite3 (1.3.4)
|
99
101
|
test-unit (2.3.0)
|
100
|
-
test-unit-rr (1.0.1)
|
101
|
-
rr (>= 1.0.2)
|
102
|
-
test-unit (>= 2.1.2)
|
103
102
|
thor (0.14.6)
|
104
103
|
treetop (1.4.10)
|
105
104
|
polyglot
|
@@ -112,13 +111,15 @@ PLATFORMS
|
|
112
111
|
DEPENDENCIES
|
113
112
|
bundler (~> 1.0.0)
|
114
113
|
factory_girl
|
114
|
+
growl
|
115
115
|
guard-test
|
116
116
|
jeweler (~> 1.6.4)
|
117
117
|
php_serialize!
|
118
118
|
rails (>= 3.0)
|
119
|
+
rb-fsevent
|
119
120
|
rcov
|
121
|
+
rr
|
120
122
|
ruby-debug19
|
121
123
|
shoulda
|
122
124
|
sqlite3
|
123
125
|
test-unit
|
124
|
-
test-unit-rr
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
data/bitrix_on_rails.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bitrix_on_rails}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date = %q{2011-08-
|
11
|
+
s.authors = ["Danil Pismenny"]
|
12
|
+
s.date = %q{2011-08-30}
|
13
13
|
s.description = %q{Использование инфоблоков 1С-Битрикс в Ruby On Rails проектах}
|
14
14
|
s.email = %q{danil@orionet.ru}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -37,7 +37,6 @@ Gem::Specification.new do |s|
|
|
37
37
|
"app/models/iblock_type.rb",
|
38
38
|
"bitrix_on_rails.gemspec",
|
39
39
|
"init.rb",
|
40
|
-
"lib/active_record/connection_adapters/mysql2_downcase_adapter.rb",
|
41
40
|
"lib/bitrix_on_rails.rb",
|
42
41
|
"lib/bitrix_on_rails/active_record.rb",
|
43
42
|
"lib/bitrix_on_rails/configuration.rb",
|
@@ -45,6 +44,7 @@ Gem::Specification.new do |s|
|
|
45
44
|
"lib/bitrix_on_rails/iblock_element.rb",
|
46
45
|
"lib/bitrix_on_rails/iblock_element_prop_m.rb",
|
47
46
|
"lib/bitrix_on_rails/iblock_element_prop_s.rb",
|
47
|
+
"lib/php_serialize_encoded.rb",
|
48
48
|
"test/dump.sql",
|
49
49
|
"test/factories.rb",
|
50
50
|
"test/get_dump.sh",
|
@@ -53,12 +53,13 @@ Gem::Specification.new do |s|
|
|
53
53
|
"test/test_active_record.rb",
|
54
54
|
"test/test_bitrix_on_rails.rb",
|
55
55
|
"test/test_iblock_element.rb",
|
56
|
-
"test/test_iblock_element_prop_s.rb"
|
56
|
+
"test/test_iblock_element_prop_s.rb",
|
57
|
+
"test/test_php_serialize_encoded.rb"
|
57
58
|
]
|
58
59
|
s.homepage = %q{http://github.com/dapi/bitrix_on_rails}
|
59
|
-
s.licenses = [
|
60
|
-
s.require_paths = [
|
61
|
-
s.rubygems_version = %q{1.
|
60
|
+
s.licenses = ["MIT"]
|
61
|
+
s.require_paths = ["lib"]
|
62
|
+
s.rubygems_version = %q{1.6.2}
|
62
63
|
s.summary = %q{Работа с инфоблоками 1С-Битрикс}
|
63
64
|
|
64
65
|
if s.respond_to? :specification_version then
|
@@ -75,8 +76,10 @@ Gem::Specification.new do |s|
|
|
75
76
|
s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
|
76
77
|
s.add_development_dependency(%q<factory_girl>, [">= 0"])
|
77
78
|
s.add_development_dependency(%q<test-unit>, [">= 0"])
|
79
|
+
s.add_development_dependency(%q<rb-fsevent>, [">= 0"])
|
80
|
+
s.add_development_dependency(%q<growl>, [">= 0"])
|
78
81
|
s.add_development_dependency(%q<guard-test>, [">= 0"])
|
79
|
-
s.add_development_dependency(%q<
|
82
|
+
s.add_development_dependency(%q<rr>, [">= 0"])
|
80
83
|
else
|
81
84
|
s.add_dependency(%q<rails>, [">= 3.0"])
|
82
85
|
s.add_dependency(%q<php_serialize>, [">= 0"])
|
@@ -88,8 +91,10 @@ Gem::Specification.new do |s|
|
|
88
91
|
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
89
92
|
s.add_dependency(%q<factory_girl>, [">= 0"])
|
90
93
|
s.add_dependency(%q<test-unit>, [">= 0"])
|
94
|
+
s.add_dependency(%q<rb-fsevent>, [">= 0"])
|
95
|
+
s.add_dependency(%q<growl>, [">= 0"])
|
91
96
|
s.add_dependency(%q<guard-test>, [">= 0"])
|
92
|
-
s.add_dependency(%q<
|
97
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
93
98
|
end
|
94
99
|
else
|
95
100
|
s.add_dependency(%q<rails>, [">= 3.0"])
|
@@ -102,8 +107,10 @@ Gem::Specification.new do |s|
|
|
102
107
|
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
103
108
|
s.add_dependency(%q<factory_girl>, [">= 0"])
|
104
109
|
s.add_dependency(%q<test-unit>, [">= 0"])
|
110
|
+
s.add_dependency(%q<rb-fsevent>, [">= 0"])
|
111
|
+
s.add_dependency(%q<growl>, [">= 0"])
|
105
112
|
s.add_dependency(%q<guard-test>, [">= 0"])
|
106
|
-
s.add_dependency(%q<
|
113
|
+
s.add_dependency(%q<rr>, [">= 0"])
|
107
114
|
end
|
108
115
|
end
|
109
116
|
|
data/lib/bitrix_on_rails.rb
CHANGED
@@ -22,5 +22,6 @@ require 'bitrix_on_rails/active_record'
|
|
22
22
|
require 'bitrix_on_rails/iblock_element'
|
23
23
|
require 'bitrix_on_rails/iblock_element_prop_s'
|
24
24
|
require 'bitrix_on_rails/iblock_element_prop_m'
|
25
|
+
require 'php_serialize_encoded'
|
25
26
|
|
26
27
|
ActiveRecord::Base.extend BitrixOnRails::ActiveRecord
|
@@ -8,7 +8,9 @@ module BitrixOnRails
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.define_iblock_class(iblock_id, options = {})
|
11
|
-
|
11
|
+
iblock_version = Iblock.find(iblock_id).version
|
12
|
+
|
13
|
+
iblock_element_class = send("create_iblock_v#{iblock_version}_class", iblock_id, options[:extended_class], options[:extended_by])
|
12
14
|
|
13
15
|
unless options[:extended_class]
|
14
16
|
# Определяем имя класса, который нужно создать, а также namespace, в котором
|
@@ -28,28 +30,54 @@ module BitrixOnRails
|
|
28
30
|
namespace.const_set(class_name, iblock_element_class)
|
29
31
|
end
|
30
32
|
|
31
|
-
|
33
|
+
# Порядок вызова важен, так как только в этот момент у iblock_element_class появляется имя, которое
|
34
|
+
# используется в IblockElementPropS.
|
35
|
+
create_prop_classes(iblock_id, iblock_element_class) if iblock_version == 2
|
36
|
+
|
37
|
+
iblock_element_class
|
32
38
|
end
|
33
39
|
|
34
40
|
protected
|
35
41
|
|
36
|
-
def self.
|
37
|
-
|
42
|
+
def self.create_iblock_v1_class(iblock_id, extended_class = nil, extended_by = nil)
|
43
|
+
create_iblock_class(iblock_id, extended_class, extended_by) do
|
44
|
+
has_many :prop_values, :class_name => 'IblockElementProperty', :foreign_key => 'iblock_element_id'
|
38
45
|
|
39
|
-
|
40
|
-
|
41
|
-
|
46
|
+
@iblock_properties.each { |m, property|
|
47
|
+
define_method m do
|
48
|
+
prop_values.where(:iblock_property_id => property[:id]).first.try(:value)
|
49
|
+
end
|
50
|
+
|
51
|
+
define_method "#{m}=" do |value|
|
52
|
+
prop_values.create(:iblock_property_id => property[:id], :value => value)
|
53
|
+
end
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
42
57
|
|
58
|
+
def self.create_iblock_v2_class(iblock_id, extended_class = nil, extended_by = nil)
|
59
|
+
create_iblock_class(iblock_id, extended_class, extended_by) do
|
43
60
|
has_one :property_set, :class_name => "IblockElementPropS#{iblock_id}", :foreign_key => 'iblock_element_id', :autosave => true
|
44
61
|
has_many :m_props, :class_name => "IblockElementPropM#{iblock_id}", :foreign_key => 'iblock_element_id', :readonly => true
|
45
62
|
|
46
|
-
default_scope where(:iblock_id => iblock_id)
|
47
|
-
|
48
63
|
@iblock_properties.each { |m, property|
|
49
64
|
delegate m, :to => :property_set
|
50
65
|
delegate "#{m}=", :to => :property_set unless property[:multiple]
|
51
66
|
}
|
52
67
|
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.create_iblock_class(iblock_id, extended_class = nil, extended_by = nil, &blk)
|
71
|
+
iblock_element_class = extended_class || Class.new(::IblockElement) {}
|
72
|
+
|
73
|
+
iblock_element_class.instance_eval do
|
74
|
+
@iblock_id = iblock_id
|
75
|
+
@iblock_properties = Iblock.get_properties(iblock_id).inject({}){ |a,e| a[e[1].code] = {:id => e[1].id, :multiple => e[1].multiple == 'Y'}; a}
|
76
|
+
|
77
|
+
instance_eval(&blk)
|
78
|
+
|
79
|
+
default_scope where(:iblock_id => iblock_id)
|
80
|
+
end
|
53
81
|
|
54
82
|
iblock_element_class.extend Object.const_get(extended_by) if extended_by
|
55
83
|
|
@@ -79,7 +79,7 @@ module BitrixOnRails::IblockElementPropS
|
|
79
79
|
before_save do
|
80
80
|
self.class.m_props.each { |code, p|
|
81
81
|
values = send(code).values
|
82
|
-
self.send("property_#{p[:id]}=", ::PHP.
|
82
|
+
self.send("property_#{p[:id]}=", ::PHP.serialize_encoded({'VALUE' => values, 'DESCRIPTION' => Array.new(values.size, nil)}))
|
83
83
|
}
|
84
84
|
end
|
85
85
|
end
|
@@ -107,7 +107,7 @@ module BitrixOnRails::IblockElementPropS
|
|
107
107
|
value.is_a?(BigDecimal) ? value.to_i : value
|
108
108
|
when 'S'
|
109
109
|
if value.length > 5 && value[0..3] =~ /[a-z]:\d/
|
110
|
-
v = ::PHP.
|
110
|
+
v = ::PHP.unserialize_encoded(value)
|
111
111
|
v.is_a?(Hash) && v.include?('TEXT') ? v['TEXT'] : value
|
112
112
|
elsif user_type == 'DateTime'
|
113
113
|
Time.parse(value).in_time_zone
|
@@ -125,7 +125,7 @@ module BitrixOnRails::IblockElementPropS
|
|
125
125
|
case type
|
126
126
|
when 'S'
|
127
127
|
if user_type == 'HTML'
|
128
|
-
::PHP.
|
128
|
+
::PHP.serialize_encoded({'TEXT' => value, 'TYPE' => 'html'})
|
129
129
|
elsif user_type == 'DateTime'
|
130
130
|
value.strftime('%Y-%m-%d %H:%M:%S')
|
131
131
|
else
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
module PHP
|
3
|
+
# Когда битрикс работает с базой в cp1251, а рельсы с UTF-8
|
4
|
+
# Возникают проблемы с подсчетом длинны строк при сериализации
|
5
|
+
# 'тест' в cp1251 имеет 4 символа, а в utf-8 - 8.
|
6
|
+
#
|
7
|
+
# Поэтому приходится производить все сериализацию через эти врапперы.
|
8
|
+
#
|
9
|
+
|
10
|
+
def PHP.encode_in_deep(val, encoding)
|
11
|
+
if val.is_a? Array
|
12
|
+
val = val.map { |v| encode_in_deep(v, encoding) }
|
13
|
+
elsif val.is_a? Hash
|
14
|
+
val.each_pair do |k,v|
|
15
|
+
val[k] = encode_in_deep(v, encoding)
|
16
|
+
end
|
17
|
+
elsif val.is_a? String
|
18
|
+
val = val.encode(encoding)
|
19
|
+
end
|
20
|
+
val
|
21
|
+
end
|
22
|
+
|
23
|
+
def PHP.serialize_encoded(val)
|
24
|
+
val = encode_in_deep(val, 'CP1251')
|
25
|
+
serialize(val).encode('UTF-8')
|
26
|
+
end
|
27
|
+
|
28
|
+
def PHP.unserialize_encoded(s)
|
29
|
+
val = unserialize(s.encode('CP1251'))
|
30
|
+
val = encode_in_deep(val, 'UTF-8')
|
31
|
+
val
|
32
|
+
end
|
33
|
+
end
|
data/test/factories.rb
CHANGED
@@ -102,4 +102,22 @@ FactoryGirl.define do
|
|
102
102
|
factory :iblock_element7, :parent => :iblock_element do
|
103
103
|
association :iblock, :factory=>:iblock7
|
104
104
|
end
|
105
|
+
|
106
|
+
#
|
107
|
+
# Инфоблок с version = 1
|
108
|
+
#
|
109
|
+
factory :iblock_v1, :parent => :iblock do
|
110
|
+
version 1
|
111
|
+
|
112
|
+
after_build { |iblock|
|
113
|
+
iblock.iblock_properties.build Factory.build(:iblock_v1_prop_synonym).attributes
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
factory :iblock_v1_prop_synonym, :parent => :iblock_property do
|
118
|
+
name 'Синоним'
|
119
|
+
code 'synonym'
|
120
|
+
property_type 'S'
|
121
|
+
multiple 'N'
|
122
|
+
end
|
105
123
|
end
|
data/test/helper.rb
CHANGED
@@ -14,6 +14,7 @@ require 'active_record'
|
|
14
14
|
require 'factory_girl'
|
15
15
|
require 'shoulda'
|
16
16
|
require 'active_support/test_case'
|
17
|
+
require 'rr'
|
17
18
|
|
18
19
|
ActiveRecord::Base.establish_connection(
|
19
20
|
:adapter => 'sqlite3',
|
@@ -40,12 +41,5 @@ require 'factories'
|
|
40
41
|
class Test::Unit::TestCase
|
41
42
|
include Factory::Syntax::Methods
|
42
43
|
include ActiveSupport::Testing::Assertions
|
43
|
-
|
44
|
-
def bitrix_configure
|
45
|
-
BitrixOnRails.configure do
|
46
|
-
infoblock 3, IblockElement3
|
47
|
-
infoblock 7, IblockElement7
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
44
|
+
include RR::Adapters::TestUnit
|
51
45
|
end
|
data/test/test_active_record.rb
CHANGED
@@ -16,6 +16,10 @@ class ActiveRecordTest < Test::Unit::TestCase
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
teardown do
|
20
|
+
Object.send :remove_const, "IblockElement#{@iblock.id}"
|
21
|
+
end
|
22
|
+
|
19
23
|
should 'create associations' do
|
20
24
|
assert Post.reflections.include?("iblock_element_prop_s#{@iblock.id}".to_sym)
|
21
25
|
assert Post.reflections.include?(:iblock_element)
|
@@ -6,23 +6,4 @@ class TestBitrixOnRails < Test::Unit::TestCase
|
|
6
6
|
def tests
|
7
7
|
assert_respond_to BitrixOnRails, :configure
|
8
8
|
end
|
9
|
-
|
10
|
-
# should "автоматичеки создает модели свойств для всех инфоблоков при инициализации" do
|
11
|
-
# assert_equal 2, BitrixOnRails.init.count, '2 инфоблока в нашей схеме'
|
12
|
-
# # assert defined?(IblockElementPropM7), 'должен определиться автоматически'
|
13
|
-
# puts IblockElementPropM7
|
14
|
-
# end
|
15
|
-
|
16
|
-
# should "Брать свойства для блока и кешировать их" do
|
17
|
-
|
18
|
-
# Iblock.get_properties(3)
|
19
|
-
|
20
|
-
# # А этот запрос уже кеширован
|
21
|
-
# Iblock.get_properties(3)
|
22
|
-
# end
|
23
9
|
end
|
24
|
-
|
25
|
-
|
26
|
-
# При инициализации создаются модели для всех инфоблоков
|
27
|
-
# При использовании IblockElement можно работать со свойствами
|
28
|
-
# Пожно подключать Инфоблок через has_infoblock к модели
|
data/test/test_iblock_element.rb
CHANGED
@@ -3,14 +3,22 @@ require 'helper'
|
|
3
3
|
class IblockElementTest < Test::Unit::TestCase
|
4
4
|
|
5
5
|
context 'define_iblock_class' do
|
6
|
+
setup do
|
7
|
+
stub(iblock = Object.new).version { 2 }
|
8
|
+
stub(Iblock).find { iblock }
|
9
|
+
end
|
6
10
|
|
7
11
|
context 'with class_name set to nil' do
|
8
12
|
setup do
|
9
13
|
BitrixOnRails.define_iblock_class(3)
|
10
14
|
end
|
11
15
|
|
16
|
+
teardown do
|
17
|
+
Object.send :remove_const, "IblockElement3"
|
18
|
+
end
|
19
|
+
|
12
20
|
should 'create class IblockElement3 in global namespace' do
|
13
|
-
assert_not_nil Object.const_defined?(
|
21
|
+
assert_not_nil Object.const_defined?("IblockElement3")
|
14
22
|
end
|
15
23
|
end
|
16
24
|
|
@@ -40,6 +48,10 @@ class IblockElementTest < Test::Unit::TestCase
|
|
40
48
|
BitrixOnRails.define_iblock_class(3)
|
41
49
|
end
|
42
50
|
|
51
|
+
teardown do
|
52
|
+
Object.send :remove_const, "IblockElement3"
|
53
|
+
end
|
54
|
+
|
43
55
|
should 'create association with property classes' do
|
44
56
|
assert_not_nil IblockElement3.reflections[:property_set]
|
45
57
|
assert_not_nil IblockElement3.reflections[:m_props]
|
@@ -66,6 +78,10 @@ class IblockElementTest < Test::Unit::TestCase
|
|
66
78
|
BitrixOnRails.define_iblock_class(3, :extended_by => 'IblockElementExtension')
|
67
79
|
end
|
68
80
|
|
81
|
+
teardown do
|
82
|
+
Object.send :remove_const, "IblockElement3"
|
83
|
+
end
|
84
|
+
|
69
85
|
should 'extend created class with given module' do
|
70
86
|
# Не нашел другого способа проверить, что модуль был включен в класс
|
71
87
|
assert IblockElement3.methods.include?(:some_method)
|
@@ -74,4 +90,20 @@ class IblockElementTest < Test::Unit::TestCase
|
|
74
90
|
|
75
91
|
end
|
76
92
|
|
93
|
+
context 'described by iblock with version == 1' do
|
94
|
+
setup do
|
95
|
+
@iblock = Factory.create(:iblock_v1)
|
96
|
+
@iblock_element_class = BitrixOnRails.define_iblock_class(@iblock.id)
|
97
|
+
end
|
98
|
+
|
99
|
+
should 'set multiple association for prop_values' do
|
100
|
+
assert_not_nil @iblock_element_class.reflections[:prop_values]
|
101
|
+
end
|
102
|
+
|
103
|
+
should 'define access methods for iblock properties' do
|
104
|
+
assert @iblock_element_class.instance_methods.include?(:synonym)
|
105
|
+
assert @iblock_element_class.instance_methods.include?(:synonym=)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
77
109
|
end
|
@@ -9,19 +9,19 @@ class IblockElementPropSTest < Test::Unit::TestCase
|
|
9
9
|
]
|
10
10
|
|
11
11
|
def create_iblock(iblock_factory, iblock_element_factory, prop_s_values = [], prop_m_values = [])
|
12
|
-
iblock = Factory.create(iblock_factory)
|
12
|
+
@iblock = Factory.create(iblock_factory)
|
13
13
|
|
14
|
-
BitrixOnRails.define_iblock_class(iblock.id)
|
14
|
+
BitrixOnRails.define_iblock_class(@iblock.id)
|
15
15
|
|
16
|
-
@s_prop_class = Object.const_get("IblockElementPropS#{iblock.id}")
|
17
|
-
@m_prop_class = Object.const_get("IblockElementPropM#{iblock.id}")
|
16
|
+
@s_prop_class = Object.const_get("IblockElementPropS#{@iblock.id}")
|
17
|
+
@m_prop_class = Object.const_get("IblockElementPropM#{@iblock.id}")
|
18
18
|
|
19
19
|
properties = @s_prop_class.columns.collect { |c| c.name }
|
20
20
|
|
21
|
-
@iblock_element = Factory.create(iblock_element_factory, :iblock => iblock)
|
21
|
+
@iblock_element = Factory.create(iblock_element_factory, :iblock => @iblock)
|
22
22
|
|
23
23
|
prop_m_values.each { |v|
|
24
|
-
@m_prop_class.create(:iblock_element_id => @iblock_element.id, :iblock_property_id => iblock.iblock_properties.last.id, :value => v)
|
24
|
+
@m_prop_class.create(:iblock_element_id => @iblock_element.id, :iblock_property_id => @iblock.iblock_properties.last.id, :value => v)
|
25
25
|
}
|
26
26
|
|
27
27
|
prop_s_values = [@iblock_element.id] + prop_s_values
|
@@ -37,6 +37,10 @@ class IblockElementPropSTest < Test::Unit::TestCase
|
|
37
37
|
@s_prop_class = Object.const_get("IblockElementPropS#{@iblock.id}")
|
38
38
|
end
|
39
39
|
|
40
|
+
teardown do
|
41
|
+
Object.send :remove_const, "IblockElement#{@iblock.id}"
|
42
|
+
end
|
43
|
+
|
40
44
|
should 'set table name to b_iblock_element_prop_s#{id}' do
|
41
45
|
assert_equal "b_iblock_element_prop_s#{@iblock.id}", @s_prop_class.table_name
|
42
46
|
end
|
@@ -62,6 +66,10 @@ class IblockElementPropSTest < Test::Unit::TestCase
|
|
62
66
|
create_iblock :iblock3, :iblock_element3, PROP_S_VALUES, [144, 1394860, 35, 6, 165]
|
63
67
|
end
|
64
68
|
|
69
|
+
teardown do
|
70
|
+
Object.send :remove_const, "IblockElement#{@iblock.id}"
|
71
|
+
end
|
72
|
+
|
65
73
|
should 'return unserialized values' do
|
66
74
|
assert_equal 11286, @iblock_element_prop_s.post_id
|
67
75
|
assert_equal 'Полемика по повышению.', @iblock_element_prop_s.preview_mpage
|
@@ -77,6 +85,10 @@ class IblockElementPropSTest < Test::Unit::TestCase
|
|
77
85
|
create_iblock :iblock3, :iblock_element3, PROP_S_VALUES, [10]
|
78
86
|
end
|
79
87
|
|
88
|
+
teardown do
|
89
|
+
Object.send :remove_const, "IblockElement#{@iblock.id}"
|
90
|
+
end
|
91
|
+
|
80
92
|
should 'add new record to b_iblock_element_prop_m on add' do
|
81
93
|
assert_difference("#{@iblock_element_prop_s.m_prop_class}.count") do
|
82
94
|
@iblock_element_prop_s.glob_class.add(16)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'helper'
|
4
|
+
|
5
|
+
class TestPHPSerializeEncoded < Test::Unit::TestCase
|
6
|
+
def tests
|
7
|
+
assert_respond_to PHP, :serialize_encoded
|
8
|
+
assert_respond_to PHP, :unserialize_encoded
|
9
|
+
|
10
|
+
s = "a:2:{s:4:\"TEXT\";s:294:\"В четверг, 25 августа, торги в России начались хорошим ростом, но после обеда рынок начал терять отвоеванные позиции. В итоге почти 1,5% роста индекса ММВБ на 17:00 сменились 0,2% падения. При этом некоторую довольно слабую поддержку нашему рынку оказывают немного подрастающие котировки нефти.\";s:4:\"TYPE\";s:4:\"html\";}"
|
11
|
+
val = PHP.unserialize_encoded(s)
|
12
|
+
|
13
|
+
assert_equal val['TEXT'], "В четверг, 25 августа, торги в России начались хорошим ростом, но после обеда рынок начал терять отвоеванные позиции. В итоге почти 1,5% роста индекса ММВБ на 17:00 сменились 0,2% падения. При этом некоторую довольно слабую поддержку нашему рынку оказывают немного подрастающие котировки нефти."
|
14
|
+
|
15
|
+
val = PHP.serialize_encoded(['тест'])
|
16
|
+
assert_equal val, 'a:1:{i:0;s:4:"тест";}'
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitrix_on_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-30 00:00:00.000000000 +04:00
|
13
|
+
default_executable:
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: rails
|
16
|
-
requirement: &
|
17
|
+
requirement: &2153466700 !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ! '>='
|
@@ -21,10 +22,10 @@ dependencies:
|
|
21
22
|
version: '3.0'
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
+
version_requirements: *2153466700
|
25
26
|
- !ruby/object:Gem::Dependency
|
26
27
|
name: php_serialize
|
27
|
-
requirement: &
|
28
|
+
requirement: &2153465440 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
30
|
requirements:
|
30
31
|
- - ! '>='
|
@@ -32,10 +33,10 @@ dependencies:
|
|
32
33
|
version: '0'
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
+
version_requirements: *2153465440
|
36
37
|
- !ruby/object:Gem::Dependency
|
37
38
|
name: sqlite3
|
38
|
-
requirement: &
|
39
|
+
requirement: &2153463940 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
41
42
|
- - ! '>='
|
@@ -43,10 +44,10 @@ dependencies:
|
|
43
44
|
version: '0'
|
44
45
|
type: :development
|
45
46
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
+
version_requirements: *2153463940
|
47
48
|
- !ruby/object:Gem::Dependency
|
48
49
|
name: shoulda
|
49
|
-
requirement: &
|
50
|
+
requirement: &2153458140 !ruby/object:Gem::Requirement
|
50
51
|
none: false
|
51
52
|
requirements:
|
52
53
|
- - ! '>='
|
@@ -54,10 +55,10 @@ dependencies:
|
|
54
55
|
version: '0'
|
55
56
|
type: :development
|
56
57
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
+
version_requirements: *2153458140
|
58
59
|
- !ruby/object:Gem::Dependency
|
59
60
|
name: bundler
|
60
|
-
requirement: &
|
61
|
+
requirement: &2153456080 !ruby/object:Gem::Requirement
|
61
62
|
none: false
|
62
63
|
requirements:
|
63
64
|
- - ~>
|
@@ -65,10 +66,10 @@ dependencies:
|
|
65
66
|
version: 1.0.0
|
66
67
|
type: :development
|
67
68
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
+
version_requirements: *2153456080
|
69
70
|
- !ruby/object:Gem::Dependency
|
70
71
|
name: jeweler
|
71
|
-
requirement: &
|
72
|
+
requirement: &2153452480 !ruby/object:Gem::Requirement
|
72
73
|
none: false
|
73
74
|
requirements:
|
74
75
|
- - ~>
|
@@ -76,10 +77,10 @@ dependencies:
|
|
76
77
|
version: 1.6.4
|
77
78
|
type: :development
|
78
79
|
prerelease: false
|
79
|
-
version_requirements: *
|
80
|
+
version_requirements: *2153452480
|
80
81
|
- !ruby/object:Gem::Dependency
|
81
82
|
name: rcov
|
82
|
-
requirement: &
|
83
|
+
requirement: &2153450440 !ruby/object:Gem::Requirement
|
83
84
|
none: false
|
84
85
|
requirements:
|
85
86
|
- - ! '>='
|
@@ -87,10 +88,10 @@ dependencies:
|
|
87
88
|
version: '0'
|
88
89
|
type: :development
|
89
90
|
prerelease: false
|
90
|
-
version_requirements: *
|
91
|
+
version_requirements: *2153450440
|
91
92
|
- !ruby/object:Gem::Dependency
|
92
93
|
name: ruby-debug19
|
93
|
-
requirement: &
|
94
|
+
requirement: &2153449020 !ruby/object:Gem::Requirement
|
94
95
|
none: false
|
95
96
|
requirements:
|
96
97
|
- - ! '>='
|
@@ -98,10 +99,10 @@ dependencies:
|
|
98
99
|
version: '0'
|
99
100
|
type: :development
|
100
101
|
prerelease: false
|
101
|
-
version_requirements: *
|
102
|
+
version_requirements: *2153449020
|
102
103
|
- !ruby/object:Gem::Dependency
|
103
104
|
name: factory_girl
|
104
|
-
requirement: &
|
105
|
+
requirement: &2153448060 !ruby/object:Gem::Requirement
|
105
106
|
none: false
|
106
107
|
requirements:
|
107
108
|
- - ! '>='
|
@@ -109,10 +110,10 @@ dependencies:
|
|
109
110
|
version: '0'
|
110
111
|
type: :development
|
111
112
|
prerelease: false
|
112
|
-
version_requirements: *
|
113
|
+
version_requirements: *2153448060
|
113
114
|
- !ruby/object:Gem::Dependency
|
114
115
|
name: test-unit
|
115
|
-
requirement: &
|
116
|
+
requirement: &2153446980 !ruby/object:Gem::Requirement
|
116
117
|
none: false
|
117
118
|
requirements:
|
118
119
|
- - ! '>='
|
@@ -120,10 +121,32 @@ dependencies:
|
|
120
121
|
version: '0'
|
121
122
|
type: :development
|
122
123
|
prerelease: false
|
123
|
-
version_requirements: *
|
124
|
+
version_requirements: *2153446980
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rb-fsevent
|
127
|
+
requirement: &2153445780 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: *2153445780
|
136
|
+
- !ruby/object:Gem::Dependency
|
137
|
+
name: growl
|
138
|
+
requirement: &2153444480 !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
type: :development
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: *2153444480
|
124
147
|
- !ruby/object:Gem::Dependency
|
125
148
|
name: guard-test
|
126
|
-
requirement: &
|
149
|
+
requirement: &2153443040 !ruby/object:Gem::Requirement
|
127
150
|
none: false
|
128
151
|
requirements:
|
129
152
|
- - ! '>='
|
@@ -131,10 +154,10 @@ dependencies:
|
|
131
154
|
version: '0'
|
132
155
|
type: :development
|
133
156
|
prerelease: false
|
134
|
-
version_requirements: *
|
157
|
+
version_requirements: *2153443040
|
135
158
|
- !ruby/object:Gem::Dependency
|
136
|
-
name:
|
137
|
-
requirement: &
|
159
|
+
name: rr
|
160
|
+
requirement: &2153441700 !ruby/object:Gem::Requirement
|
138
161
|
none: false
|
139
162
|
requirements:
|
140
163
|
- - ! '>='
|
@@ -142,7 +165,7 @@ dependencies:
|
|
142
165
|
version: '0'
|
143
166
|
type: :development
|
144
167
|
prerelease: false
|
145
|
-
version_requirements: *
|
168
|
+
version_requirements: *2153441700
|
146
169
|
description: Использование инфоблоков 1С-Битрикс в Ruby On Rails проектах
|
147
170
|
email: danil@orionet.ru
|
148
171
|
executables: []
|
@@ -171,7 +194,6 @@ files:
|
|
171
194
|
- app/models/iblock_type.rb
|
172
195
|
- bitrix_on_rails.gemspec
|
173
196
|
- init.rb
|
174
|
-
- lib/active_record/connection_adapters/mysql2_downcase_adapter.rb
|
175
197
|
- lib/bitrix_on_rails.rb
|
176
198
|
- lib/bitrix_on_rails/active_record.rb
|
177
199
|
- lib/bitrix_on_rails/configuration.rb
|
@@ -179,6 +201,7 @@ files:
|
|
179
201
|
- lib/bitrix_on_rails/iblock_element.rb
|
180
202
|
- lib/bitrix_on_rails/iblock_element_prop_m.rb
|
181
203
|
- lib/bitrix_on_rails/iblock_element_prop_s.rb
|
204
|
+
- lib/php_serialize_encoded.rb
|
182
205
|
- test/dump.sql
|
183
206
|
- test/factories.rb
|
184
207
|
- test/get_dump.sh
|
@@ -188,6 +211,8 @@ files:
|
|
188
211
|
- test/test_bitrix_on_rails.rb
|
189
212
|
- test/test_iblock_element.rb
|
190
213
|
- test/test_iblock_element_prop_s.rb
|
214
|
+
- test/test_php_serialize_encoded.rb
|
215
|
+
has_rdoc: true
|
191
216
|
homepage: http://github.com/dapi/bitrix_on_rails
|
192
217
|
licenses:
|
193
218
|
- MIT
|
@@ -203,7 +228,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
203
228
|
version: '0'
|
204
229
|
segments:
|
205
230
|
- 0
|
206
|
-
hash:
|
231
|
+
hash: -2381565352969100600
|
207
232
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
208
233
|
none: false
|
209
234
|
requirements:
|
@@ -212,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
237
|
version: '0'
|
213
238
|
requirements: []
|
214
239
|
rubyforge_project:
|
215
|
-
rubygems_version: 1.
|
240
|
+
rubygems_version: 1.6.2
|
216
241
|
signing_key:
|
217
242
|
specification_version: 3
|
218
243
|
summary: Работа с инфоблоками 1С-Битрикс
|
@@ -1,76 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
# Just use 'mysql2_downcase' adapter in database.yml
|
3
|
-
#
|
4
|
-
|
5
|
-
require 'active_record/connection_adapters/mysql2_adapter'
|
6
|
-
|
7
|
-
module ActiveRecord
|
8
|
-
class Base
|
9
|
-
# Establishes a connection to the database that's used by all Active Record objects.
|
10
|
-
def self.mysql2_downcase_connection(config)
|
11
|
-
config[:username] = 'root' if config[:username].nil?
|
12
|
-
|
13
|
-
if Mysql2::Client.const_defined? :FOUND_ROWS
|
14
|
-
config[:flags] = Mysql2::Client::FOUND_ROWS
|
15
|
-
end
|
16
|
-
|
17
|
-
client = Mysql2::Client.new(config.symbolize_keys)
|
18
|
-
options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
|
19
|
-
ConnectionAdapters::Mysql2DowncaseAdapter.new(client, logger, options, config)
|
20
|
-
# ActiveRecord::Base.mysql2_connection(config)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class Result
|
25
|
-
|
26
|
-
# Это выполняется через ActiveRecord::Result.new в mysql2_adapter
|
27
|
-
# при выполнении запроса
|
28
|
-
def initialize(columns, rows)
|
29
|
-
@columns = columns.map { |c| c.downcase }
|
30
|
-
@rows = rows
|
31
|
-
@hash_rows = nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
module ConnectionAdapters
|
36
|
-
class Column
|
37
|
-
|
38
|
-
alias_method :old_initialize, :initialize
|
39
|
-
|
40
|
-
# Это выполняется при выборке списка аттрибутов на уровне класса
|
41
|
-
#
|
42
|
-
def initialize(name, default, sql_type = nil, null = true)
|
43
|
-
old_initialize name.downcase, default, sql_type, null
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
class Mysql2DowncaseAdapter < Mysql2Adapter
|
49
|
-
|
50
|
-
ADAPTER_NAME = 'Mysql2Downcase'
|
51
|
-
|
52
|
-
# Надо бы глобально сделать тут:
|
53
|
-
# def execute(sql, name = nil)
|
54
|
-
# debugger
|
55
|
-
# end
|
56
|
-
|
57
|
-
# Это чтобы нормально определся primary_key
|
58
|
-
def pk_and_sequence_for(table)
|
59
|
-
keys = []
|
60
|
-
result = execute("DESCRIBE #{quote_table_name(table)}", 'SCHEMA')
|
61
|
-
result.each(:symbolize_keys => true, :as => :hash) do |row|
|
62
|
-
keys << row[:Field].downcase if row[:Key] == "PRI"
|
63
|
-
end
|
64
|
-
keys.length == 1 ? [keys.first, nil] : nil
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
|
72
|
-
# Возможно понадобится исправить этот метод
|
73
|
-
# quote_column_name
|
74
|
-
|
75
|
-
# Хороший пример адаптера - http://virtuoso.rubyforge.org/activerecord-mysql2spatial-adapter/
|
76
|
-
# https://github.com/dazuma/activerecord-mysql2spatial-adapter
|