simple_enum-multiple 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c89b6aec44c60fd0f92340755e106fae10546925
4
- data.tar.gz: 1a1b9dd5c830ccb0db9de912f3894dc0ab3924f0
3
+ metadata.gz: 5cfb52ea823738d79c3c6d3bf2cf579f181530a8
4
+ data.tar.gz: e0bc9cdcabd9e75a510c38c4e80225e13379bcf8
5
5
  SHA512:
6
- metadata.gz: 14472b37550061066af8ac2eaefc98972ae007871e174b5d6299b3a40044207f7d9f827dce4378037d9d50339fd3c9b457320ee438f015a8d363af1e5a86ff1e
7
- data.tar.gz: 99d65fa4d15fd14dfb5b0e78f2d3d720d1250f5a3d25718b77ca40386936af6f6b6188827bc2cb2e89a4c92d0e3bde175dde8b1063ad362577ff562dcf319c41
6
+ metadata.gz: ef43d185427b0c7d21245c83a3c7ed1f90532b252be11056209b3f23698f295478c5d97b7abfd9da8c9997d52ac72fad6665ef498fc7492d4d3f1008a419b26e
7
+ data.tar.gz: 75eb6c0fcae7fb06b1bcfd2e92c0c9092432dd12bdb2cf97dfc015d43242f4e0de3bc49511e03219a9b1660b7ff859d590a6c64202dee0cfdaa921e1c385e33e
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.9.3
5
+ - 2.1.7
6
+ - 2.2.3
7
+ - jruby-19mode
8
+
9
+ gemfile:
10
+ - Gemfile
11
+
12
+ sudo: false
data/README.md CHANGED
@@ -1,19 +1,24 @@
1
1
  # SimpleEnum::Multiple
2
2
 
