rubyenum 0.0.3 → 0.0.4

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: 59018f7aa26b4d793b4734b2ba14b92791a4dead
4
- data.tar.gz: fb035eefd79d94100f32e79f92545e44e99d3e6c
3
+ metadata.gz: 9c8c35f0eefaea3a69f72e056fa555a9b1179902
4
+ data.tar.gz: 8371b1ce5445c3f3878a6860a21d0955e5392b57
5
5
  SHA512:
6
- metadata.gz: c86272331b68ea897d66e50c280be1dfd598e37d7498e98ea1ae677ad73fbb1baa24a2706dccad658b0f492f4490a4d680cc5c863bcae4b3485542523c6ce8a5
7
- data.tar.gz: b8b57468287d3aaee0a2781d53b7ebf7833702f4b5d790334b923e6b6109524529f3e98a3d751357fa16be0124ba4351b687ae140b89acca1587a18902d1a449
6
+ metadata.gz: 32fdc4390bf0280cf4cee4df923f8dd83555a3f8f5d3c5c683cef824862cd2370953faaeb95cd8b9bcaeabab04acb80fd637b79861862bead9ecc0031df5650b
7
+ data.tar.gz: db8f3d8ad90967b1316ecbbe62ff926352477e9767ae5b8854d2a6601a57f3ef2dbe47d7313be5622760701749914fa4077efbb0c054374aa9c56469df6e55a7
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/README.md CHANGED
@@ -1,6 +1,55 @@
1
1
  # Rubyenum
2
2
 
3
- TODO: Write a gem description
3
+ RubyEnum is a simple implemenation of the enum pattern that you see in java, c++, etc. Why use a pattern from a scary laguage like java when we have ruby? Because Enums are awesome. Anytime you have a variety of types for an object that are merely classification, and not deserving of objects themselves, you can use an enum.
4
+
5
+ For instance, if you have a User class that has a role attribute (admin, editor, viewer) in the past you either did:
6
+ - a) store an integer in the database and have a long list of constants to use throughout your code (the better option)
7
+ - b) Stored strings in the database like `"admin"`, or `"editor"` (the terrible option)
8
+
9
+ Enter enums
10
+
11
+ an Enum is an object that has it's own final state (such as an integer for the data), as well as a variety of methods allowing you to act upon that state. For example, this is how you might define a UserRoles enum with RubyEnum
12
+
13
+ ```
14
+ class UserRoles < RubyEnum::Base
15
+
16
+ fields :id, :permissions
17
+
18
+ enum :ADMIN, 0, "all"
19
+ enum :EDITOR, 1, "read/write"
20
+ enum :VIEWER, 2, "read"
21
+
22
+ end
23
+
24
+ ```
25
+
26
+ After defining the enum, you can access an instance of it via the constant and access its properties like so:
27
+
28
+ ```
29
+ role = UserRoles::ADMIN
30
+ role.name #=> "ADMIN" (built in method)
31
+ role.id #=> 0
32
+ role.permissions #=> "all"
33
+ ```
34
+
35
+ You can also go backwards from a field:
36
+ ```
37
+ i = 1
38
+ name = "VIEWER"
39
+ UserRoles.from_id(i) #=> UserRoles::EDITOR
40
+ UserRoles.value_of(name) #=> UserRoles::VIEWER
41
+ ```
42
+
43
+ Finally, they are grouped together, so you can access them all as an array:
44
+ ```
45
+ UserRoles.all #=> [UserRoles::ADMIN, UserRoles::EDITOR, UserRoles::VIEWER]
46
+ ```
47
+
48
+ Together, this all makes for a far more flexible, yet still very stable, method of defining constants throughout the app.
49
+
50
+ ## With rails
51
+
52
+
4
53
 
5
54
  ## Installation
6
55
 
@@ -1,3 +1,3 @@
1
1
  module Rubyenum
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/rubyenum.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "rubyenum/version"
2
+ require "pry"
2
3
 
3
4
  module RubyEnum
4
5
 
@@ -22,6 +23,16 @@ module RubyEnum
22
23
  def self.fields(*args)
23
24
  args.each do |argument|
24
25
  @@fields << argument
26
+ define_singleton_method("from_#{argument.to_s}") do |value|
27
+ item_to_return = nil
28
+ @@all.each do |item|
29
+ if item.send(argument) == value
30
+ item_to_return = item
31
+ break
32
+ end
33
+ end
34
+ item_to_return
35
+ end
25
36
  end
26
37
  end
27
38
 
@@ -41,6 +52,10 @@ module RubyEnum
41
52
  @@all << enumObj
42
53
  end
43
54
 
55
+ def initialize(name)
56
+ @name = name
57
+ end
58
+
44
59
  def add_attribute(attr_name, value)
45
60
  var = instance_variable_set(:"@#{attr_name}", value)
46
61
  define_singleton_method("#{attr_name}") do
@@ -48,26 +63,46 @@ module RubyEnum
48
63
  end
49
64
  end
50
65
 
51
- def initialize(name)
52
- @name = name
53
- end
54
66
 
55
67
 
56
68
  end
57
69
 
58
- ## depends on rails
59
- module Associations
70
+ module Associations
71
+
72
+ # let ActiveRecord define these if using rails
73
+ def create_helper_methods
74
+ unless respond_to? :read_attribute
75
+ define_method(:read_attribute) do |name|
76
+ instance_variable_get(:"@#{name}")
77
+ end
78
+ end
79
+ unless respond_to? :write_attribute
80
+ define_method(:write_attribute) do |name, value|
81
+ instance_variable_set(:"@#{name}", value)
82
+ end
83
+ end
84
+ end
85
+
86
+ def to_camelcase(string)
87
+ return_string = ""
88
+ parts = string.split("_")
89
+ parts.each do |part|
90
+ part[0] = part[0].upcase
91
+ return_string += part
92
+ end
93
+ return_string
94
+ end
60
95
 
