acts_as_metadata 0.1.0 → 0.2.0

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.lock CHANGED
@@ -1,80 +1,78 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- acts_as_metadata (0.0.2)
4
+ acts_as_metadata (0.1.0)
5
5
  rails (>= 3.0.0)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- actionmailer (3.1.3)
11
- actionpack (= 3.1.3)
12
- mail (~> 2.3.0)
13
- actionpack (3.1.3)
14
- activemodel (= 3.1.3)
15
- activesupport (= 3.1.3)
10
+ actionmailer (3.2.9)
11
+ actionpack (= 3.2.9)
12
+ mail (~> 2.4.4)
13
+ actionpack (3.2.9)
14
+ activemodel (= 3.2.9)
15
+ activesupport (= 3.2.9)
16
16
  builder (~> 3.0.0)
17
17
  erubis (~> 2.7.0)
18
- i18n (~> 0.6)
19
- rack (~> 1.3.5)
20
- rack-cache (~> 1.1)
21
- rack-mount (~> 0.8.2)
18
+ journey (~> 1.0.4)
19
+ rack (~> 1.4.0)
20
+ rack-cache (~> 1.2)
22
21
  rack-test (~> 0.6.1)
23
- sprockets (~> 2.0.3)
24
- activemodel (3.1.3)
25
- activesupport (= 3.1.3)
22
+ sprockets (~> 2.2.1)
23
+ activemodel (3.2.9)
24
+ activesupport (= 3.2.9)
26
25
  builder (~> 3.0.0)
27
- i18n (~> 0.6)
28
- activerecord (3.1.3)
29
- activemodel (= 3.1.3)
30
- activesupport (= 3.1.3)
31
- arel (~> 2.2.1)
26
+ activerecord (3.2.9)
27
+ activemodel (= 3.2.9)
28
+ activesupport (= 3.2.9)
29
+ arel (~> 3.0.2)
32
30
  tzinfo (~> 0.3.29)
33
- activeresource (3.1.3)
34
- activemodel (= 3.1.3)
35
- activesupport (= 3.1.3)
36
- activesupport (3.1.3)
31
+ activeresource (3.2.9)
32
+ activemodel (= 3.2.9)
33
+ activesupport (= 3.2.9)
34
+ activesupport (3.2.9)
35
+ i18n (~> 0.6)
37
36
  multi_json (~> 1.0)
38
- arel (2.2.1)
39
- builder (3.0.0)
37
+ arel (3.0.2)
38
+ builder (3.0.4)
40
39
  diff-lcs (1.1.3)
41
40
  erubis (2.7.0)
42
41
  hike (1.2.1)
43
- i18n (0.6.0)
44
- json (1.6.1)
45
- mail (2.3.0)
42
+ i18n (0.6.1)
43
+ journey (1.0.4)
44
+ json (1.7.5)
45
+ mail (2.4.4)
46
46
  i18n (>= 0.4.0)
47
47
  mime-types (~> 1.16)
48
48
  treetop (~> 1.4.8)
49
- mime-types (1.17.2)
50
- multi_json (1.0.3)
49
+ mime-types (1.19)
50
+ multi_json (1.3.7)
51
51
  polyglot (0.3.3)
52
- rack (1.3.5)
53
- rack-cache (1.1)
52
+ rack (1.4.1)
53
+ rack-cache (1.2)
54
54
  rack (>= 0.4)
55
- rack-mount (0.8.3)
56
- rack (>= 1.0.0)
57
55
  rack-ssl (1.3.2)
58
56
  rack
59
- rack-test (0.6.1)
57
+ rack-test (0.6.2)
60
58
  rack (>= 1.0)
61
- rails (3.1.3)
62
- actionmailer (= 3.1.3)
63
- actionpack (= 3.1.3)
64
- activerecord (= 3.1.3)
65
- activeresource (= 3.1.3)
66
- activesupport (= 3.1.3)
59
+ rails (3.2.9)
60
+ actionmailer (= 3.2.9)
61
+ actionpack (= 3.2.9)
62
+ activerecord (= 3.2.9)
63
+ activeresource (= 3.2.9)
64
+ activesupport (= 3.2.9)
67
65
  bundler (~> 1.0)