3
+ [![Travis](https://img.shields.io/travis/bbtfr/simple_enum-multiple.svg)](https://travis-ci.org/bbtfr/simple_enum-multiple)
4
+ [![Gem](https://img.shields.io/gem/v/simple_enum-multiple.svg)](https://rubygems.org/gems/simple_enum-multiple)
5
+
3
6
  SimpleEnum::Multiple is extension of SimpleEnum, which brings multi-select enum support to SimpleEnum.
4
7
 
5
8
  ## ActiveRecord Quick start
6
9
 
7
10
  Add this to a model:
8
11
  ```ruby
9
- as_enum :tags, [:iphone, :ipad, :macbook], accessor: :join_table
12
+ class User < ActiveRecord::Base
13
+ as_enum :favorites, [:iphone, :ipad, :macbook], accessor: :join_table
14
+ end
10
15
  ```
11
16
 
12
- Then create the required tag_cds column using migrations:
17
+ Then create the required `users_favorites` table using migrations:
13
18
  ```ruby
14
- class AddTagsColumnToPost < ActiveRecord::Migration
19
+ class AddfavoritesColumnToUser < ActiveRecord::Migration
15
20
  def change
16
- create_join_table :posts, :tags
21
+ create_join_table :users, :favorites
17
22
  end
18
23
  end
19
24
  ```
@@ -22,21 +27,57 @@ It will store multi-enums data in a join table, if you don't want a join table,
22
27
 
23
28
  ```ruby
24
29
  # Migration
25
- add_column :posts, :tag_cds, :integer
30
+ add_column :Users, :favorite_cds, :integer
26
31
 
27
32
  # Model
28
- as_enum :tags, [:iphone, :ipad, :macbook], accessor: :bitwise
33
+ as_enum :favorites, [:iphone, :ipad, :macbook], accessor: :bitwise
29
34
  ```
30
35
 
31
36
  It will store multi-enums data in a integer column, and if you don't want SimpleEnum::Multiple manage how you store your data, you can use `multiple` accessor:
32
37
 
33
38
  ```ruby
34
39
  # Model
35
- as_enum :tags, [:iphone, :ipad, :macbook], accessor: :multiple
40
+ # serialize :favorite_cds
41
+ # serialize :favorite_cds, YourOwnCoder
42
+ as_enum :favorites, [:iphone, :ipad, :macbook], accessor: :multiple
36
43
  ```
37
44
 
38
- This accessor will not handle how the data saved in the database, so you have to use something like `serialize :tag_cds`, or implement your own [Coder](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/coders/json.rb).
45
+ This accessor will not handle how the data saved in the database, so you have to use something like `serialize :favorite_cds`, or implement your own [Coder](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/coders/json.rb).
46
+
47
+
48
+ ## Working with multi-select enums
49
+ ```ruby
50
+ class User < ActiveRecord::Base
51
+ as_enum :favorites, [:iphone, :ipad, :macbook], accessor: :join_table
52
+ end
39
53
 
54
+ jane = User.new
55
+ jane.favorites = [:iphone, :ipad]
56
+ jane.iphone? # => true
57
+ jane.ipad? # => true
58
+ jane.macbook? # => false
59
+ jane.favorites # => [:iphone, ipad]
60
+ jane.favorite_cds # => [0, 1]
61
+
62
+ joe = User.new
63
+ joe.iphone! # => [:iphone]
64
+ joe.favorites # => [:iphone]
65
+ joe.favorite_cds # => [0]
66
+
67
+ User.favorites # => #<SimpleEnum::Enum:0x0....>
68
+ User.favorites[:iphone] # => [0]
69
+ User.favorites.values_at(:iphone, :ipad) # => [0, 1]
70
+ User.iphones # => #<ActiveRecord::Relation:0x0.... [jane, joe]>
71
+
72
+ # You can also do this since `favorites` returns a
73
+ # #<SimpleEnum::Multiple::CollectionProxy> rather than a #<Array>:
74
+ joe = User.new
75
+ joe.iphone! # => [:iphone]
76
+ joe.favorites.push :ipad
77
+ joe.favorites # => [:iphone, ipad]
78
+ joe.favorite_cds # => [0, 1]
79
+
80
+ ```
40
81
 
41
82
  ## License
42
83
 
@@ -71,9 +71,19 @@ module SimpleEnum
71
71
  end.to_sql
72
72
  connection.send(:insert, insert_sql)
73
73
  end
74
+
75
+ instance_variable_set(:"@#{source}_was", current_cds)
76
+ end
77
+
78
+ define_method :"clear_#{source}!" do
79
+ delete_sql = table.where(table[foreign_key].eq(self.id))
80
+ .compile_delete
81
+ .to_sql
82
+ connection.send(:delete, delete_sql)
74
83
  end
75
84
 
76
85
  after_save :"update_#{source}!"
86
+ after_destroy :"clear_#{source}!"
77
87
  end
78
88
  end
79
89
 
@@ -35,7 +35,7 @@ module SimpleEnum
35
35
  end
36
36
 
37
37
  def scope(collection, value)
38
- raise "scopes for accessor: :multiple are not supported!"
38
+ raise NoMethodError, "scopes for accessor: :multiple are not supported!"
39
39
  end
40
40
 
41
41
  def filter_keys(keys)
@@ -1,16 +1,3 @@
1
1
  require 'simple_enum/multiple/accessors/multiple_accessor'
2
2
  require 'simple_enum/multiple/accessors/join_table_accessor'
3
3
  require 'simple_enum/multiple/accessors/bitwise_accessor'
4
-
5
- module SimpleEnum
6
- module Multiple
7
- module Accessors
8
- SimpleEnum::Accessors::ACCESSORS.merge!({
9
- multiple: MultipleAccessor,
10
- join_table: JoinTableAccessor,
11
- bitwise: BitwiseAccessor
12
- })
13
-
14
- end
15
- end
16
- end
@@ -1,6 +1,8 @@
1
1
  module SimpleEnum
2
2
  module Multiple
3
3
  class CollectionProxy
4
+ include Enumerable
5
+
4
6
  attr_reader :origin, :accessor
5
7
 
6
8
  def initialize(origin, accessor)
@@ -23,7 +25,7 @@ module SimpleEnum
23
25
  end
24
26
 
25
27
  alias_method :to_a, :proxy
26
- delegate :inspect, :to_s, :==, to: :proxy
28
+ delegate :inspect, :to_s, :==, :each, to: :proxy
27
29
 
28
30
  end
29
31
  end
@@ -7,5 +7,3 @@ module SimpleEnum
7
7
  end
8
8
  end
9
9
  end
10
-
11
- SimpleEnum.register_generator :multiple, SimpleEnum::Multiple::Extension
@@ -1,5 +1,5 @@
1
1
  module SimpleEnum
2
2
  module Multiple
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
@@ -3,8 +3,7 @@ require 'simple_enum/multiple/collection_proxy'
3
3
  require 'simple_enum/multiple/extension'
4
4
  require 'simple_enum/multiple/version'
5
5
 
6
- module SimpleEnum
7
- module Multiple
8
- # Your code goes here...
9
- end
10
- end
6
+ SimpleEnum.register_generator :multiple, SimpleEnum::Multiple::Extension
7
+ SimpleEnum.register_accessor :multiple, SimpleEnum::Multiple::Accessors::MultipleAccessor
8
+ SimpleEnum.register_accessor :join_table, SimpleEnum::Multiple::Accessors::JoinTableAccessor
9
+ SimpleEnum.register_accessor :bitwise, SimpleEnum::Multiple::Accessors::BitwiseAccessor
@@ -6,7 +6,7 @@ require 'simple_enum/multiple/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "simple_enum-multiple"
8
8
  spec.version = SimpleEnum::Multiple::VERSION
9
- spec.authors = ["Theo"]
9
+ spec.authors = ["Theo Li"]
10
10
  spec.email = ["bbtfrr@gmail.com"]
11
11
 
12
12
  spec.summary = %q{Multi-select enum support for SimpleEnum.}
@@ -14,6 +14,9 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/bbtfr/simple_enum-multiple"
15
15
  spec.license = "MIT"
16
16
 
17
+ spec.required_ruby_version = ">= 1.9.3"
18
+ spec.required_rubygems_version = ">= 2.0.0"
19
+
17
20
  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
21
  # delete this section to allow pushing this gem to any host.
19
22
  if spec.respond_to?(:metadata)
@@ -27,9 +30,8 @@ Gem::Specification.new do |spec|
27
30
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
31
  spec.require_paths = ["lib"]
29
32
 
30
- spec.add_runtime_dependency 'simple_enum', '~> 2.2'
33
+ spec.add_dependency 'simple_enum', '~> 2.2'
31
34
 
32
- spec.add_development_dependency 'bundler', '~> 1.10'
33
35
  spec.add_development_dependency 'rake', '~> 10.0'
34
36
  spec.add_development_dependency 'activerecord', '>= 4.0.0'
35
37
  spec.add_development_dependency 'mongoid', '>= 4.0.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_enum-multiple
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
- - Theo
7
+ - Theo Li
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-09-15 00:00:00.000000000 Z
11
+ date: 2015-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simple_enum
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.2'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.10'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.10'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +89,7 @@ extensions: []
103
89
  extra_rdoc_files: []
104
90
  files:
105
91
  - ".gitignore"
92
+ - ".travis.yml"
106
93
  - Gemfile
107
94
  - LICENSE.txt
108
95
  - README.md
@@ -132,12 +119,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
119
  requirements:
133
120
  - - ">="
134
121
  - !ruby/object:Gem::Version
135
- version: '0'
122
+ version: 1.9.3
136
123
  required_rubygems_version: !ruby/object:Gem::Requirement
137
124
  requirements:
138
125
  - - ">="
139
126
  - !ruby/object:Gem::Version
140
- version: '0'
127
+ version: 2.0.0
141
128
  requirements: []
142
129
  rubyforge_project:
143
130
  rubygems_version: 2.4.6