florrick 1.0.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.
- checksums.yaml +7 -0
- data/lib/florrick/active_record_extension.rb +55 -0
- data/lib/florrick/builder.rb +60 -0
- data/lib/florrick/builtin_formatters.rb +39 -0
- data/lib/florrick/dsl.rb +20 -0
- data/lib/florrick/formatter.rb +40 -0
- data/lib/florrick/railtie.rb +12 -0
- data/lib/florrick/version.rb +3 -0
- data/lib/florrick.rb +15 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 20ab91439eaf4ce4d05675e501a0667f48138633
|
4
|
+
data.tar.gz: 0df8702cce5af859de517f3e34a645608aa9b993
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: df6f287a92029579b87b8589e140792ed7f747464666718ab2e177fa7a40b91eff1a7dc03aa5b13799a6a668394f89fef60ec8f79cf3f4489901b82adefca782
|
7
|
+
data.tar.gz: 64a594f1d4b80a821f09117b340c11ac4ce91d72c85d0014cc7193898be33e7cb57c13991f68ed62e9c43271d2d279e2c7001246870e7710e2cab3c1149aed54
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Florrick
|
2
|
+
module ActiveRecordExtension
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
def string_interpolation_value_for(var)
|
9
|
+
if self.class.florrick_fields[:strings].keys.include?(var.to_sym)
|
10
|
+
block = self.class.florrick_fields[:strings][var.to_sym]
|
11
|
+
if block
|
12
|
+
self.instance_eval(&block)
|
13
|
+
else
|
14
|
+
self.send(var)
|
15
|
+
end
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module ClassMethods
|
22
|
+
|
23
|
+
#
|
24
|
+
# Return a hash for all florrick fields which have been defined for this model
|
25
|
+
#
|
26
|
+
def florrick_fields
|
27
|
+
@florrick_fields ||= {:strings => {}, :relationships =>{}}
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Accept a new set of configuration for this model
|
32
|
+
#
|
33
|
+
def florrick(&block)
|
34
|
+
dsl = Florrick::DSL.new(self)
|
35
|
+
dsl.instance_eval(&block)
|
36
|
+
dsl
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# Return whether or not a given key can be replaced
|
41
|
+
#
|
42
|
+
def string_interpolation_for?(var)
|
43
|
+
florrick_fields[:strings].keys.include?(var.to_sym)
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# Return whether or not a given relationship key can be replaced
|
48
|
+
#
|
49
|
+
def string_interpolation_relationship_for?(var)
|
50
|
+
florrick_fields[:relationships].keys.include?(var.to_sym)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Florrick
|
2
|
+
class Builder
|
3
|
+
|
4
|
+
VALID_EXPORT_TYPES = [String, Numeric, Date, Time]
|
5
|
+
|
6
|
+
attr_reader :original_string, :objects
|
7
|
+
|
8
|
+
def initialize(string, objects = {})
|
9
|
+
@original_string = string
|
10
|
+
@objects = objects
|
11
|
+
end
|
12
|
+
|
13
|
+
def output
|
14
|
+
string = @original_string.dup
|
15
|
+
string.gsub(/(\{\{([(\w+)\.]+)\}\})/) do
|
16
|
+
parts = $2.split('.')
|
17
|
+
final_string = nil
|
18
|
+
previous_object = @objects[parts.shift.to_sym]
|
19
|
+
final_string = $1 if previous_object.nil?
|
20
|
+
until final_string
|
21
|
+
# get the latest part
|
22
|
+
if var = parts.shift
|
23
|
+
# if the previous object is suitable for string interpolation, we can
|
24
|
+
# pass the var to it and get out a string or an integer.
|
25
|
+
if previous_object.respond_to?(:string_interpolation_value_for)
|
26
|
+
if previous_object.class.string_interpolation_for?(var)
|
27
|
+
# we can do this easily
|
28
|
+
previous_object = previous_object.string_interpolation_value_for(var)
|
29
|
+
# if the previous object was nil, just set to an empty string
|
30
|
+
final_string = "" if previous_object.nil?
|
31
|
+
elsif previous_object.class.string_interpolation_relationship_for?(var)
|
32
|
+
# maybe we can do this on another object
|
33
|
+
previous_object = previous_object.send(var)
|
34
|
+
else
|
35
|
+
# can't do this :(
|
36
|
+
final_string = $1
|
37
|
+
end
|
38
|
+
elsif VALID_EXPORT_TYPES.any? { |t| previous_object.is_a?(t)}
|
39
|
+
previous_object = Florrick::Formatter.convert(var, previous_object)
|
40
|
+
else
|
41
|
+
# does not respond to string_interpolation_value_for and isn't a valid object,
|
42
|
+
# we can't do anything here just return the passed value.
|
43
|
+
final_string = $1
|
44
|
+
end
|
45
|
+
else
|
46
|
+
# we're at the end now, if we can return the previous object, lets do it otherwise
|
47
|
+
# we'll just return the string as we can't do anything.
|
48
|
+
if VALID_EXPORT_TYPES.any? { |t| previous_object.is_a?(t)}
|
49
|
+
final_string = previous_object.to_s
|
50
|
+
else
|
51
|
+
final_string = $1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
final_string
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# This file contains all formatters which are built-in. Some of these built-in formatters
|
2
|
+
# require ActiveSupport but seeing as that's a dependency of ActiveRecord, it won't be a problem
|
3
|
+
# for most users.
|
4
|
+
require 'active_support/core_ext/integer/inflections'
|
5
|
+
require 'active_support/inflector/transliterate'
|
6
|
+
require 'digest/sha1'
|
7
|
+
require 'digest/md5'
|
8
|
+
|
9
|
+
#
|
10
|
+
# String formatters
|
11
|
+
#
|
12
|
+
Florrick::Formatter.add('downcase', [String]) { |s| s.downcase }
|
13
|
+
Florrick::Formatter.add('upcase', [String]) { |s| s.upcase }
|
14
|
+
Florrick::Formatter.add('humanize', [String]) { |s| s.humanize }
|
15
|
+
Florrick::Formatter.add('strip', [String]) { |s| s.strip }
|
16
|
+
Florrick::Formatter.add('sha1', [String]) { |s| Digest::SHA1.hexdigest(s) }
|
17
|
+
Florrick::Formatter.add('md5', [String]) { |s| Digest::MD5.hexdigest(s) }
|
18
|
+
|
19
|
+
#
|
20
|
+
# Mathmatical formatters
|
21
|
+
#
|
22
|
+
Florrick::Formatter.add('double', [Numeric]) { |s| s * 2 }
|
23
|
+
Florrick::Formatter.add('triple', [Numeric]) { |s| s * 3 }
|
24
|
+
|
25
|
+
#
|
26
|
+
# DateTime formatters
|
27
|
+
#
|
28
|
+
|
29
|
+
Florrick::Formatter.add('long_date', [Date, Time]) { |s| s.strftime("%A #{s.day.ordinalize} %B %Y") }
|
30
|
+
Florrick::Formatter.add('long_date_without_day_name', [Date, Time]) { |s| s.strftime("#{s.day.ordinalize} %B %Y") }
|
31
|
+
|
32
|
+
Florrick::Formatter.add('short_date', [Date, Time]) { |s| s.strftime("%a %e %b %Y") }
|
33
|
+
Florrick::Formatter.add('short_date_without_day_name', [Date, Time]) { |s| s.strftime("%e %b %Y") }
|
34
|
+
|
35
|
+
Florrick::Formatter.add('ddmmyyyy', [Date, Time]) { |s| s.strftime("%d/%m/%Y") }
|
36
|
+
Florrick::Formatter.add('hhmm', [Date, Time]) { |s| s.strftime("%H:%M") }
|
37
|
+
Florrick::Formatter.add('hhmmss', [Date, Time]) { |s| s.strftime("%H:%M:%S") }
|
38
|
+
Florrick::Formatter.add('hhmm12', [Date, Time]) { |s| s.strftime("%I:%M%P") }
|
39
|
+
Florrick::Formatter.add('hhmmss12', [Date, Time]) { |s| s.strftime("%I:%M:%S%P") }
|
data/lib/florrick/dsl.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Florrick
|
2
|
+
class DSL
|
3
|
+
|
4
|
+
def initialize(model)
|
5
|
+
@model = model
|
6
|
+
end
|
7
|
+
|
8
|
+
def string(*vars, &block)
|
9
|
+
vars.each do |var|
|
10
|
+
@model.florrick_fields[:strings][var.to_sym] = block
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def relationship(*vars, &block)
|
15
|
+
vars.each do |var|
|
16
|
+
@model.florrick_fields[:relationships][var.to_sym] = block
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Florrick
|
2
|
+
class Formatter
|
3
|
+
|
4
|
+
class << self
|
5
|
+
# Return all formatters available
|
6
|
+
def formatters
|
7
|
+
@formatters ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
# Add a new global formatter
|
11
|
+
def add(name, types = [], &block)
|
12
|
+
formatters[name.to_sym] = self.new(name, types, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Run a string through a given formatter and return the result. If not possible, return false.
|
16
|
+
def convert(name, value)
|
17
|
+
if formatter = formatters[name.to_sym]
|
18
|
+
formatter.convert(value)
|
19
|
+
else
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(name, types, &block)
|
26
|
+
@name, @types, @block = name, types, block
|
27
|
+
end
|
28
|
+
|
29
|
+
def convert(value)
|
30
|
+
if @types.empty? || @types.any? { |t| value.is_a?(t)}
|
31
|
+
@block.call(value)
|
32
|
+
else
|
33
|
+
false
|
34
|
+
end
|
35
|
+
rescue
|
36
|
+
'???'
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Florrick
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
|
4
|
+
initializer 'florrick.initialize' do
|
5
|
+
ActiveSupport.on_load(:active_record) do
|
6
|
+
require 'florrick/active_record_extension'
|
7
|
+
ActiveRecord::Base.send :include, Florrick::ActiveRecordExtension
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
data/lib/florrick.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'florrick/version'
|
2
|
+
require 'florrick/builder'
|
3
|
+
require 'florrick/dsl'
|
4
|
+
require 'florrick/formatter'
|
5
|
+
require 'florrick/builtin_formatters'
|
6
|
+
require 'florrick/railtie' if defined?(Rails)
|
7
|
+
|
8
|
+
module Florrick
|
9
|
+
|
10
|
+
# A quick helper method for quickly running conversion
|
11
|
+
def self.convert(string, objects = {})
|
12
|
+
Builder.new(string, objects).output
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: florrick
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Cooke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-05-02 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A Rails extension for providing awesome user-initiated string interpolation
|
14
|
+
email:
|
15
|
+
- me@adamcooke.io
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/florrick.rb
|
21
|
+
- lib/florrick/active_record_extension.rb
|
22
|
+
- lib/florrick/builder.rb
|
23
|
+
- lib/florrick/builtin_formatters.rb
|
24
|
+
- lib/florrick/dsl.rb
|
25
|
+
- lib/florrick/formatter.rb
|
26
|
+
- lib/florrick/railtie.rb
|
27
|
+
- lib/florrick/version.rb
|
28
|
+
homepage: https://github.com/adamcooke/florrick
|
29
|
+
licenses: []
|
30
|
+
metadata: {}
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
requirements: []
|
46
|
+
rubyforge_project:
|
47
|
+
rubygems_version: 2.2.0
|
48
|
+
signing_key:
|
49
|
+
specification_version: 4
|
50
|
+
summary: A Rails extension for providing awesome user-initiated string interpolation
|
51
|
+
test_files: []
|
52
|
+
has_rdoc:
|