68
- railties (= 3.1.3)
69
- railties (3.1.3)
70
- actionpack (= 3.1.3)
71
- activesupport (= 3.1.3)
66
+ railties (= 3.2.9)
67
+ railties (3.2.9)
68
+ actionpack (= 3.2.9)
69
+ activesupport (= 3.2.9)
72
70
  rack-ssl (~> 1.3.2)
73
71
  rake (>= 0.8.7)
74
72
  rdoc (~> 3.4)
75
- thor (~> 0.14.6)
76
- rake (0.9.2.2)
77
- rdoc (3.11)
73
+ thor (>= 0.14.6, < 2.0)
74
+ rake (10.0.1)
75
+ rdoc (3.12)
78
76
  json (~> 1.4)
79
77
  rspec (2.7.0)
80
78
  rspec-core (~> 2.7.0)
@@ -84,17 +82,18 @@ GEM
84
82
  rspec-expectations (2.7.0)
85
83
  diff-lcs (~> 1.1.2)
86
84
  rspec-mocks (2.7.0)
87
- sprockets (2.0.3)
85
+ sprockets (2.2.1)
88
86
  hike (~> 1.2)
87
+ multi_json (~> 1.0)
89
88
  rack (~> 1.0)
90
89
  tilt (~> 1.1, != 1.3.0)
91
- sqlite3 (1.3.4)
92
- thor (0.14.6)
90
+ sqlite3 (1.3.6)
91
+ thor (0.16.0)
93
92
  tilt (1.3.3)
94
- treetop (1.4.10)
93
+ treetop (1.4.12)
95
94
  polyglot
96
95
  polyglot (>= 0.3.1)
97
- tzinfo (0.3.31)
96
+ tzinfo (0.3.35)
98
97
 
99
98
  PLATFORMS
100
99
  ruby
@@ -102,4 +101,4 @@ PLATFORMS
102
101
  DEPENDENCIES
103
102
  acts_as_metadata!
104
103
  rspec (>= 2.0.0)
105
- sqlite3
104
+ sqlite3 (>= 1.3.5)
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # ActsAsMetadata
2
+
3
+ Dynamicly add unlimited number of indexed, searchable, validatable, strongly typed fields to your ActiveRecord models.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'acts_as_metadata'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it manually:
16
+
17
+ $ gem install acts_as_metadata
18
+
19
+ ## Usage
20
+
21
+ Generate migration that creates metadata tables:
22
+
23
+ $ rails g metadata:migration
24
+
25
+ Add acts_as_metadata to your model:
26
+
27
+ class MyModel < ActiveRecord::Base
28
+ acts_as_metadata
29
+ end
30
+
31
+ and create metadata_cache column to speed up metadata extraction:
32
+
33
+ rails g migration AddMetadataCacheToMyModels metadata_cache:text
34
+
35
+ Create metadata types in your database:
36
+
37
+ mt = MetadataType.create! :tag => :sample, :name => "Sample", :datatype => :string
38
+
39
+ Its ready to use:
40
+
41
+ m = MyModel.new
42
+ m.sample = 'some string'
43
+ m.save!
44
+
45
+ Add some validations or default value if you need:
46
+
47
+ mt.default = 'some default string'
48
+ mt.mandatory = true # presence validation
49
+ mt.format = "[a-z]*" # regexp validation
50
+ mt.values = ['aaa', 'bbb', 'ccc'] # inclusion validation
51
+ mt.save!
52
+
53
+ There are more usage examples in spec directory.
54
+
55
+ ## Contributing
56
+
57
+ 1. Fork it
58
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
59
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
60
+ 4. Push to the branch (`git push origin my-new-feature`)
61
+ 5. Create new Pull Request
@@ -20,5 +20,5 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
  s.add_dependency('rails', '>= 3.0.0' )
22
22
  s.add_development_dependency("rspec", ">= 2.0.0")
23
- s.add_development_dependency("sqlite3")
23
+ s.add_development_dependency("sqlite3", '>= 1.3.5')
24
24
  end
@@ -21,8 +21,15 @@ module ActsAsMetadata
21
21
  value = get_metadata(type.tag)
22
22
  values = type.values.map {|v| v.is_a?(Array) ? v[1] : v } rescue []
