frakzio 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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README +29 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/frakzio.gemspec +21 -0
- data/lib/frakzio.rb +107 -0
- data/lib/frakzio/railtie.rb +15 -0
- data/lib/frakzio/version.rb +3 -0
- data/lib/frakzio_validator.rb +9 -0
- data/spec.db +0 -0
- data/spec/frakzio_spec.rb +63 -0
- data/spec/spec_helper.rb +33 -0
- metadata +81 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Frakzio
|
|
2
|
+
==========
|
|
3
|
+
|
|
4
|
+
This gem helps to write a fraction like attributes of a ActiveRecord models.
|
|
5
|
+
|
|
6
|
+
Usage
|
|
7
|
+
-----
|
|
8
|
+
|
|
9
|
+
### Add fraction capability to your ActiveRecord model
|
|
10
|
+
|
|
11
|
+
class Window < ActiveRecord::Base
|
|
12
|
+
act_as_frakzio :width, :height
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
Make sure that the frakzio attributes are string type.
|
|
16
|
+
|
|
17
|
+
### Fraction normalizer
|
|
18
|
+
|
|
19
|
+
w = Window.create(:width => 10.5, :height => "10 8/4")
|
|
20
|
+
w.width
|
|
21
|
+
> "10 1/2"
|
|
22
|
+
w.height
|
|
23
|
+
> "12"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
Copyright
|
|
27
|
+
---------
|
|
28
|
+
|
|
29
|
+
Copyright © 2011 Piotr Dębosz, Adam Lipka.
|
data/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Frakzio
|
|
2
|
+
==========
|
|
3
|
+
|
|
4
|
+
This gem helps to write a fraction like attributes of a ActiveRecord models.
|
|
5
|
+
|
|
6
|
+
Usage
|
|
7
|
+
-----
|
|
8
|
+
|
|
9
|
+
### Add fraction capability to your ActiveRecord model
|
|
10
|
+
|
|
11
|
+
class Window < ActiveRecord::Base
|
|
12
|
+
act_as_frakzio :width, :height
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
Make sure that the frakzio attributes are string type.
|
|
16
|
+
|
|
17
|
+
### Fraction normalizer
|
|
18
|
+
|
|
19
|
+
w = Window.create(:width => 10.5, :height => "10 8/4")
|
|
20
|
+
w.width
|
|
21
|
+
> "10 1/2"
|
|
22
|
+
w.height
|
|
23
|
+
> "12"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
Copyright
|
|
27
|
+
---------
|
|
28
|
+
|
|
29
|
+
Copyright © 2011 Piotr Dębosz, Adam Lipka.
|
data/Rakefile
ADDED
data/frakzio.gemspec
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "frakzio/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "frakzio"
|
|
7
|
+
s.version = Frakzio::VERSION
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = ["Adam Lipka, Piotr Dębosz"]
|
|
10
|
+
s.email = ["adam.lipka@gmail.com, piotr.debosz@gmail.com"]
|
|
11
|
+
s.homepage = ""
|
|
12
|
+
s.summary = "%Write a gem summary"
|
|
13
|
+
s.description = "%Write a gem description"
|
|
14
|
+
|
|
15
|
+
s.rubyforge_project = "frakzio"
|
|
16
|
+
|
|
17
|
+
s.files = `git ls-files`.split("\n")
|
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
20
|
+
s.require_paths = ["lib"]
|
|
21
|
+
end
|
data/lib/frakzio.rb
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Frakzio
|
|
2
|
+
require File.dirname(__FILE__)+'/frakzio/railtie.rb' if defined?(Rails) && Rails::VERSION::MAJOR >= 3
|
|
3
|
+
|
|
4
|
+
def self.included(base)
|
|
5
|
+
base.extend(ClassMethods)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module ClassMethods
|
|
9
|
+
def act_as_frakzio(*attributes)
|
|
10
|
+
attributes.each do |attribute|
|
|
11
|
+
validates attribute, :frakzio => true
|
|
12
|
+
|
|
13
|
+
#setter
|
|
14
|
+
define_method((attribute.to_s + "=").to_sym) do |value|
|
|
15
|
+
fraction_valid?(value) ? write_attribute(attribute, frakzionize(value)) : write_attribute(attribute, value)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
#getter
|
|
19
|
+
define_method(attribute) do
|
|
20
|
+
read_attribute(attribute) || ""
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
include InstanceMethods
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module InstanceMethods
|
|
29
|
+
|
|
30
|
+
def fraction_valid?(value)
|
|
31
|
+
if value
|
|
32
|
+
value = value.to_s
|
|
33
|
+
(value.match(/\A\d* *\d*\/?\d*\z/).to_s == value || value.match(/\A\d*\.?\d*\z/).to_s == value) ? true : false
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def frakzionize(s = "")
|
|
38
|
+
s = "" unless s
|
|
39
|
+
s = s.to_s
|
|
40
|
+
if s.include?('.')
|
|
41
|
+
frac = fraction_to_s(decimal_to_array(s))
|
|
42
|
+
else if s.include?('/')
|
|
43
|
+
frac = fraction_to_s(fraction_to_array(s))
|
|
44
|
+
else
|
|
45
|
+
s == "" ? s = nil : s = s
|
|
46
|
+
frac = s
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
frac
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def nwd(a,b)
|
|
53
|
+
while b!=0 do
|
|
54
|
+
a,b = b,a%b
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
return a
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def simplify(array)
|
|
61
|
+
index = array.size - 2
|
|
62
|
+
entires = index == 0 ? 0 : array[index-1] ? array[index-1] : 0
|
|
63
|
+
|
|
64
|
+
rest = array[index]%array[index+1]
|
|
65
|
+
entires += array[index]/array[index+1]
|
|
66
|
+
n = nwd(rest, array[index+1])
|
|
67
|
+
numerator = rest/n
|
|
68
|
+
denominator = array[index+1]/n
|
|
69
|
+
|
|
70
|
+
numerator = denominator = nil if numerator == 0
|
|
71
|
+
|
|
72
|
+
[entires, numerator, denominator]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def decimal_to_array(d)
|
|
76
|
+
precision = 10**6
|
|
77
|
+
numerator = (d.to_f*precision).to_i
|
|
78
|
+
|
|
79
|
+
simplify([numerator, precision])
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def fraction_to_array(d)
|
|
83
|
+
result = []
|
|
84
|
+
if d.include?(" ")
|
|
85
|
+
result << d.split(" ").first.to_i
|
|
86
|
+
result.concat get_fraction(d.split(" ").last)
|
|
87
|
+
else
|
|
88
|
+
result << nil
|
|
89
|
+
result.concat get_fraction(d)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
simplify(result)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def get_fraction(s)
|
|
96
|
+
s.split("/").map {|x| x.to_i}
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def fraction_to_s(frac)
|
|
100
|
+
result = ""
|
|
101
|
+
result += frac[0].to_s if frac[0] && frac[0] != 0
|
|
102
|
+
result += " " if frac[0] && frac[0] != 0 && frac[1]
|
|
103
|
+
result += "#{frac[1]}/#{frac[2]}" if frac[1] && frac[2]
|
|
104
|
+
result
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Frakzio
|
|
2
|
+
|
|
3
|
+
require 'frakzio'
|
|
4
|
+
require 'rails'
|
|
5
|
+
require 'frakzio_validator'
|
|
6
|
+
|
|
7
|
+
class Railtie < Rails::Railtie
|
|
8
|
+
|
|
9
|
+
initializer 'frakzio.initialize' do
|
|
10
|
+
ActiveSupport.on_load(:active_record) do
|
|
11
|
+
ActiveRecord::Base.send :include, Frakzio
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
class FrakzioValidator < ActiveModel::EachValidator
|
|
2
|
+
# implement the method called during validation
|
|
3
|
+
def validate_each(record, attribute, value)
|
|
4
|
+
if value
|
|
5
|
+
value = value.to_s
|
|
6
|
+
record.errors[attribute] << 'invalid format' unless value.match(/\A\d* *\d*\/?\d*\z/).to_s == value || value.match(/\A\d*\.?\d*\z/).to_s == value
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
data/spec.db
ADDED
|
Binary file
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Frakzio do
|
|
4
|
+
it "should be valid with assigned standard fraction" do
|
|
5
|
+
item = Item.new(:width => "5 5/7")
|
|
6
|
+
item.valid?.should == true
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "should be valid with assigned string/decimal value" do
|
|
10
|
+
item = Item.new(:width => "10.7")
|
|
11
|
+
item.valid?.should == true
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should be valid with assigned decimal value" do
|
|
15
|
+
item = Item.new(:width => 0.7)
|
|
16
|
+
item.valid?.should == true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should be valid with assigned integer value" do
|
|
20
|
+
item = Item.new(:width => 5)
|
|
21
|
+
item.valid?.should == true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "shouldn't be valid with assigned alpha type string" do
|
|
25
|
+
item = Item.new(:width => "dsadsadas")
|
|
26
|
+
item.valid?.should == false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "shouldn't be valid with assigned alpha type string" do
|
|
30
|
+
item = Item.new(:width => "..........")
|
|
31
|
+
item.valid?.should == false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "shouldn't be valid with numeric/dot type string" do
|
|
35
|
+
item = Item.new(:width => "10.01.01")
|
|
36
|
+
item.valid?.should == false
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "shouldn't be valid with numeric/slash like string" do
|
|
40
|
+
item = Item.new(:width => "10 3/6/8")
|
|
41
|
+
item.valid?.should == false
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should assign a float and return fraction string representation" do
|
|
45
|
+
item = Item.create(:width => 10.8)
|
|
46
|
+
item.width.should == "10 4/5"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should assign a float like string and return the fraction string representation" do
|
|
50
|
+
item = Item.create(:width => "10.6")
|
|
51
|
+
item.width.should == "10 3/5"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should assign a regular fraction string and return the fraction string representation" do
|
|
55
|
+
item = Item.create(:width => "10 24/12")
|
|
56
|
+
item.width.should == "12"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should assign a regular fraction string and return the fraction string representation" do
|
|
60
|
+
item = Item.create(:width => "100/12")
|
|
61
|
+
item.width.should == "8 1/3"
|
|
62
|
+
end
|
|
63
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require "rspec"
|
|
2
|
+
require 'sqlite3'
|
|
3
|
+
require 'active_record'
|
|
4
|
+
|
|
5
|
+
SPEC_DIR = File.dirname(__FILE__)
|
|
6
|
+
lib_path = File.expand_path("#{SPEC_DIR}/../lib")
|
|
7
|
+
$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
|
|
8
|
+
require "frakzio"
|
|
9
|
+
require "frakzio_validator"
|
|
10
|
+
|
|
11
|
+
ActiveRecord::Base.send :include, Frakzio
|
|
12
|
+
|
|
13
|
+
ActiveRecord::Base.establish_connection(
|
|
14
|
+
:adapter => "sqlite3",
|
|
15
|
+
:database => "spec.db"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
class Item < ActiveRecord::Base
|
|
19
|
+
act_as_frakzio :width
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if Item.table_exists?
|
|
23
|
+
ActiveRecord::Base.connection.drop_table(:items)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
if !Item.table_exists?
|
|
27
|
+
ActiveRecord::Base.connection.create_table(:items) do |i|
|
|
28
|
+
i.column :id, :integer
|
|
29
|
+
i.column :width, :string
|
|
30
|
+
i.column :created_at, :datetime
|
|
31
|
+
i.column :updated_at, :datetime
|
|
32
|
+
end
|
|
33
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: frakzio
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 29
|
|
5
|
+
prerelease:
|
|
6
|
+
segments:
|
|
7
|
+
- 0
|
|
8
|
+
- 0
|
|
9
|
+
- 1
|
|
10
|
+
version: 0.0.1
|
|
11
|
+
platform: ruby
|
|
12
|
+
authors:
|
|
13
|
+
- "Adam Lipka, Piotr D\xC4\x99bosz"
|
|
14
|
+
autorequire:
|
|
15
|
+
bindir: bin
|
|
16
|
+
cert_chain: []
|
|
17
|
+
|
|
18
|
+
date: 2011-06-27 00:00:00 +02:00
|
|
19
|
+
default_executable:
|
|
20
|
+
dependencies: []
|
|
21
|
+
|
|
22
|
+
description: "%Write a gem description"
|
|
23
|
+
email:
|
|
24
|
+
- adam.lipka@gmail.com, piotr.debosz@gmail.com
|
|
25
|
+
executables: []
|
|
26
|
+
|
|
27
|
+
extensions: []
|
|
28
|
+
|
|
29
|
+
extra_rdoc_files: []
|
|
30
|
+
|
|
31
|
+
files:
|
|
32
|
+
- .gitignore
|
|
33
|
+
- Gemfile
|
|
34
|
+
- README
|
|
35
|
+
- README.md
|
|
36
|
+
- Rakefile
|
|
37
|
+
- frakzio.gemspec
|
|
38
|
+
- lib/frakzio.rb
|
|
39
|
+
- lib/frakzio/railtie.rb
|
|
40
|
+
- lib/frakzio/version.rb
|
|
41
|
+
- lib/frakzio_validator.rb
|
|
42
|
+
- spec.db
|
|
43
|
+
- spec/frakzio_spec.rb
|
|
44
|
+
- spec/spec_helper.rb
|
|
45
|
+
has_rdoc: true
|
|
46
|
+
homepage: ""
|
|
47
|
+
licenses: []
|
|
48
|
+
|
|
49
|
+
post_install_message:
|
|
50
|
+
rdoc_options: []
|
|
51
|
+
|
|
52
|
+
require_paths:
|
|
53
|
+
- lib
|
|
54
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
55
|
+
none: false
|
|
56
|
+
requirements:
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
hash: 3
|
|
60
|
+
segments:
|
|
61
|
+
- 0
|
|
62
|
+
version: "0"
|
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
|
+
none: false
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
hash: 3
|
|
69
|
+
segments:
|
|
70
|
+
- 0
|
|
71
|
+
version: "0"
|
|
72
|
+
requirements: []
|
|
73
|
+
|
|
74
|
+
rubyforge_project: frakzio
|
|
75
|
+
rubygems_version: 1.6.2
|
|
76
|
+
signing_key:
|
|
77
|
+
specification_version: 3
|
|
78
|
+
summary: "%Write a gem summary"
|
|
79
|
+
test_files:
|
|
80
|
+
- spec/frakzio_spec.rb
|
|
81
|
+
- spec/spec_helper.rb
|