underglow 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/README.md +17 -0
- data/Rakefile +4 -0
- data/lib/tasks/db.rake +50 -0
- data/lib/tasks/system.rake +19 -0
- data/lib/tasks/thin.rake +19 -0
- data/lib/underglow/config.rb +0 -0
- data/lib/underglow/extensions/string.rb +118 -0
- data/lib/underglow/extensions/symbol.rb +5 -0
- data/lib/underglow/version.rb +3 -0
- data/lib/underglow.rb +17 -0
- data/spec/extensions/string_spec.rb +111 -0
- data/spec/extensions/symbol_spec.rb +7 -0
- data/spec/spec_helper.rb +12 -0
- data/underglow.gemspec +20 -0
- metadata +94 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Underglow
|
2
|
+
=========
|
3
|
+
Provides some luxury methods and extensions. I personally use this on all my projects to make my life easier.
|
4
|
+
|
5
|
+
Installation
|
6
|
+
============
|
7
|
+
|
8
|
+
gem install underglow
|
9
|
+
|
10
|
+
Testing
|
11
|
+
=======
|
12
|
+
|
13
|
+
rspec spec/
|
14
|
+
|
15
|
+
Contributing
|
16
|
+
============
|
17
|
+
If you find this useful, sweet! If you'd like to improve upon it, that's legit bro.
|
data/Rakefile
ADDED
data/lib/tasks/db.rake
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
namespace :db do
|
2
|
+
# This works on sqlite, mysql and postgresql databases
|
3
|
+
desc "Drop all database connections"
|
4
|
+
task drop_connections: :environment do
|
5
|
+
if ENV['RAILS_ENV'].present?
|
6
|
+
environments = [ENV['RAILS_ENV']]
|
7
|
+
else
|
8
|
+
environments = ["development", "test"]
|
9
|
+
end
|
10
|
+
|
11
|
+
environments.each do |environment|
|
12
|
+
config = Rails.application.config.database_configuration[environment]
|
13
|
+
|
14
|
+
case config['adapter']
|
15
|
+
when /mysql/
|
16
|
+
ActiveRecord::Base.establish_connection(config)
|
17
|
+
ActiveRecord::Base.connection.drop_database config['database']
|
18
|
+
when /^sqlite/
|
19
|
+
require 'pathname'
|
20
|
+
path = Pathname.new(config['database'])
|
21
|
+
file = path.absolute? ? path.to_s : File.join(Rails.root, path)
|
22
|
+
|
23
|
+
FileUtils.rm(file)
|
24
|
+
when 'postgresql'
|
25
|
+
ActiveRecord::Base.connection.select_all("select * from pg_stat_activity order by procpid;").each do |x|
|
26
|
+
if config['database'] == x['datname'] && x['current_query'] == '<IDLE>'
|
27
|
+
ActiveRecord::Base.connection.execute("select pg_terminate_backend(#{x['procpid']})")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
31
|
+
ActiveRecord::Base.connection.drop_database config['database']
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Recreates and migrates db useful for development"
|
37
|
+
task :fresh do
|
38
|
+
# We need to keep track of initial RAILS_ENV because db:test:load changes RAILS_ENV to test
|
39
|
+
RAILS_ENV = ENV['RAILS_ENV'] || "development"
|
40
|
+
|
41
|
+
Rake::Task['db:drop_connections'].invoke
|
42
|
+
Rake::Task['db:drop'].invoke
|
43
|
+
Rake::Task['db:create'].invoke
|
44
|
+
Rake::Task['db:migrate'].invoke
|
45
|
+
Rake::Task['db:test:load'].invoke if RAILS_ENV == "development"
|
46
|
+
|
47
|
+
# set the RAILS_ENV back to initial
|
48
|
+
ENV['RAILS_ENV'] = RAILS_ENV
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
namespace :system do
|
2
|
+
desc "Kill process with pid in *.pid file"
|
3
|
+
task :kill_pid_from_file, :path do |t, args|
|
4
|
+
pid_path = args[:path]
|
5
|
+
|
6
|
+
if File.exists?(pid_path) # if the process is running at all
|
7
|
+
pid = File.read(pid_path).to_i # Get pid from file
|
8
|
+
|
9
|
+
begin
|
10
|
+
Process.kill("TERM", pid) # then kill it
|
11
|
+
rescue
|
12
|
+
# If process not found, do nothing
|
13
|
+
end
|
14
|
+
|
15
|
+
# remove the pid file
|
16
|
+
File.delete(pid_path)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/tasks/thin.rake
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
# All thin operations
|
4
|
+
namespace :thin do
|
5
|
+
desc "Stop thin server"
|
6
|
+
task :stop => :environment do
|
7
|
+
puts "Stopping thin server..."
|
8
|
+
Rake::Task['system:kill_pid_from_file'].invoke(Rails.root.join('tmp', 'pids', 'thin.pid'))
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "Start thin server"
|
12
|
+
task :start do
|
13
|
+
puts "Starting thin server..."
|
14
|
+
puts `bundle exec thin start -d --pid tmp/pids/thin.pid` # daemonize
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Restart thin server"
|
18
|
+
task :restart => ['thin:stop', 'thin:start']
|
19
|
+
end
|
File without changes
|
@@ -0,0 +1,118 @@
|
|
1
|
+
class String
|
2
|
+
def numeric?
|
3
|
+
true if Float(self) rescue false
|
4
|
+
end
|
5
|
+
|
6
|
+
def url?
|
7
|
+
return true if %r{(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?]))}.match(self)
|
8
|
+
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
# Coerces to Float or Fixnum otherwise String
|
13
|
+
# If no type is given, it will determine the type to coerce to
|
14
|
+
# If type is given (the standard type symbols like :integer, :string, etc), it will coerce to that type
|
15
|
+
def coerce(type = nil)
|
16
|
+
if type.nil?
|
17
|
+
if numeric?
|
18
|
+
self.strip.match(/^\d+$/) ? self.to_i : self.to_f
|
19
|
+
elsif self.match(/true/i)
|
20
|
+
true
|
21
|
+
elsif self.match(/false/i)
|
22
|
+
false
|
23
|
+
else
|
24
|
+
self
|
25
|
+
end
|
26
|
+
else
|
27
|
+
type = type.to_sym
|
28
|
+
|
29
|
+
case type
|
30
|
+
when :string
|
31
|
+
self
|
32
|
+
when :integer
|
33
|
+
self.to_i
|
34
|
+
when :float
|
35
|
+
self.to_f
|
36
|
+
when :boolean # only true matches to true, else false for everything
|
37
|
+
if self.match(/true/i)
|
38
|
+
true
|
39
|
+
else
|
40
|
+
false
|
41
|
+
end
|
42
|
+
else # unknown type, just return string
|
43
|
+
self
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# only capitalize initial letter and leave the rest alone
|
49
|
+
def initial_capitalize
|
50
|
+
str = self
|
51
|
+
str[0] = str[0].chr.capitalize
|
52
|
+
|
53
|
+
str
|
54
|
+
end
|
55
|
+
|
56
|
+
def urlize
|
57
|
+
downcase.gsub("_", "-")
|
58
|
+
end
|
59
|
+
|
60
|
+
def deurlize
|
61
|
+
gsub("-", "_")
|
62
|
+
end
|
63
|
+
|
64
|
+
# deurlizes to symbol
|
65
|
+
def deurlize_to_sym
|
66
|
+
deurlize.downcase.to_sym
|
67
|
+
end
|
68
|
+
|
69
|
+
# make it suitable for html attributes
|
70
|
+
def html_attributify
|
71
|
+
downcase.gsub(/[_\/\s]/, "-").gsub(/[^0-9a-z\-]+/, "")
|
72
|
+
end
|
73
|
+
|
74
|
+
# Concat another string and overlap it if it does
|
75
|
+
def overlap(b)
|
76
|
+
a = self
|
77
|
+
a_len = self.length
|
78
|
+
b_len = b.length
|
79
|
+
n = nil
|
80
|
+
|
81
|
+
(0..a_len-1).each do |i|
|
82
|
+
j = i
|
83
|
+
k = 0
|
84
|
+
|
85
|
+
while j < a_len and k < b_len and a[j] == b[k]
|
86
|
+
j += 1
|
87
|
+
k += 1
|
88
|
+
end
|
89
|
+
|
90
|
+
n = k and break if j == a_len
|
91
|
+
end
|
92
|
+
|
93
|
+
n ||= 0
|
94
|
+
|
95
|
+
a + b[n..b_len-1]
|
96
|
+
end
|
97
|
+
|
98
|
+
# Sanitizes a string and leaves behind only ascii characters, and gets rid of non-ascii and does not change original encoding
|
99
|
+
def ascii_only!
|
100
|
+
original_encoding = self.encoding
|
101
|
+
encode!("US-ASCII", invalid: :replace, undef: :replace, replace: "")
|
102
|
+
encode!(original_encoding.name)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Removes matched portion from string and returns matched data object
|
106
|
+
def extract!(regexp)
|
107
|
+
raise ArgumentError, "Must pass in a Regexp object!" unless regexp.is_a? Regexp
|
108
|
+
|
109
|
+
match = regexp.match(self)
|
110
|
+
|
111
|
+
if match
|
112
|
+
sub!(regexp, "")
|
113
|
+
return match
|
114
|
+
end
|
115
|
+
|
116
|
+
nil
|
117
|
+
end
|
118
|
+
end
|
data/lib/underglow.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "underglow/version"
|
2
|
+
require 'underglow/extensions/string'
|
3
|
+
require 'underglow/extensions/symbol'
|
4
|
+
|
5
|
+
module Underglow
|
6
|
+
# Make gem's rake tasks available to Rails app
|
7
|
+
if defined? Rails
|
8
|
+
module Rails
|
9
|
+
class Railtie < ::Rails::Railtie
|
10
|
+
rake_tasks do
|
11
|
+
# load all rake tasks, need to load them by full path so they don't get confused with any tasks of the same name in Rails app
|
12
|
+
Dir[File.join(File.dirname(__FILE__), 'tasks/*.rake')].each { |f| load f }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "String" do
|
4
|
+
it "should coerce a string to proper data type if no argument is given" do
|
5
|
+
"hello world".coerce.class.name.should == "String"
|
6
|
+
"5".coerce.class.name.should == "Fixnum"
|
7
|
+
"3.14".coerce.class.name.should == "Float"
|
8
|
+
"true".coerce.should == true
|
9
|
+
"false".coerce.should == false
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should coerce to the data type if given an argument" do
|
13
|
+
"5".coerce(:string).class.name.should == "String"
|
14
|
+
"5".coerce(:integer).class.name.should == "Fixnum"
|
15
|
+
"5".coerce(:float).class.name.should == "Float"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should coerce to false if given a boolean to coerce to and is anything but true" do
|
19
|
+
"true".coerce(:boolean).should == true
|
20
|
+
"false".coerce(:boolean).should == false
|
21
|
+
"5".coerce(:boolean).should == false
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
it "should be able to deurlize to symbol" do
|
26
|
+
"solid-state-drive".deurlize_to_sym.should == :solid_state_drive
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be able to tell if the string is numeric" do
|
30
|
+
"1".should be_numeric
|
31
|
+
"1.22".should be_numeric
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be able to tell if string is a url" do
|
35
|
+
"http://google.com".url?.should == true
|
36
|
+
"https://192.168.1.200:3000/fucky".url?.should == true
|
37
|
+
"hahahah".url?.should == false
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should initial captalize" do
|
41
|
+
"what the fuck".initial_capitalize.should == "What the fuck"
|
42
|
+
"what the FUCK".initial_capitalize.should == "What the FUCK"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should convert to something proper for html attributes" do
|
46
|
+
"Sandbox".html_attributify.should == "sandbox"
|
47
|
+
"not sure WHAT you mean".html_attributify.should == "not-sure-what-you-mean"
|
48
|
+
"what_the_fuck!!!!".html_attributify.should == "what-the-fuck"
|
49
|
+
"builds/blah".html_attributify.should == "builds-blah"
|
50
|
+
end
|
51
|
+
|
52
|
+
context "overlapping" do
|
53
|
+
it "should append if it doesn't overlap at the end" do
|
54
|
+
"Core i6".overlap("i5-2500k").should == "Core i6i5-2500k"
|
55
|
+
"The day is good".overlap("was good").should == "The day is goodwas good"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should overlap if it overlaps at the end" do
|
59
|
+
"FX".overlap("FX-2500").should == "FX-2500"
|
60
|
+
"Core i5".overlap("i5-2500k 3.2 GHz").should == "Core i5-2500k 3.2 GHz"
|
61
|
+
"Today is really beautiful".overlap("is really beautiful!").should == "Today is really beautiful!"
|
62
|
+
"Just fuck off".overlap("fuck off").should == "Just fuck off"
|
63
|
+
"Oh whilly nil".overlap("whilly nilly").should == "Oh whilly nilly"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "sanitizing ascii only" do
|
68
|
+
it "should be able to get rid of non-ascii characters" do
|
69
|
+
str = "ATI Radeon\u2122 HD 4250 GPU"
|
70
|
+
str.ascii_only!
|
71
|
+
str.should == "ATI Radeon HD 4250 GPU"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should not change the encoding" do
|
75
|
+
str = "ATI Radeon\u2122 HD 4250 GPU"
|
76
|
+
original_encoding = str.encoding.name
|
77
|
+
|
78
|
+
str.ascii_only!
|
79
|
+
str.encoding.name.should == original_encoding
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#extract!' do
|
84
|
+
it "removes the match and returns match object" do
|
85
|
+
str = "What the fuck"
|
86
|
+
match = str.extract!(/the (fuck)/)
|
87
|
+
match.should be_a MatchData
|
88
|
+
match[0].should == "the fuck"
|
89
|
+
match[1].should == "fuck"
|
90
|
+
|
91
|
+
str.should == "What "
|
92
|
+
end
|
93
|
+
|
94
|
+
it "only removes the first match" do
|
95
|
+
str = "12345"
|
96
|
+
match = str.extract!(/\d/)
|
97
|
+
str.should == "2345"
|
98
|
+
end
|
99
|
+
|
100
|
+
it "removes nothing and returns nil if nothing is matched" do
|
101
|
+
str = "12345"
|
102
|
+
match = str.extract!(/[A-Z]+/)
|
103
|
+
match.should be_nil
|
104
|
+
str.should == "12345"
|
105
|
+
end
|
106
|
+
|
107
|
+
it "raises an argument error if not passed in a regexp" do
|
108
|
+
expect { "oh boy".extract!("1234") }.to raise_error ArgumentError
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
require 'underglow' # and any other gems you need
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
# some (optional) config here
|
8
|
+
|
9
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
10
|
+
config.filter_run focus: true
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
end
|
data/underglow.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "underglow/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "underglow"
|
7
|
+
gem.version = Underglow::VERSION
|
8
|
+
gem.authors = ["James Hu"]
|
9
|
+
gem.email = ["axsuul@gmail.com"]
|
10
|
+
gem.homepage = "http://www.github.com/axsuul/underglow"
|
11
|
+
gem.summary = gem.description = %q{Makes life worth living}
|
12
|
+
|
13
|
+
gem.files = `git ls-files`.split("\n")
|
14
|
+
gem.test_files = `git ls-files -- {spec}/*`.split("\n")
|
15
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
|
+
gem.require_paths = ["lib"]
|
17
|
+
|
18
|
+
gem.add_development_dependency "rspec"
|
19
|
+
gem.add_development_dependency "rake"
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: underglow
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- James Hu
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Makes life worth living
|
47
|
+
email:
|
48
|
+
- axsuul@gmail.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- .rspec
|
55
|
+
- Gemfile
|
56
|
+
- README.md
|
57
|
+
- Rakefile
|
58
|
+
- lib/tasks/db.rake
|
59
|
+
- lib/tasks/system.rake
|
60
|
+
- lib/tasks/thin.rake
|
61
|
+
- lib/underglow.rb
|
62
|
+
- lib/underglow/config.rb
|
63
|
+
- lib/underglow/extensions/string.rb
|
64
|
+
- lib/underglow/extensions/symbol.rb
|
65
|
+
- lib/underglow/version.rb
|
66
|
+
- spec/extensions/string_spec.rb
|
67
|
+
- spec/extensions/symbol_spec.rb
|
68
|
+
- spec/spec_helper.rb
|
69
|
+
- underglow.gemspec
|
70
|
+
homepage: http://www.github.com/axsuul/underglow
|
71
|
+
licenses: []
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 1.8.24
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: Makes life worth living
|
94
|
+
test_files: []
|