23
23
  errors.add(type.tag, I18n.t('acts_as_metadata.errors.blank')) if type.mandatory && value.blank?
24
- errors.add(type.tag, I18n.t('acts_as_metadata.errors.format')) if !type.format.blank? && !value.blank? && value.to_s !~ Regexp.new("^#{type.format}$")
25
- errors.add(type.tag, I18n.t('acts_as_metadata.errors.values')) if !values.blank? && !value.blank? && !values.include?(value)
24
+ if value.is_a? Array
25
+ value.each_with_index do |v, i|
26
+ errors.add("#{type.tag}_#{i}", I18n.t('acts_as_metadata.errors.format')) if values.blank? && type.format.present? && v.present? && v.to_s !~ Regexp.new("^#{type.format}$")
27
+ errors.add("#{type.tag}_#{i}", I18n.t('acts_as_metadata.errors.values')) if values.present? && v.present? && !values.include?(v)
28
+ end
29
+ else
30
+ errors.add(type.tag, I18n.t('acts_as_metadata.errors.format')) if values.blank? && type.format.present? && value.present? && value.to_s !~ Regexp.new("^#{type.format}$")
31
+ errors.add(type.tag, I18n.t('acts_as_metadata.errors.values')) if values.present? && value.present? && !values.include?(value)
32
+ end
26
33
  end unless @skip_metadata_validation
27
34
  end
28
35
 
@@ -120,13 +127,28 @@ module ActsAsMetadata
120
127
  Metadata::Metadata.delete_all(:model_type => self.class.name, :model_id => self.id) unless self.id.blank?
121
128
  self.metadata_types.each do |type_name|
122
129
  value = self.get_metadata(type_name)
123
- self.metadata.build(:metadata_type => type_name, :value => value) unless value.nil?
130
+ if value.is_a? Array
131
+ value.each {|v| self.metadata.build(:metadata_type => type_name, :value => v) unless v.nil? }
132
+ else
133
+ self.metadata.build(:metadata_type => type_name, :value => value) unless value.nil?
134
+ end
124
135
  end
125
136
  end
126
137
 
127
138
  def load_metadata
128
- self.metadata_cache = Hash[self.metadata.all.map { |m| [m.metadata_type, m.value] }]
129
- end
139
+ hash = {}
140
+ metadata.each do |m|
141
+ if hash[m.metadata_type].nil?
142
+ hash[m.metadata_type] = m.value
143
+ elsif hash[m.metadata_type].is_a? Array
144
+ hash[m.metadata_type] << m.value
145
+ else
146
+ hash[m.metadata_type] = [hash[m.metadata_type], m.value]
147
+ end
148
+ end
149
+ self.metadata_cache = {}
150
+ metadata_types.each {|type_name| set_metadata type_name, hash[type_name] }
151
+ end
130
152
  end
131
153
  end
132
154
  end
@@ -1,3 +1,3 @@
1
1
  module ActsAsMetadata
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -36,7 +36,7 @@ describe ActsAsMetadata do
36
36
  Metadata::Metadata.all.count.should == 0
37
37
  end
38
38
 
39
- it 'check presence validation' do
39
+ it 'checks presence validation' do
40
40
  mt = MetadataType.first
41
41
  mt.mandatory = true
42
42
  mt.default = nil
@@ -49,10 +49,10 @@ describe ActsAsMetadata do
49
49
  mymodel.errors.count.should == 0
50
50
  end
51
51
 
52
- it 'check format validation' do
52
+ it 'checks format validation' do
53
53
  mt = MetadataType.first
54
54
  mt.mandatory = false
55
- mt.format = '[a-z]'
55
+ mt.format = '[a-z]*'
56
56
  mt.save!
57
57
  mymodel = MyModel.new
58
58
  mymodel.sample = '12323'
@@ -63,7 +63,7 @@ describe ActsAsMetadata do
63
63
  mymodel.errors.count.should == 0
64
64
  end
65
65
 
66
- it 'check values validation' do
66
+ it 'checks values validation' do
67
67
  mt = MetadataType.first
68
68
  mt.values = ['aaa', 'bbb']
69
69
  mt.save!
