lite_enum 0.0.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 +7 -0
- data/.gitignore +5 -0
- data/.ruby-version +1 -0
- data/.travis.yml +4 -0
- data/Gemfile +2 -0
- data/README.md +35 -0
- data/lib/lite_enum.rb +63 -0
- data/lib/simple_form_monkeypatch.rb +26 -0
- data/lite_enum.gemspec +20 -0
- data/script/release +38 -0
- data/spec/lite_enum_spec.rb +61 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0a50aba22ca2f57d2b36c6159995affa4d0f2a71
|
4
|
+
data.tar.gz: 0f321e80beb4af6fb509def84c7916dec6ad7e17
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c9d6dfa0636cab799f9df14fb627e1c7476e1e4e719d9354306fc9a239eca0ea16a9d301b1a145467fd0812d629848d36c4c384d7299c3c4498797a1ecadcd6b
|
7
|
+
data.tar.gz: 7bb6d3ed9b585ee8144f9cf99360cdcc3ec9ed2f9853c1df6a61a9b15a02561255c32c7cbfb933df82c820bd208d49a3ed7018680574c8f3513ad030cd829d7a
|
data/.gitignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.5
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
lite_enum [![version]](http://rubygems.org/gems/lite_enum) [![build]](https://travis-ci.org/dobtco/lite_enum)
|
2
|
+
=======
|
3
|
+
|
4
|
+
A short and sweet enumerator class for usage with ActiveRecord, most likely.
|
5
|
+
|
6
|
+
## Goals:
|
7
|
+
|
8
|
+
- Concise
|
9
|
+
- Readable
|
10
|
+
- Useful for DOBT's stack
|
11
|
+
- Plain ol' Ruby API
|
12
|
+
- No auto-generation of predicate methods like in `ActiveRecord::Enum`
|
13
|
+
|
14
|
+
## Usage
|
15
|
+
|
16
|
+
```rb
|
17
|
+
# Gemfile
|
18
|
+
gem 'lite_enum'
|
19
|
+
|
20
|
+
# app/models/foo.rb
|
21
|
+
class Foo < ActiveRecord::Base
|
22
|
+
def self.sizes
|
23
|
+
LiteEnum.new(:small, :medium, :large)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Foo.sizes[1] # => :small
|
28
|
+
Foo.sizes[:small] # => 1
|
29
|
+
foo = Foo.new(size: Foo.sizes[:small])
|
30
|
+
foo.size # => 1
|
31
|
+
foo.size == Foo.sizes[:small] # => true
|
32
|
+
```
|
33
|
+
|
34
|
+
[version]: https://img.shields.io/gem/v/lite_enum.svg
|
35
|
+
[build]: http://img.shields.io/travis/dobtco/lite_enum.svg
|
data/lib/lite_enum.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'active_support/all'
|
2
|
+
|
3
|
+
class LiteEnum < SimpleDelegator
|
4
|
+
# Public: Initialize an enum.
|
5
|
+
#
|
6
|
+
# members - the array of enum members. May contain a hash of options:
|
7
|
+
# :start - the number of first enum member. Defaults to 1.
|
8
|
+
#
|
9
|
+
# Examples
|
10
|
+
#
|
11
|
+
# FRUITS = LiteEnum.new(:apple, :orange, :kiwi)
|
12
|
+
def initialize(*members)
|
13
|
+
super({})
|
14
|
+
|
15
|
+
# Support for explicit values
|
16
|
+
if members.length == 1 && members[0].is_a?(Hash)
|
17
|
+
return update members[0]
|
18
|
+
end
|
19
|
+
|
20
|
+
options = members.extract_options!
|
21
|
+
start = options.fetch(:start) { 1 }
|
22
|
+
|
23
|
+
update Hash[members.zip(start..members.count + start)]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Public: Access the number/value of member.
|
27
|
+
#
|
28
|
+
# ids_or_value - number or value of member.
|
29
|
+
#
|
30
|
+
# Returns value if number was provided, and number if value was provided.
|
31
|
+
def [](id_or_value)
|
32
|
+
fetch(id_or_value) { key(id_or_value) }
|
33
|
+
end
|
34
|
+
|
35
|
+
# Public: Check if supplied member is valid.
|
36
|
+
def valid?(member)
|
37
|
+
has_key?(member)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Public: Create a subset of enum, only include specified keys.
|
41
|
+
def only(*keys)
|
42
|
+
dup.tap do |d|
|
43
|
+
d.__getobj__.keep_if { |k| keys.include?(k) }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Public: Create a subset of enum, preserve all items but specified ones.
|
48
|
+
def except(*keys)
|
49
|
+
dup.tap do |d|
|
50
|
+
d.__getobj__.delete_if { |k| keys.include?(k) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
begin
|
56
|
+
require 'simple_form'
|
57
|
+
require 'simple_form/version'
|
58
|
+
rescue
|
59
|
+
end
|
60
|
+
|
61
|
+
if defined?(SimpleForm) && Gem::Version.new(SimpleForm::VERSION) >= Gem::Version.new('3.1.0')
|
62
|
+
require 'simple_form_monkeypatch'
|
63
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SimpleForm
|
2
|
+
module Inputs
|
3
|
+
class CollectionInput
|
4
|
+
def collection_with_lite_enum
|
5
|
+
@collection ||= begin
|
6
|
+
if options[:collection] &&
|
7
|
+
options[:collection].is_a?(LiteEnum) &&
|
8
|
+
(translated = translate_from_namespace(:options))
|
9
|
+
|
10
|
+
options.delete(:collection).map do |k, v|
|
11
|
+
if translated[k].is_a?(Hash)
|
12
|
+
[translated[k][:short], v, translated[k][:long]]
|
13
|
+
else
|
14
|
+
[translated[k], v]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
else
|
18
|
+
collection_without_lite_enum
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_method_chain :collection, :lite_enum
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lite_enum.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
# Describe your gem and declare its dependencies:
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'lite_enum'
|
6
|
+
s.version = '0.0.1'
|
7
|
+
s.required_ruby_version = Gem::Requirement.new('>= 2.0.0')
|
8
|
+
s.authors = ['Adam Becker']
|
9
|
+
s.summary = 'Lightweight Enum class'
|
10
|
+
s.email = 'adam@dobt.co'
|
11
|
+
s.license = 'MIT'
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- {features,spec}/*`.split("\n")
|
14
|
+
s.homepage = 'http://github.com/dobtco/lite_enum'
|
15
|
+
|
16
|
+
s.add_dependency 'activesupport'
|
17
|
+
|
18
|
+
s.add_development_dependency 'rspec-rails', '3.1.0'
|
19
|
+
s.add_development_dependency 'simple_form', '3.1.0'
|
20
|
+
end
|
data/script/release
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# Tag and push a release.
|
3
|
+
|
4
|
+
set -e
|
5
|
+
|
6
|
+
# Make sure we're in the project root.
|
7
|
+
|
8
|
+
cd $(dirname "$0")/..
|
9
|
+
|
10
|
+
# Build a new gem archive.
|
11
|
+
|
12
|
+
rm -rf lite_enum-*.gem
|
13
|
+
gem build -q lite_enum.gemspec
|
14
|
+
|
15
|
+
# Make sure we're on the master branch.
|
16
|
+
|
17
|
+
(git branch | grep -q '* master') || {
|
18
|
+
echo "Only release from the master branch."
|
19
|
+
exit 1
|
20
|
+
}
|
21
|
+
|
22
|
+
# Figure out what version we're releasing.
|
23
|
+
|
24
|
+
tag=v`ls lite_enum-*.gem | sed 's/^lite_enum-\(.*\)\.gem$/\1/'`
|
25
|
+
|
26
|
+
# Make sure we haven't released this version before.
|
27
|
+
|
28
|
+
git fetch -t origin
|
29
|
+
|
30
|
+
(git tag -l | grep -q "$tag") && {
|
31
|
+
echo "Whoops, there's already a '${tag}' tag."
|
32
|
+
exit 1
|
33
|
+
}
|
34
|
+
|
35
|
+
# Tag it and bag it.
|
36
|
+
|
37
|
+
gem push lite_enum-*.gem && git tag "$tag" &&
|
38
|
+
git push origin master && git push origin "$tag"
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'lite_enum'
|
2
|
+
require 'rspec/core'
|
3
|
+
|
4
|
+
describe LiteEnum do
|
5
|
+
let(:enum) { LiteEnum.new(:jake, :finn, :princess_bubblegum, :peppermint_butler) }
|
6
|
+
|
7
|
+
describe ".[]" do
|
8
|
+
it "looks up a number by symbol" do
|
9
|
+
expect(enum[:princess_bubblegum]).to eq(3)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "looks up a symbol by number" do
|
13
|
+
expect(enum[2]).to eq(:finn)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".valid?" do
|
18
|
+
it "returns true if a key exists" do
|
19
|
+
expect(enum.valid?(:finn)).to eq(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns false if a key does not exist" do
|
23
|
+
expect(enum.valid?(:obama)).to eq(false)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".only" do
|
28
|
+
it "returns only the values we ask for" do
|
29
|
+
expect(enum.only(:jake, :princess_bubblegum)).to eq({ jake: 1, princess_bubblegum: 3 })
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe ".except" do
|
34
|
+
it "returns everything but the values we ask to delete" do
|
35
|
+
expect(enum.except(:jake, :princess_bubblegum)).to eq({ finn: 2, peppermint_butler: 4 })
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "options" do
|
40
|
+
describe "start" do
|
41
|
+
let(:zero_enum) { LiteEnum.new(:foo, :bar, start: 0) }
|
42
|
+
|
43
|
+
it "optionally takes a start option" do
|
44
|
+
expect(zero_enum[:foo]).to eq(0)
|
45
|
+
expect(zero_enum[:bar]).to eq(1)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "explicit values" do
|
50
|
+
let(:explicit_enum) do
|
51
|
+
LiteEnum.new(foo: 1, bar: 2, fizz: 4)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "sets values explicitly" do
|
55
|
+
expect(explicit_enum[:foo]).to eq(1)
|
56
|
+
expect(explicit_enum[:bar]).to eq(2)
|
57
|
+
expect(explicit_enum[:fizz]).to eq(4)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lite_enum
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Becker
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec-rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 3.1.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 3.1.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: simple_form
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.1.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.1.0
|
55
|
+
description:
|
56
|
+
email: adam@dobt.co
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- ".gitignore"
|
62
|
+
- ".ruby-version"
|
63
|
+
- ".travis.yml"
|
64
|
+
- Gemfile
|
65
|
+
- README.md
|
66
|
+
- lib/lite_enum.rb
|
67
|
+
- lib/simple_form_monkeypatch.rb
|
68
|
+
- lite_enum.gemspec
|
69
|
+
- script/release
|
70
|
+
- spec/lite_enum_spec.rb
|
71
|
+
homepage: http://github.com/dobtco/lite_enum
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 2.0.0
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.2.2
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: Lightweight Enum class
|
95
|
+
test_files:
|
96
|
+
- spec/lite_enum_spec.rb
|
97
|
+
has_rdoc:
|