ar_serialized_array 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +5 -68
- data/Readme.md +50 -0
- data/VERSION +1 -1
- data/ar_serialized_array.gemspec +47 -0
- data/init.rb +1 -0
- data/lib/ar_serialized_array.rb +37 -0
- data/spec/ar_serialized_array_spec.rb +84 -0
- data/spec/setup_test_model.rb +28 -0
- data/spec/spec_helper.rb +4 -2
- metadata +39 -183
- data/.gitignore +0 -3
- data/CHANGELOG +0 -2
- data/README.markdown +0 -57
- data/cache/file_data_provider/countries-AF.txt +0 -246
- data/cache/file_data_provider/countries-AM.txt +0 -246
- data/cache/file_data_provider/countries-AR.txt +0 -246
- data/cache/file_data_provider/countries-AZ.txt +0 -246
- data/cache/file_data_provider/countries-BE.txt +0 -246
- data/cache/file_data_provider/countries-BG.txt +0 -246
- data/cache/file_data_provider/countries-BN.txt +0 -246
- data/cache/file_data_provider/countries-BR.txt +0 -246
- data/cache/file_data_provider/countries-BS.txt +0 -246
- data/cache/file_data_provider/countries-CA.txt +0 -246
- data/cache/file_data_provider/countries-CS.txt +0 -246
- data/cache/file_data_provider/countries-CY.txt +0 -246
- data/cache/file_data_provider/countries-DA.txt +0 -246
- data/cache/file_data_provider/countries-DE.txt +0 -246
- data/cache/file_data_provider/countries-DZ.txt +0 -246
- data/cache/file_data_provider/countries-EL.txt +0 -246
- data/cache/file_data_provider/countries-EN.txt +0 -246
- data/cache/file_data_provider/countries-EO.txt +0 -246
- data/cache/file_data_provider/countries-ES.txt +0 -246
- data/cache/file_data_provider/countries-ET.txt +0 -246
- data/cache/file_data_provider/countries-EU.txt +0 -246
- data/cache/file_data_provider/countries-FA.txt +0 -246
- data/cache/file_data_provider/countries-FI.txt +0 -246
- data/cache/file_data_provider/countries-FO.txt +0 -246
- data/cache/file_data_provider/countries-FR.txt +0 -246
- data/cache/file_data_provider/countries-GA.txt +0 -246
- data/cache/file_data_provider/countries-GL.txt +0 -246
- data/cache/file_data_provider/countries-GU.txt +0 -246
- data/cache/file_data_provider/countries-HE.txt +0 -246
- data/cache/file_data_provider/countries-HI.txt +0 -246
- data/cache/file_data_provider/countries-HR.txt +0 -246
- data/cache/file_data_provider/countries-HU.txt +0 -246
- data/cache/file_data_provider/countries-HY.txt +0 -246
- data/cache/file_data_provider/countries-ID.txt +0 -246
- data/cache/file_data_provider/countries-IS.txt +0 -246
- data/cache/file_data_provider/countries-IT.txt +0 -246
- data/cache/file_data_provider/countries-JA.txt +0 -246
- data/cache/file_data_provider/countries-KA.txt +0 -246
- data/cache/file_data_provider/countries-KK.txt +0 -246
- data/cache/file_data_provider/countries-KM.txt +0 -246
- data/cache/file_data_provider/countries-KN.txt +0 -246
- data/cache/file_data_provider/countries-KO.txt +0 -246
- data/cache/file_data_provider/countries-KU.txt +0 -246
- data/cache/file_data_provider/countries-LT.txt +0 -246
- data/cache/file_data_provider/countries-LV.txt +0 -246
- data/cache/file_data_provider/countries-MI.txt +0 -246
- data/cache/file_data_provider/countries-MK.txt +0 -246
- data/cache/file_data_provider/countries-ML.txt +0 -246
- data/cache/file_data_provider/countries-MN.txt +0 -246
- data/cache/file_data_provider/countries-MR.txt +0 -246
- data/cache/file_data_provider/countries-MS.txt +0 -246
- data/cache/file_data_provider/countries-MT.txt +0 -246
- data/cache/file_data_provider/countries-NB.txt +0 -246
- data/cache/file_data_provider/countries-NE.txt +0 -246
- data/cache/file_data_provider/countries-NL.txt +0 -246
- data/cache/file_data_provider/countries-NN.txt +0 -246
- data/cache/file_data_provider/countries-OC.txt +0 -246
- data/cache/file_data_provider/countries-PA.txt +0 -246
- data/cache/file_data_provider/countries-PL.txt +0 -246
- data/cache/file_data_provider/countries-PS.txt +0 -246
- data/cache/file_data_provider/countries-PT.txt +0 -246
- data/cache/file_data_provider/countries-RO.txt +0 -246
- data/cache/file_data_provider/countries-RU.txt +0 -246
- data/cache/file_data_provider/countries-RW.txt +0 -246
- data/cache/file_data_provider/countries-SK.txt +0 -246
- data/cache/file_data_provider/countries-SL.txt +0 -246
- data/cache/file_data_provider/countries-SO.txt +0 -246
- data/cache/file_data_provider/countries-SQ.txt +0 -246
- data/cache/file_data_provider/countries-SR.txt +0 -246
- data/cache/file_data_provider/countries-SV.txt +0 -246
- data/cache/file_data_provider/countries-SW.txt +0 -246
- data/cache/file_data_provider/countries-TA.txt +0 -246
- data/cache/file_data_provider/countries-TH.txt +0 -246
- data/cache/file_data_provider/countries-TI.txt +0 -246
- data/cache/file_data_provider/countries-TK.txt +0 -246
- data/cache/file_data_provider/countries-TL.txt +0 -246
- data/cache/file_data_provider/countries-TR.txt +0 -246
- data/cache/file_data_provider/countries-TT.txt +0 -246
- data/cache/file_data_provider/countries-UK.txt +0 -246
- data/cache/file_data_provider/countries-VE.txt +0 -246
- data/cache/file_data_provider/countries-VI.txt +0 -246
- data/cache/file_data_provider/countries-WA.txt +0 -246
- data/cache/file_data_provider/countries-WO.txt +0 -246
- data/cache/file_data_provider/countries-XH.txt +0 -246
- data/cache/file_data_provider/countries-ZU.txt +0 -246
- data/cache/file_data_provider/languages-AF.txt +0 -185
- data/cache/file_data_provider/languages-AM.txt +0 -185
- data/cache/file_data_provider/languages-AR.txt +0 -185
- data/cache/file_data_provider/languages-AZ.txt +0 -185
- data/cache/file_data_provider/languages-BE.txt +0 -185
- data/cache/file_data_provider/languages-BG.txt +0 -185
- data/cache/file_data_provider/languages-BR.txt +0 -185
- data/cache/file_data_provider/languages-BS.txt +0 -185
- data/cache/file_data_provider/languages-CA.txt +0 -185
- data/cache/file_data_provider/languages-CS.txt +0 -185
- data/cache/file_data_provider/languages-CY.txt +0 -185
- data/cache/file_data_provider/languages-DA.txt +0 -185
- data/cache/file_data_provider/languages-DE.txt +0 -185
- data/cache/file_data_provider/languages-EL.txt +0 -185
- data/cache/file_data_provider/languages-EN.txt +0 -185
- data/cache/file_data_provider/languages-EO.txt +0 -185
- data/cache/file_data_provider/languages-ES.txt +0 -185
- data/cache/file_data_provider/languages-ET.txt +0 -185
- data/cache/file_data_provider/languages-EU.txt +0 -185
- data/cache/file_data_provider/languages-FA.txt +0 -185
- data/cache/file_data_provider/languages-FI.txt +0 -185
- data/cache/file_data_provider/languages-FR.txt +0 -185
- data/cache/file_data_provider/languages-GA.txt +0 -185
- data/cache/file_data_provider/languages-GL.txt +0 -185
- data/cache/file_data_provider/languages-HE.txt +0 -185
- data/cache/file_data_provider/languages-HI.txt +0 -185
- data/cache/file_data_provider/languages-HR.txt +0 -185
- data/cache/file_data_provider/languages-HU.txt +0 -185
- data/cache/file_data_provider/languages-ID.txt +0 -185
- data/cache/file_data_provider/languages-IS.txt +0 -185
- data/cache/file_data_provider/languages-IT.txt +0 -185
- data/cache/file_data_provider/languages-JA.txt +0 -185
- data/cache/file_data_provider/languages-KO.txt +0 -185
- data/cache/file_data_provider/languages-LT.txt +0 -185
- data/cache/file_data_provider/languages-LV.txt +0 -185
- data/cache/file_data_provider/languages-MI.txt +0 -185
- data/cache/file_data_provider/languages-MK.txt +0 -185
- data/cache/file_data_provider/languages-MN.txt +0 -185
- data/cache/file_data_provider/languages-MR.txt +0 -185
- data/cache/file_data_provider/languages-MS.txt +0 -185
- data/cache/file_data_provider/languages-MT.txt +0 -185
- data/cache/file_data_provider/languages-NB.txt +0 -185
- data/cache/file_data_provider/languages-NL.txt +0 -185
- data/cache/file_data_provider/languages-NN.txt +0 -185
- data/cache/file_data_provider/languages-OC.txt +0 -185
- data/cache/file_data_provider/languages-PL.txt +0 -185
- data/cache/file_data_provider/languages-PS.txt +0 -185
- data/cache/file_data_provider/languages-PT.txt +0 -185
- data/cache/file_data_provider/languages-RO.txt +0 -185
- data/cache/file_data_provider/languages-RU.txt +0 -185
- data/cache/file_data_provider/languages-RW.txt +0 -185
- data/cache/file_data_provider/languages-SK.txt +0 -185
- data/cache/file_data_provider/languages-SL.txt +0 -185
- data/cache/file_data_provider/languages-SR.txt +0 -185
- data/cache/file_data_provider/languages-SV.txt +0 -185
- data/cache/file_data_provider/languages-TA.txt +0 -185
- data/cache/file_data_provider/languages-TH.txt +0 -185
- data/cache/file_data_provider/languages-TI.txt +0 -185
- data/cache/file_data_provider/languages-TR.txt +0 -185
- data/cache/file_data_provider/languages-TT.txt +0 -185
- data/cache/file_data_provider/languages-UK.txt +0 -185
- data/cache/file_data_provider/languages-VE.txt +0 -185
- data/cache/file_data_provider/languages-VI.txt +0 -185
- data/cache/file_data_provider/languages-WA.txt +0 -185
- data/cache/file_data_provider/languages-XH.txt +0 -185
- data/cache/file_data_provider/languages-ZU.txt +0 -185
- data/example_output/all_names_for_DE.txt +0 -85
- data/example_output/all_names_for_FR.txt +0 -85
- data/example_output/all_names_for_GB.txt +0 -85
- data/example_output/all_names_for_US.txt +0 -85
- data/i18n_data.gemspec +0 -31
- data/lib/i18n_data.rb +0 -34
- data/lib/i18n_data/file_data_provider.rb +0 -56
- data/lib/i18n_data/live_data_provider.rb +0 -97
- data/spec/i18n_data/file_data_provider_spec.rb +0 -23
- data/spec/i18n_data/live_data_provider_spec.rb +0 -44
- data/spec/i18n_data_spec.rb +0 -101
data/Rakefile
CHANGED
@@ -1,80 +1,17 @@
|
|
1
|
-
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
desc "Run all specs in spec directory"
|
6
|
-
task :default do |t|
|
7
|
-
options = "--colour --format progress --loadby --reverse"
|
8
|
-
files = FileList['spec/**/*_spec.rb']
|
9
|
-
system("spec #{options} #{files}")
|
10
|
-
end
|
11
|
-
|
12
|
-
desc "write all languages to output"
|
13
|
-
task :all_languages do
|
14
|
-
I18nData.languages.keys.each do |lc|
|
15
|
-
`rake languages LANGUAGE=#{lc}`
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
desc "write languages to output/languages_{language}"
|
20
|
-
task :languages do
|
21
|
-
raise unless language = ENV['LANGUAGE']
|
22
|
-
`mkdir output -p`
|
23
|
-
data = I18nData.languages(language.upcase)
|
24
|
-
File.open("output/languages_#{language.downcase}.yml",'w') {|f|f.puts data.to_yaml}
|
25
|
-
end
|
26
|
-
|
27
|
-
desc "write all countries to output"
|
28
|
-
task :all_countries do
|
29
|
-
I18nData.languages.keys.each do |lc|
|
30
|
-
`rake countries LANGUAGE=#{lc}`
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
desc "write countries to output/countries_{language}"
|
35
|
-
task :countries do
|
36
|
-
raise unless language = ENV['LANGUAGE']
|
37
|
-
`mkdir output -p`
|
38
|
-
data = I18nData.countries(language.upcase)
|
39
|
-
File.open("output/countries_#{language.downcase}.yml",'w') {|f|f.puts data.to_yaml}
|
40
|
-
end
|
41
|
-
|
42
|
-
desc "write example output, just to show off :D"
|
43
|
-
task :example_output do
|
44
|
-
`mkdir example_output -p`
|
45
|
-
|
46
|
-
#all names for germany, france, united kingdom and unites states
|
47
|
-
['DE','FR','GB','US'].each do |cc|
|
48
|
-
names = I18nData.languages.keys.map do |lc|
|
49
|
-
begin
|
50
|
-
[I18nData.countries(lc)[cc], I18nData.languages[lc]]
|
51
|
-
rescue I18nData::NoOnlineTranslationAvaiable
|
52
|
-
nil
|
53
|
-
end
|
54
|
-
end
|
55
|
-
File.open("example_output/all_names_for_#{cc}.txt",'w') {|f|
|
56
|
-
f.puts names.reject(&:nil?).map{|x|x*" ---- "} * "\n"
|
57
|
-
}
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
desc "write cache for I18nData::FileDataProvider"
|
62
|
-
task :write_cache_for_file_data_provider do
|
63
|
-
require 'i18n_data/file_data_provider'
|
64
|
-
require 'i18n_data/live_data_provider'
|
65
|
-
I18nData::FileDataProvider.write_cache(I18nData::LiveDataProvider)
|
66
|
-
end
|
1
|
+
task :default => :spec
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
Spec::Rake::SpecTask.new {|t| t.spec_opts = ['--color']}
|
67
4
|
|
68
5
|
begin
|
69
6
|
require 'jeweler'
|
70
7
|
project_name = 'ar_serialized_array'
|
71
8
|
Jeweler::Tasks.new do |gem|
|
72
9
|
gem.name = project_name
|
73
|
-
gem.summary = "
|
10
|
+
gem.summary = "Serialize an array in a column, [] when no set, xx_as_text accessors and more."
|
74
11
|
gem.email = "grosser.michael@gmail.com"
|
75
12
|
gem.homepage = "http://github.com/grosser/#{project_name}"
|
76
13
|
gem.authors = ["Michael Grosser"]
|
77
|
-
gem.add_dependency ['
|
14
|
+
gem.add_dependency ['activerecord']
|
78
15
|
end
|
79
16
|
|
80
17
|
Jeweler::GemcutterTasks.new
|
data/Readme.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
Serialize an array in one column.
|
2
|
+
|
3
|
+
- [] when not set
|
4
|
+
- `xxx_as_text` / `xxx_as_text=` accessors to edit in forms
|
5
|
+
- `:on_set` callback for cleanup
|
6
|
+
- stores NULL when given array was empty (all empty -> `IS NULL`)
|
7
|
+
|
8
|
+
Install
|
9
|
+
=======
|
10
|
+
- As Rails plugin: `rails plugin install git://github.com/grosser/ar_serialized_array.git `
|
11
|
+
- As gem: ` sudo gem install ar_serialized_array `
|
12
|
+
|
13
|
+
|
14
|
+
Usage
|
15
|
+
=====
|
16
|
+
|
17
|
+
# basic / forms
|
18
|
+
class User < ActiveRecord::Base
|
19
|
+
serialized_array :product_ids, :accessor => :product_ids_as_text
|
20
|
+
end
|
21
|
+
|
22
|
+
<%= form_for @user do |f| %>
|
23
|
+
<%= f.text_field :product_ids_as_text %>
|
24
|
+
<% end %>
|
25
|
+
|
26
|
+
# set / get
|
27
|
+
User.new.product_ids # []
|
28
|
+
|
29
|
+
user.product_ids_as_text = "1, , 12323 , 23, 1"
|
30
|
+
user.product_ids # [1, 12323, 23]
|
31
|
+
user.product_ids_as_text # "1, 12323, 23"
|
32
|
+
|
33
|
+
# find ...
|
34
|
+
filled = User.all(:conditions => {:product_ids=>[1,3].to_yaml})
|
35
|
+
empty = User.all(:conditions => {:product_ids=>nil})
|
36
|
+
|
37
|
+
# with cleanup (unique integers)
|
38
|
+
class User < ActiveRecord::Base
|
39
|
+
serialized_array :product_ids, :on_set=>lambda{|x| x.map(&:to_i).uniq }
|
40
|
+
end
|
41
|
+
|
42
|
+
TODO
|
43
|
+
====
|
44
|
+
- add support for `user.product_ids << 1`
|
45
|
+
|
46
|
+
Author
|
47
|
+
======
|
48
|
+
[Michael Grosser](http://grosser.it)
|
49
|
+
michael@grosser.it
|
50
|
+
Hereby placed under public domain, do what you want, just do not hold me accountable...
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ar_serialized_array}
|
8
|
+
s.version = "0.3.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Michael Grosser"]
|
12
|
+
s.date = %q{2011-01-17}
|
13
|
+
s.email = %q{grosser.michael@gmail.com}
|
14
|
+
s.files = [
|
15
|
+
"Rakefile",
|
16
|
+
"Readme.md",
|
17
|
+
"VERSION",
|
18
|
+
"ar_serialized_array.gemspec",
|
19
|
+
"init.rb",
|
20
|
+
"lib/ar_serialized_array.rb",
|
21
|
+
"spec/ar_serialized_array_spec.rb",
|
22
|
+
"spec/setup_test_model.rb",
|
23
|
+
"spec/spec_helper.rb"
|
24
|
+
]
|
25
|
+
s.homepage = %q{http://github.com/grosser/ar_serialized_array}
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
s.rubygems_version = %q{1.4.2}
|
28
|
+
s.summary = %q{Serialize an array in a column, [] when no set, xx_as_text accessors and more.}
|
29
|
+
s.test_files = [
|
30
|
+
"spec/ar_serialized_array_spec.rb",
|
31
|
+
"spec/setup_test_model.rb",
|
32
|
+
"spec/spec_helper.rb"
|
33
|
+
]
|
34
|
+
|
35
|
+
if s.respond_to? :specification_version then
|
36
|
+
s.specification_version = 3
|
37
|
+
|
38
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
39
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
40
|
+
else
|
41
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
42
|
+
end
|
43
|
+
else
|
44
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'ar_serialized_array'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
|
3
|
+
module ARSerializedArray
|
4
|
+
VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
|
5
|
+
|
6
|
+
def serialized_array(attr_name, options={})
|
7
|
+
options[:on_set] ||= lambda{|x|x}
|
8
|
+
|
9
|
+
# getter
|
10
|
+
define_method attr_name do
|
11
|
+
YAML.load(read_attribute(attr_name).to_s) || []
|
12
|
+
end
|
13
|
+
|
14
|
+
# setter
|
15
|
+
define_method "#{attr_name}=" do |value|
|
16
|
+
value = options[:on_set].call(value) || []
|
17
|
+
raise "Expected an Array, got: #{value.inspect}" unless value.is_a? Array
|
18
|
+
value = (value.empty? ? nil : value.to_yaml)
|
19
|
+
write_attribute attr_name, value
|
20
|
+
end
|
21
|
+
|
22
|
+
# accessors e.g. xxx_as_text
|
23
|
+
if options[:accessor]
|
24
|
+
#getter
|
25
|
+
define_method options[:accessor] do
|
26
|
+
send(attr_name) * ", "
|
27
|
+
end
|
28
|
+
|
29
|
+
#setter
|
30
|
+
define_method "#{options[:accessor]}=" do |value|
|
31
|
+
send "#{attr_name}=", value.to_s.split(',').reject(&:blank?).map(&:strip)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
ActiveRecord::Base.send(:extend, ARSerializedArray)
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require "spec/spec_helper"
|
2
|
+
|
3
|
+
describe 'ar_serialized_array' do
|
4
|
+
describe 'basics' do
|
5
|
+
it "is an empty array by default" do
|
6
|
+
UserPlain.new.product_ids.should == []
|
7
|
+
end
|
8
|
+
|
9
|
+
it "serializes on set" do
|
10
|
+
user = UserPlain.create!(:product_ids => [1, 2])
|
11
|
+
UserPlain.find(user.id).product_ids.should == [1, 2]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "can save an empty array" do
|
15
|
+
user = UserPlain.create!(:product_ids => [])
|
16
|
+
UserPlain.find(user.id).product_ids.should == []
|
17
|
+
end
|
18
|
+
|
19
|
+
it "can save nil" do
|
20
|
+
user = UserPlain.create!(:product_ids => nil)
|
21
|
+
UserPlain.find(user.id).product_ids.should == []
|
22
|
+
end
|
23
|
+
|
24
|
+
it "stores nil when nil is saved" do
|
25
|
+
user = UserPlain.create!(:product_ids => nil)
|
26
|
+
UserPlain.first(:conditions => {:id => user.id, :product_ids => nil}).should == user
|
27
|
+
end
|
28
|
+
|
29
|
+
it "stores empty arrays as NULL" do
|
30
|
+
user = UserPlain.create!(:product_ids => [])
|
31
|
+
UserPlain.first(:conditions => {:id => user.id, :product_ids => nil}).should == user
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can search by array" do
|
35
|
+
user = UserPlain.create!(:product_ids => [1])
|
36
|
+
UserPlain.first(:conditions => {:id => user.id, :product_ids => [1].to_yaml}).should == user
|
37
|
+
end
|
38
|
+
|
39
|
+
it "raises when non-array is given" do
|
40
|
+
lambda{ UserPlain.create!(:product_ids => '') }.should raise_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'with accessor' do
|
45
|
+
it "can access the array as text" do
|
46
|
+
UserWithAccessor.new(:product_ids => [1,2,3]).product_ids_as_text.should == '1, 2, 3'
|
47
|
+
end
|
48
|
+
|
49
|
+
it "can set arrays via text" do
|
50
|
+
UserWithAccessor.new(:product_ids_as_text => '1, 2, 3').product_ids.should == ['1','2','3']
|
51
|
+
end
|
52
|
+
|
53
|
+
it "is symetric" do
|
54
|
+
text = '1, 2, 3'
|
55
|
+
UserWithAccessor.new(:product_ids_as_text => text).product_ids_as_text.should == text
|
56
|
+
end
|
57
|
+
|
58
|
+
it "accepts nil as empty" do
|
59
|
+
UserWithAccessor.new(:product_ids_as_text => nil).product_ids.should == []
|
60
|
+
end
|
61
|
+
|
62
|
+
it "is blank when unset" do
|
63
|
+
UserWithAccessor.new.product_ids_as_text.should == ''
|
64
|
+
end
|
65
|
+
|
66
|
+
it "is blank when empty" do
|
67
|
+
UserWithAccessor.new(:product_ids => []).product_ids_as_text.should == ''
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe 'with on_set' do
|
72
|
+
it "is used when storing normally" do
|
73
|
+
User.new(:product_ids => ['1','2','2']).product_ids.should == [1,2]
|
74
|
+
end
|
75
|
+
|
76
|
+
it "is used when storing through accessor" do
|
77
|
+
User.new(:product_ids_as_text => '1,2,2').product_ids.should == [1,2]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
it "has a VERSION" do
|
82
|
+
ARSerializedArray::VERSION.should =~ /^\d+\.\d+\.\d+$/
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# connect
|
2
|
+
ActiveRecord::Base.establish_connection(
|
3
|
+
:adapter => "sqlite3",
|
4
|
+
:database => ":memory:"
|
5
|
+
)
|
6
|
+
|
7
|
+
# create tables
|
8
|
+
ActiveRecord::Schema.define(:version => 1) do
|
9
|
+
create_table :users do |t|
|
10
|
+
t.string :product_ids
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# create models
|
15
|
+
class User < ActiveRecord::Base
|
16
|
+
serialized_array :product_ids, :accessor => :product_ids_as_text, :on_set=>lambda{|x| x.map(&:to_i).uniq}
|
17
|
+
end
|
18
|
+
|
19
|
+
class UserWithAccessor < ActiveRecord::Base
|
20
|
+
self.table_name = 'users'
|
21
|
+
serialized_array :product_ids, :accessor => :product_ids_as_text
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
class UserPlain < ActiveRecord::Base
|
26
|
+
self.table_name = 'users'
|
27
|
+
serialized_array :product_ids
|
28
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_serialized_array
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Michael Grosser
|
@@ -9,226 +15,76 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2011-01-17 00:00:00 +01:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
name: activerecord
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
23
32
|
version: "0"
|
24
|
-
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
25
35
|
description:
|
26
36
|
email: grosser.michael@gmail.com
|
27
37
|
executables: []
|
28
38
|
|
29
39
|
extensions: []
|
30
40
|
|
31
|
-
extra_rdoc_files:
|
32
|
-
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
33
43
|
files:
|
34
|
-
- .gitignore
|
35
|
-
- CHANGELOG
|
36
|
-
- README.markdown
|
37
44
|
- Rakefile
|
45
|
+
- Readme.md
|
38
46
|
- VERSION
|
39
|
-
-
|
40
|
-
-
|
41
|
-
-
|
42
|
-
-
|
43
|
-
-
|
44
|
-
- cache/file_data_provider/countries-BG.txt
|
45
|
-
- cache/file_data_provider/countries-BN.txt
|
46
|
-
- cache/file_data_provider/countries-BR.txt
|
47
|
-
- cache/file_data_provider/countries-BS.txt
|
48
|
-
- cache/file_data_provider/countries-CA.txt
|
49
|
-
- cache/file_data_provider/countries-CS.txt
|
50
|
-
- cache/file_data_provider/countries-CY.txt
|
51
|
-
- cache/file_data_provider/countries-DA.txt
|
52
|
-
- cache/file_data_provider/countries-DE.txt
|
53
|
-
- cache/file_data_provider/countries-DZ.txt
|
54
|
-
- cache/file_data_provider/countries-EL.txt
|
55
|
-
- cache/file_data_provider/countries-EN.txt
|
56
|
-
- cache/file_data_provider/countries-EO.txt
|
57
|
-
- cache/file_data_provider/countries-ES.txt
|
58
|
-
- cache/file_data_provider/countries-ET.txt
|
59
|
-
- cache/file_data_provider/countries-EU.txt
|
60
|
-
- cache/file_data_provider/countries-FA.txt
|
61
|
-
- cache/file_data_provider/countries-FI.txt
|
62
|
-
- cache/file_data_provider/countries-FO.txt
|
63
|
-
- cache/file_data_provider/countries-FR.txt
|
64
|
-
- cache/file_data_provider/countries-GA.txt
|
65
|
-
- cache/file_data_provider/countries-GL.txt
|
66
|
-
- cache/file_data_provider/countries-GU.txt
|
67
|
-
- cache/file_data_provider/countries-HE.txt
|
68
|
-
- cache/file_data_provider/countries-HI.txt
|
69
|
-
- cache/file_data_provider/countries-HR.txt
|
70
|
-
- cache/file_data_provider/countries-HU.txt
|
71
|
-
- cache/file_data_provider/countries-HY.txt
|
72
|
-
- cache/file_data_provider/countries-ID.txt
|
73
|
-
- cache/file_data_provider/countries-IS.txt
|
74
|
-
- cache/file_data_provider/countries-IT.txt
|
75
|
-
- cache/file_data_provider/countries-JA.txt
|
76
|
-
- cache/file_data_provider/countries-KA.txt
|
77
|
-
- cache/file_data_provider/countries-KK.txt
|
78
|
-
- cache/file_data_provider/countries-KM.txt
|
79
|
-
- cache/file_data_provider/countries-KN.txt
|
80
|
-
- cache/file_data_provider/countries-KO.txt
|
81
|
-
- cache/file_data_provider/countries-KU.txt
|
82
|
-
- cache/file_data_provider/countries-LT.txt
|
83
|
-
- cache/file_data_provider/countries-LV.txt
|
84
|
-
- cache/file_data_provider/countries-MI.txt
|
85
|
-
- cache/file_data_provider/countries-MK.txt
|
86
|
-
- cache/file_data_provider/countries-ML.txt
|
87
|
-
- cache/file_data_provider/countries-MN.txt
|
88
|
-
- cache/file_data_provider/countries-MR.txt
|
89
|
-
- cache/file_data_provider/countries-MS.txt
|
90
|
-
- cache/file_data_provider/countries-MT.txt
|
91
|
-
- cache/file_data_provider/countries-NB.txt
|
92
|
-
- cache/file_data_provider/countries-NE.txt
|
93
|
-
- cache/file_data_provider/countries-NL.txt
|
94
|
-
- cache/file_data_provider/countries-NN.txt
|
95
|
-
- cache/file_data_provider/countries-OC.txt
|
96
|
-
- cache/file_data_provider/countries-PA.txt
|
97
|
-
- cache/file_data_provider/countries-PL.txt
|
98
|
-
- cache/file_data_provider/countries-PS.txt
|
99
|
-
- cache/file_data_provider/countries-PT.txt
|
100
|
-
- cache/file_data_provider/countries-RO.txt
|
101
|
-
- cache/file_data_provider/countries-RU.txt
|
102
|
-
- cache/file_data_provider/countries-RW.txt
|
103
|
-
- cache/file_data_provider/countries-SK.txt
|
104
|
-
- cache/file_data_provider/countries-SL.txt
|
105
|
-
- cache/file_data_provider/countries-SO.txt
|
106
|
-
- cache/file_data_provider/countries-SQ.txt
|
107
|
-
- cache/file_data_provider/countries-SR.txt
|
108
|
-
- cache/file_data_provider/countries-SV.txt
|
109
|
-
- cache/file_data_provider/countries-SW.txt
|
110
|
-
- cache/file_data_provider/countries-TA.txt
|
111
|
-
- cache/file_data_provider/countries-TH.txt
|
112
|
-
- cache/file_data_provider/countries-TI.txt
|
113
|
-
- cache/file_data_provider/countries-TK.txt
|
114
|
-
- cache/file_data_provider/countries-TL.txt
|
115
|
-
- cache/file_data_provider/countries-TR.txt
|
116
|
-
- cache/file_data_provider/countries-TT.txt
|
117
|
-
- cache/file_data_provider/countries-UK.txt
|
118
|
-
- cache/file_data_provider/countries-VE.txt
|
119
|
-
- cache/file_data_provider/countries-VI.txt
|
120
|
-
- cache/file_data_provider/countries-WA.txt
|
121
|
-
- cache/file_data_provider/countries-WO.txt
|
122
|
-
- cache/file_data_provider/countries-XH.txt
|
123
|
-
- cache/file_data_provider/countries-ZU.txt
|
124
|
-
- cache/file_data_provider/languages-AF.txt
|
125
|
-
- cache/file_data_provider/languages-AM.txt
|
126
|
-
- cache/file_data_provider/languages-AR.txt
|
127
|
-
- cache/file_data_provider/languages-AZ.txt
|
128
|
-
- cache/file_data_provider/languages-BE.txt
|
129
|
-
- cache/file_data_provider/languages-BG.txt
|
130
|
-
- cache/file_data_provider/languages-BR.txt
|
131
|
-
- cache/file_data_provider/languages-BS.txt
|
132
|
-
- cache/file_data_provider/languages-CA.txt
|
133
|
-
- cache/file_data_provider/languages-CS.txt
|
134
|
-
- cache/file_data_provider/languages-CY.txt
|
135
|
-
- cache/file_data_provider/languages-DA.txt
|
136
|
-
- cache/file_data_provider/languages-DE.txt
|
137
|
-
- cache/file_data_provider/languages-EL.txt
|
138
|
-
- cache/file_data_provider/languages-EN.txt
|
139
|
-
- cache/file_data_provider/languages-EO.txt
|
140
|
-
- cache/file_data_provider/languages-ES.txt
|
141
|
-
- cache/file_data_provider/languages-ET.txt
|
142
|
-
- cache/file_data_provider/languages-EU.txt
|
143
|
-
- cache/file_data_provider/languages-FA.txt
|
144
|
-
- cache/file_data_provider/languages-FI.txt
|
145
|
-
- cache/file_data_provider/languages-FR.txt
|
146
|
-
- cache/file_data_provider/languages-GA.txt
|
147
|
-
- cache/file_data_provider/languages-GL.txt
|
148
|
-
- cache/file_data_provider/languages-HE.txt
|
149
|
-
- cache/file_data_provider/languages-HI.txt
|
150
|
-
- cache/file_data_provider/languages-HR.txt
|
151
|
-
- cache/file_data_provider/languages-HU.txt
|
152
|
-
- cache/file_data_provider/languages-ID.txt
|
153
|
-
- cache/file_data_provider/languages-IS.txt
|
154
|
-
- cache/file_data_provider/languages-IT.txt
|
155
|
-
- cache/file_data_provider/languages-JA.txt
|
156
|
-
- cache/file_data_provider/languages-KO.txt
|
157
|
-
- cache/file_data_provider/languages-LT.txt
|
158
|
-
- cache/file_data_provider/languages-LV.txt
|
159
|
-
- cache/file_data_provider/languages-MI.txt
|
160
|
-
- cache/file_data_provider/languages-MK.txt
|
161
|
-
- cache/file_data_provider/languages-MN.txt
|
162
|
-
- cache/file_data_provider/languages-MR.txt
|
163
|
-
- cache/file_data_provider/languages-MS.txt
|
164
|
-
- cache/file_data_provider/languages-MT.txt
|
165
|
-
- cache/file_data_provider/languages-NB.txt
|
166
|
-
- cache/file_data_provider/languages-NL.txt
|
167
|
-
- cache/file_data_provider/languages-NN.txt
|
168
|
-
- cache/file_data_provider/languages-OC.txt
|
169
|
-
- cache/file_data_provider/languages-PL.txt
|
170
|
-
- cache/file_data_provider/languages-PS.txt
|
171
|
-
- cache/file_data_provider/languages-PT.txt
|
172
|
-
- cache/file_data_provider/languages-RO.txt
|
173
|
-
- cache/file_data_provider/languages-RU.txt
|
174
|
-
- cache/file_data_provider/languages-RW.txt
|
175
|
-
- cache/file_data_provider/languages-SK.txt
|
176
|
-
- cache/file_data_provider/languages-SL.txt
|
177
|
-
- cache/file_data_provider/languages-SR.txt
|
178
|
-
- cache/file_data_provider/languages-SV.txt
|
179
|
-
- cache/file_data_provider/languages-TA.txt
|
180
|
-
- cache/file_data_provider/languages-TH.txt
|
181
|
-
- cache/file_data_provider/languages-TI.txt
|
182
|
-
- cache/file_data_provider/languages-TR.txt
|
183
|
-
- cache/file_data_provider/languages-TT.txt
|
184
|
-
- cache/file_data_provider/languages-UK.txt
|
185
|
-
- cache/file_data_provider/languages-VE.txt
|
186
|
-
- cache/file_data_provider/languages-VI.txt
|
187
|
-
- cache/file_data_provider/languages-WA.txt
|
188
|
-
- cache/file_data_provider/languages-XH.txt
|
189
|
-
- cache/file_data_provider/languages-ZU.txt
|
190
|
-
- example_output/all_names_for_DE.txt
|
191
|
-
- example_output/all_names_for_FR.txt
|
192
|
-
- example_output/all_names_for_GB.txt
|
193
|
-
- example_output/all_names_for_US.txt
|
194
|
-
- i18n_data.gemspec
|
195
|
-
- lib/i18n_data.rb
|
196
|
-
- lib/i18n_data/file_data_provider.rb
|
197
|
-
- lib/i18n_data/live_data_provider.rb
|
198
|
-
- spec/i18n_data/file_data_provider_spec.rb
|
199
|
-
- spec/i18n_data/live_data_provider_spec.rb
|
200
|
-
- spec/i18n_data_spec.rb
|
47
|
+
- ar_serialized_array.gemspec
|
48
|
+
- init.rb
|
49
|
+
- lib/ar_serialized_array.rb
|
50
|
+
- spec/ar_serialized_array_spec.rb
|
51
|
+
- spec/setup_test_model.rb
|
201
52
|
- spec/spec_helper.rb
|
202
53
|
has_rdoc: true
|
203
54
|
homepage: http://github.com/grosser/ar_serialized_array
|
204
55
|
licenses: []
|
205
56
|
|
206
57
|
post_install_message:
|
207
|
-
rdoc_options:
|
208
|
-
|
58
|
+
rdoc_options: []
|
59
|
+
|
209
60
|
require_paths:
|
210
61
|
- lib
|
211
62
|
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
212
64
|
requirements:
|
213
65
|
- - ">="
|
214
66
|
- !ruby/object:Gem::Version
|
67
|
+
hash: 3
|
68
|
+
segments:
|
69
|
+
- 0
|
215
70
|
version: "0"
|
216
|
-
version:
|
217
71
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
218
73
|
requirements:
|
219
74
|
- - ">="
|
220
75
|
- !ruby/object:Gem::Version
|
76
|
+
hash: 3
|
77
|
+
segments:
|
78
|
+
- 0
|
221
79
|
version: "0"
|
222
|
-
version:
|
223
80
|
requirements: []
|
224
81
|
|
225
82
|
rubyforge_project:
|
226
|
-
rubygems_version: 1.
|
83
|
+
rubygems_version: 1.4.2
|
227
84
|
signing_key:
|
228
85
|
specification_version: 3
|
229
|
-
summary:
|
86
|
+
summary: Serialize an array in a column, [] when no set, xx_as_text accessors and more.
|
230
87
|
test_files:
|
88
|
+
- spec/ar_serialized_array_spec.rb
|
89
|
+
- spec/setup_test_model.rb
|
231
90
|
- spec/spec_helper.rb
|
232
|
-
- spec/i18n_data/file_data_provider_spec.rb
|
233
|
-
- spec/i18n_data/live_data_provider_spec.rb
|
234
|
-
- spec/i18n_data_spec.rb
|