@@ -75,4 +75,68 @@ describe ActsAsMetadata do
75
75
  mymodel.save
76
76
  mymodel.errors.count.should == 0
77
77
  end
78
+
79
+ it 'creates multiple metadata items for array metadata' do
80
+ MetadataType.destroy_all
81
+ mt = MetadataType.default
82
+ mt.tag = :samplearray
83
+ mt.name = "Sample Array"
84
+ mt.datatype = :array
85
+ mt.save!
86
+ mymodel = MyModel.new
87
+ mymodel.samplearray = ['aaa', 'bbb', 'ccc']
88
+ mymodel.save
89
+ mymodel.errors.count.should == 0
90
+ mymodel.metadata.count.should == 3
91
+ end
92
+
93
+ it 'loads array metadata correctly' do
94
+ mymodel = MyModel.new
95
+ mymodel.samplearray = ['aaa', 'bbb', 'ccc']
96
+ mymodel.save
97
+ mymodel.errors.count.should == 0
98
+ mymodel.metadata_cache = nil
99
+ mymodel.samplearray.count.should == 3
100
+ end
101
+
102
+ it 'checks presence validation for array metadata' do
103
+ mt = MetadataType.first
104
+ mt.mandatory = true
105
+ mt.default = nil
106
+ mt.save!
107
+ mymodel = MyModel.new
108
+ mymodel.save
109
+ mymodel.errors.include?(:samplearray).should == true
110
+ mymodel.samplearray = ['abc']
111
+ mymodel.save
112
+ mymodel.errors.count.should == 0
113
+ end
114
+
115
+ it 'checks format validation for array metadata' do
116
+ mt = MetadataType.first
117
+ mt.mandatory = false
118
+ mt.format = '[a-z]*'
119
+ mt.save!
120
+ mymodel = MyModel.new
121
+ mymodel.samplearray = ['123', '456', 'ccc']
122
+ mymodel.save
123
+ mymodel.errors.count.should == 2
124
+ mymodel.samplearray = ['aaa', 'bbb', 'ccc']
125
+ mymodel.save
126
+ mymodel.errors.count.should == 0
127
+ end
128
+
129
+ it 'checks values validation for array metadata' do
130
+ mt = MetadataType.first
131
+ mt.mandatory = false
132
+ mt.values = ['aaa', 'bbb', 'ccc']
133
+ mt.save!
134
+ mymodel = MyModel.new
135
+ mymodel.samplearray = ['ddd', 'eee', 'ccc']
136
+ mymodel.save
137
+ mymodel.errors.count.should == 2
138
+ mymodel.samplearray = ['aaa', 'bbb', 'ccc']
139
+ mymodel.save
140
+ mymodel.errors.count.should == 0
141
+ end
78
142
  end
data/spec/spec_helper.rb CHANGED
@@ -32,6 +32,7 @@ ActiveRecord::Base.connection.create_table(:metadata) do |t|
32
32
  t.integer "model_id"
33
33
  t.string "model_type"
34
34
  t.text "value"
35
+ t.string "search_value"
35
36
  t.datetime "deleted_at"
36
37
  t.datetime "created_at"
37
38
  t.datetime "updated_at"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_metadata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-17 00:00:00.000000000 Z
12
+ date: 2012-11-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: 1.3.5
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -58,7 +58,7 @@ dependencies:
58
58
  requirements:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 1.3.5
62
62
  description: This gem allows to add additional database-stored fields to your models
63
63
  email:
64
64
  - grophen@gmail.com
@@ -69,8 +69,8 @@ files:
69
69
  - .gitignore
70
70
  - Gemfile
71
71
  - Gemfile.lock
72
+ - README.md
72
73
  - Rakefile
73
- - Readme
74
74
  - acts_as_metadata.gemspec
75
75
  - lib/acts_as_metadata.rb
76
76
  - lib/generators/metadata/migration/migration_generator.rb
data/Readme DELETED
@@ -1,11 +0,0 @@
1
- ActsAsMetadata
2
- ==============
3
-
4
- User-generated metadata fields for your Rails models.
5
-
6
- Usage
7
- -----
8
-
9
- class MyModel < ActiveRecord::Base
10
- acts_as_metadata
11
- end