61
96
  def enumify(method_name, hash)
62
- klass = Object.const_get(hash[:with].to_s.camelize)
63
-
97
+ create_helper_methods
98
+ klass = Object.const_get(to_camelcase(hash[:with].to_s))
64
99
  define_method(method_name) do
65
100
  enum_to_return = nil
66
101
  var = read_attribute(method_name)
67
102
  klass.all.each do |item|
68
103
  if item.send(hash[:use]) == var
69
104
  enum_to_return = item
70
- break;
105
+ break
71
106
  end
72
107
  end
73
108
  enum_to_return
@@ -101,11 +136,9 @@ end
101
136
 
102
137
  # extend RubyEnum::Associations
103
138
 
104
- # attr_accessor :animal
105
-
106
139
  # enumify :animal, :with => :animal_example, :use => :id
107
140
 
108
- # # overides getter and setter methods
141
+ # # writes getter and setter methods
109
142
  # # animal=(AnimalExample), sets the property to the :use value @animal = id
110
143
  # # animal => AnimalExample, gets the property from the :use value and converts to Enum
111
144
 
data/rubyenum.gemspec CHANGED
@@ -20,4 +20,6 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.5"
22
22
  spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
23
25
  end
@@ -0,0 +1,24 @@
1
+ require 'rubyenum'
2
+ require 'spec_helper'
3
+ require 'user_role_fixture'
4
+
5
+ describe RubyEnum::Associations do
6
+
7
+ before(:each) do
8
+ @user = User.new
9
+ @user.role = UserRole::ADMIN
10
+
11
+ end
12
+
13
+ describe "#role" do
14
+ it "stores the value of the assigned field" do
15
+ expect(@user.instance_variable_get(:"@role")).to be 0
16
+ end
17
+
18
+ it "returns the enum of the user" do
19
+ expect(@user.role).to eq(UserRole::ADMIN)
20
+ end
21
+
22
+ end
23
+
24
+ end
@@ -0,0 +1,52 @@
1
+ require 'rubyenum'
2
+ require 'spec_helper'
3
+ require 'user_fixture'
4
+
5
+ describe RubyEnum::Associations do
6
+
7
+ describe "#all" do
8
+ it "returns a array of the enums" do
9
+ enums = UserRole.all
10
+ expect(enums.size).to be 3
11
+ expect(enums[0]).to eq UserRole::ADMIN
12
+ end
13
+ end
14
+
15
+ describe "#new" do
16
+ it "does not allow instantiation" do
17
+ expect { UserRole.new }.to raise_error(NoMethodError)
18
+ end
19
+ end
20
+
21
+ describe "#value_of" do
22
+ it "returns the proper enum for a string" do
23
+ enum = UserRole.value_of "EDITOR"
24
+ expect(enum).to eq UserRole::EDITOR
25
+ end
26
+
27
+ it "returns the proper enum for a symbol" do
28
+ enum = UserRole.value_of :READER
29
+ expect(enum).to eq UserRole::READER
30
+ end
31
+ end
32
+
33
+ describe ".fields" do
34
+ it "creates methods to access enum from each field" do
35
+ enum = UserRole.from_id 1
36
+ expect(enum).to eq UserRole::EDITOR
37
+
38
+ enum = UserRole.from_permission "all"
39
+ expect(enum).to eq UserRole::ADMIN
40
+ end
41
+ end
42
+
43
+ describe "#get_fields" do
44
+ it "returns an array of the defined fields" do
45
+ fields = UserRole.get_fields
46
+ expect(fields.size).to be 2
47
+
48
+ expect(fields.include? :id).to be true
49
+ expect(fields.include? :permission).to be true
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
@@ -0,0 +1,7 @@
1
+ require 'user_role_fixture'
2
+
3
+ class User
4
+ extend RubyEnum::Associations
5
+
6
+ enumify :role, :with => :user_role, :use => :id
7
+ end
@@ -0,0 +1,7 @@
1
+ class UserRole < RubyEnum::Base
2
+ fields :id, :permission
3
+
4
+ enum :ADMIN, 0, "all"
5
+ enum :EDITOR, 1, "read/write"
6
+ enum :READER, 2, "read"
7
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyenum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - georgemayer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-15 00:00:00.000000000 Z
11
+ date: 2015-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  description: provides enum functionality for ruby
42
70
  email:
43
71
  - mayer.georgep@gmail.com
@@ -46,6 +74,7 @@ extensions: []
46
74
  extra_rdoc_files: []
47
75
  files:
48
76
  - ".gitignore"
77
+ - ".rspec"
49
78
  - Gemfile
50
79
  - LICENSE.txt
51
80
  - README.md
@@ -53,6 +82,11 @@ files:
53
82
  - lib/rubyenum.rb
54
83
  - lib/rubyenum/version.rb
55
84
  - rubyenum.gemspec
85
+ - spec/rubyenum_associations_spec.rb
86
+ - spec/rubyenum_base_spec.rb
87
+ - spec/spec_helper.rb
88
+ - spec/user_fixture.rb
89
+ - spec/user_role_fixture.rb
56
90
  homepage: ''
57
91
  licenses:
58
92
  - MIT
@@ -77,4 +111,9 @@ rubygems_version: 2.2.1
77
111
  signing_key:
78
112
  specification_version: 4
79
113
  summary: provides enum functionality for ruby
80
- test_files: []
114
+ test_files:
115
+ - spec/rubyenum_associations_spec.rb
116
+ - spec/rubyenum_base_spec.rb
117
+ - spec/spec_helper.rb
118
+ - spec/user_fixture.rb
119
+ - spec/user_role_fixture.rb