core_x 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 495a1c900bf2e6d381a75fcf117991bab1b3d879
4
+ data.tar.gz: 1e74e863880e70b29b2eda4fbb13955dd7cbac8a
5
+ SHA512:
6
+ metadata.gz: e4ac0b748c7ffa1b271d52ec6d4563cd44cc0013b1b873c2e5bddbbc59a56d6ea2588936306b95d92e0eeb81ff5392f5601ab060cabaf398b3bc90e428170226
7
+ data.tar.gz: 5bcf0f33be2c16b14cc2d87b02d7b1fabb8e7796ff9f269107599b730d5fb0e532ac24d3778c6b2378a6e01e56b239ef0fea176648e44e939bb25b7dbbd4e4c3
data/.gemspec.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'gemspec_boilerplate'
4
+
5
+ spec = Gem::Specification.new do |s|
6
+
7
+ GemspecBoilerplate.boilerplate(s)
8
+
9
+ #s.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
10
+
11
+ #####Must change
12
+ s.summary = %q{Mixins to extend the core with}
13
+ s.description = s.summary
14
+ s.licenses = %w[mit]
15
+
16
+
17
+ #####Unlikely to change
18
+ s.email = [ `git config user.email` ]
19
+ s.homepage = "https://github.com/#{`git config github.username`.chomp}/#{s.name}"
20
+ ###################################
21
+
22
+ s.add_dependency 'i18n', '~> 0.7'
23
+ s.add_dependency 'json', '~> 1.7', '>= 1.7.7'
24
+ s.add_dependency 'tzinfo', '~> 1.1'
25
+ s.add_dependency 'attach_function'
26
+
27
+ s.add_development_dependency "rake", "~> 10.0"
28
+ s.add_development_dependency "pry"
29
+ s.add_development_dependency "rspec"
30
+
31
+ end
data/.gemspec_utils.rb ADDED
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'yaml'
4
+ require 'erb'
5
+
6
+ module GemspecBoilerplate
7
+ module_function
8
+ def camelize(string, uppercase_first_letter = true)
9
+ string = string.to_s
10
+ if uppercase_first_letter
11
+ string = string.sub(/^[a-z\d]*/) { $&.capitalize }
12
+ else
13
+ string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { $&.downcase }
14
+ end
15
+ string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }
16
+ string.gsub!(/\//, '::')
17
+ string
18
+ end
19
+
20
+ def add_naming_metadata!(spec)
21
+ metadata = spec.metadata
22
+ metadata.merge!({
23
+ "name" => spec.name,
24
+ "underscored_name" => spec.name.tr('-', '_'),
25
+ "namespaced_path" => spec.name.tr('-', '/')
26
+
27
+ })
28
+ metadata["constant_name"] = camelize(metadata["namespaced_path"])
29
+ end
30
+
31
+ def templates
32
+ return @templates if @templates
33
+ File.open(__FILE__) do |this_file|
34
+ this_file.find { |line| line =~ /^__END__ *$/ }
35
+ @templates = YAML.load(this_file.read)
36
+ end
37
+ @templates
38
+ end
39
+
40
+ def template_write(filename, config, template_str)
41
+ File.write(filename, ERB.new(template_str, nil,'-').result(binding))
42
+ end
43
+
44
+ def bootstrap_lib!(spec)
45
+ Dir.exist?('.git') || system(*%w[git init .])
46
+ m = spec.metadata
47
+ namespaced_path = m["namespaced_path"]
48
+ versionfile = "lib/#{namespaced_path}/version.rb"
49
+ rbfile = "lib/#{namespaced_path}.rb"
50
+ FileUtils.mkdir_p File.dirname(versionfile)
51
+ config = m.dup
52
+ config["constant_array"] = m["constant_name"].split("::")
53
+
54
+ template_write(rbfile, config, templates["newgem.tt"]) unless File.exist?(rbfile)
55
+ template_write(versionfile, config, templates["version.rb.tt"]) unless File.exist?(versionfile)
56
+ end
57
+ end
58
+
59
+ __END__
60
+ ---
61
+ newgem.tt: |
62
+ require "<%=config["namespaced_path"]%>/version"
63
+ <%- if config[:ext] -%>
64
+ require "<%=config["namespaced_path"]%>/<%=config[:underscored_name]%>"
65
+ <%- end -%>
66
+
67
+ <%- config["constant_array"].each_with_index do |c,i| -%>
68
+ <%= ' '*i %>module <%= c %>
69
+ <%- end -%>
70
+ <%= ' '*config["constant_array"].size %>
71
+ <%- (config["constant_array"].size-1).downto(0) do |i| -%>
72
+ <%= ' '*i %>end
73
+ <%- end -%>
74
+ version.rb.tt: |
75
+ <%- config["constant_array"].each_with_index do |c,i| -%>
76
+ <%= ' '*i %>module <%= c %>
77
+ <%- end -%>
78
+ <%= ' '*config["constant_array"].size %>VERSION = "0.1.0"
79
+ HUMAN_VERSION = "1.0.0"
80
+ <%- (config["constant_array"].size-1).downto(0) do |i| -%>
81
+ <%= ' '*i %>end
82
+ <%- end -%>
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /.tup/
11
+ /tupinfo
12
+ /spec/failing_specs.txt
13
+ /test/failing_tests.txt
14
+ /test/succeeding_tests.txt
15
+ /test/test_hypertdd.rb
16
+ *.rb.txt
17
+ Tupfile
18
+ .bundle
19
+ spec/succeeding_specs.txt
20
+ spec/failing_specs.txt
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '.', name: 'gemspec', glob: 'gemspec.gemspec'
4
+ #gem 'attach_function', path: '../attach_function/'
data/LICENSES/MIT ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2005-2015 David Heinemeier Hansson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # CoreX
2
+
3
+ My collection of essential (and possibly nonessential) core extensions/mixins (mixins that are intended to
4
+ be mixed into core classes).
5
+
6
+ I may add more as I need more, using RubyOnRail's ActiveSupport as my main source (hey, it's MIT licensed),
7
+
8
+ ## Selection Strategy
9
+ My strategy for adding extensions is as follows:
10
+
11
+ - if it can be a mixin, make it a mixin instead of modifying the core class directly
12
+ - only essential stuff in the modules that map to to core classes
13
+
14
+ Each extension that takes the form of a mixin shall have the following form:
15
+
16
+ ```ruby
17
+ CoreX::`TargetClassOrModule`
18
+ #- contains the function version of the new functionality
19
+ CoreX::`TargetClassOrModule`::MethodVersions
20
+ #- is intended to be `include`d into the `TargetClassOrModule`
21
+ ```
22
+
23
+ #### Examples
24
+ ##### (Module) Function version
25
+ ```ruby
26
+ CoreX::String.camelize('string_argument') #=> 'StringArgument'
27
+ CoreX::String.undescore('StringArgument') #=> 'string_argument'
28
+ ```
29
+
30
+ ##### Method version
31
+ ```ruby
32
+ String.include(CoreX::String::MethodVersions)
33
+
34
+ 'StringArgument'.underscore #=> 'string_argument'
35
+ 'string_argument'.camelize #=> 'StringArgument'
36
+ ```
37
+ ## Specialized Functionality
38
+ I either won't be adding specialized functionality (e.g., web-related stuff, linguistic functions) or such functionality will be separated into its own optional modules.
39
+
40
+ I may simplify some of the functionality as in the case of (e.g., my version of `camelize` IS the oppossite of underscore -- no special treatment for predefined acronyms) or expand it, if it fits my philosophy.
41
+
42
+ ## Unincluding Mixins
43
+ I highly recommend using the `uninclude` plugin. With it, you can for example, decorate your library's entry methods to include a mixin in to a core class before it starts and uniclude it at the end. That will allow you to use a modified core class in the context of your library without polluting the outside world.
44
+
45
+ ## Executables
46
+ I might expose some functionality in the form of executables to support your UNIX workflow. Check out the `camelCase' and `snake_case` executables.
47
+
48
+ ## Installation
49
+
50
+ Add this line to your application's Gemfile:
51
+
52
+ ```ruby
53
+ gem 'core_x'
54
+ ```
55
+
56
+ And then execute:
57
+
58
+ $ bundle
59
+
60
+ Or install it yourself as:
61
+
62
+ $ gem install core_x
63
+
64
+ ## Usage
65
+
66
+ Use it in any way you like.
67
+
68
+ ## Contributing
69
+
70
+ 1. Fork it ( https://github.com/[my-github-username]/core_xt/fork )
71
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
72
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
73
+ 4. Push to the branch (`git push origin my-new-feature`)
74
+ 5. Create a new Pull Request
75
+
76
+ ## Versioning
77
+ ### Version Number for Machines
78
+
79
+ This gem uses a slightly modified version of the **SemVer** specification, namely:
80
+ ```ruby
81
+ spec.version = "BREAKING.PATCHES.NONBREAKING"
82
+ ```
83
+ You can use this versioning with your dependency tools, only you have a somewhat stronger guarantee that your
84
+ code won't break if you limit yourself to the third number, but you need to allow second level updates in order to
85
+ get (security and other) patches.
86
+
87
+ ### Version Number for Humans
88
+ Since the above-described type of versioning doesn't tell you anything about the functional state of the gem (you can go from a "hello world" to a full blown operating system
89
+ without making a breaking change, as long as your operating system prints "hello world" to the screen) (SemVer, when used correctly, doesn't tell anything about the functional state of a software package either), a second, human-friendly version number can be found in `spec.metadata[:human_version]`.
90
+
91
+ The magnitude of this version number shall be made to correspond to actual functional changes in the software. If I've worked a lot on the package, I'll make it move a lot, but unless I've made breaking changes, I'll stick to only moving the third number in the `spec.version` version.
92
+
93
+ This number is for you. If you see it increase a lot, it probably means much more new goodies, but is less strictly defined then the version number for the machine. (I reserve the right to later change the way I change this number).
94
+
data/Rakefile ADDED
@@ -0,0 +1,120 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ def gemspec
4
+ @gemspec ||= Gem::Specification.load('gemspec.gemspec')
5
+ end
6
+
7
+ def repo_exists?(url)
8
+ @status ||= `curl --head #{Shellwords.escape(url)} 2>/dev/null | head -n1`.split(" ")[1].to_i
9
+ @status < 400
10
+ end
11
+
12
+
13
+ task "release" => :github_repo
14
+
15
+ task :github_repo do
16
+ unless repo_exists?(gemspec.homepage)
17
+ sh %Q{curl -X POST https://api.github.com/user/repos -H "Authorization: token `git config github.token`" -d ' { "name": "#{gemspec.name}" } '}
18
+ end
19
+ sh *%w[git remote add origin], "git@github.com:#{`git config github.user`.chomp}/#{gemspec.name}"
20
+ sh *%w[git push --set-upstream origin master]
21
+ end
22
+
23
+
24
+
25
+ task :default => :test
26
+
27
+ namespace :tup do
28
+ directory 'bin'
29
+ file "Tupfile" => ['Rakefile', 'bin/test_stats_collector.sh'] do |t|
30
+
31
+ #ruby_env = " GEM_HOME=#{ENV['GEM_HOME']} GEM_PATH=#{ENV['GEM_PATH']} PATH=#{ENV['PATH']} "
32
+
33
+ bundler_path = `bundle show bundle`.chomp
34
+ bundle_exec = " ruby -I #{bundler_path}/lib #{bundler_path}/bin/bundle exec "
35
+
36
+ mkdir_p 'tupinfo'
37
+
38
+ string = <<-EOF.gsub(/^ {6}/,'')
39
+ include tupinfo/tests.tup
40
+ include tupinfo/specs.tup
41
+ export GEM_HOME
42
+ export GEM_PATH
43
+ export PATH
44
+ BUNDLE_EXEC = #{bundle_exec}
45
+ TEST_CMD = ruby -Ilib:test
46
+ SPEC_CMD = rspec --color --tty
47
+ : foreach $(TESTS) |> $(BUNDLE_EXEC) $(TEST_CMD) %f >| %o || echo "Failed with: $?" >> %o; cat %o |> %f.txt {test_outputs}
48
+ : foreach $(SPECS) |> $(BUNDLE_EXEC) $(SPEC_CMD) %f >| %o || echo "Failed with: $?" >> %o; cat %o |> %f.txt {spec_outputs}
49
+ : {test_outputs} |> exe/test_stats_collector.sh test/succeeding_tests.txt test/failing_tests.txt %f |> test/succeeding_tests.txt test/failing_tests.txt
50
+ : {spec_outputs} |> exe/test_stats_collector.sh spec/succeeding_specs.txt spec/failing_specs.txt %f |> spec/succeeding_specs.txt spec/failing_specs.txt
51
+ EOF
52
+ File.write(t.name, string)
53
+ end
54
+ file "exe/test_stats_collector.sh" => ['bin', 'Rakefile'] do |t|
55
+ File.write(t.name, <<-EOF.gsub(/^ {6}/,'')
56
+ #!/bin/bash
57
+
58
+ #Usage: collect_test_results success_heap.txt failing_heap.txt [result1 result2 ... ]
59
+
60
+ success_heap=$1
61
+ failing_heap=$2
62
+ touch "$1" "$2"
63
+
64
+ shift; shift
65
+
66
+ for arg in "$@"
67
+ do
68
+ if tail -1 "$arg" | grep -q "^Failed"
69
+ then
70
+ cat "$arg" >> "$failing_heap"
71
+ else
72
+ cat "$arg" >> "$success_heap"
73
+ fi
74
+ done
75
+ EOF
76
+ )
77
+ chmod "u+x", t.name
78
+ end
79
+
80
+ file '.tup' do
81
+ sh "tup init"
82
+ end
83
+
84
+ desc 'Initialize tup'
85
+ task :init => ['.tup','Tupfile', 'tupfiles']
86
+
87
+ task "find_tests" do
88
+ sh "find test -name '*_test.rb' -o -name 'test_*.rb' > tupinfo/tests.lst"
89
+ sh "find spec -name '*_spec.rb' > tupinfo/specs.lst"
90
+ end
91
+
92
+ task "tupfiles" => "find_tests" do
93
+ sh "sed 's/^/TESTS += /' < tupinfo/tests.lst > tupinfo/tests.tup"
94
+ sh "sed 's/^/SPECS += /' < tupinfo/specs.lst > tupinfo/specs.tup"
95
+ end
96
+
97
+
98
+ task "test" => %w[init tupfiles] do
99
+ sh "tup test --quiet"
100
+ mkdir_p "test"
101
+ touch "test/succeeding_tests.txt"
102
+ touch "test/failing_tests.txt"
103
+ sh "cat test/succeeding_tests.txt"
104
+ sh "cat test/failing_tests.txt"
105
+ end
106
+ task "spec" => %w[init tupinfo/specs.tup] do
107
+ sh "tup spec --quiet"
108
+ mkdir_p "spec"
109
+ touch "spec/succeeding_specs.txt"
110
+ touch "spec/failing_specs.txt"
111
+ sh "cat spec/succeeding_specs.txt"
112
+ sh "cat spec/failing_specs.txt"
113
+ end
114
+ end
115
+
116
+ file '.bundle' => '.gemspec.gemspec' do |t|
117
+ sh "bundle | tee > #{t.name}"
118
+ end
119
+
120
+ task 'test' => ['tup:test', 'tup:spec', '.bundle']
data/TESTING.md ADDED
@@ -0,0 +1,28 @@
1
+ # TESTING
2
+
3
+ This repo currently depends on `tup` for testing.
4
+
5
+ Tests are treated as file tasks that map a test file to a test output.
6
+ `Rake` is used to invoke `tup` to run these test tasks.
7
+ `Tup`'s role is that of a dependency tracker.
8
+
9
+ `Tup` keeps track of file reads issued during each test. A particular test will not be invoked again unless some of the files it read during its last run are newer than the last test output.
10
+
11
+ This saves time wasted on useless test runs as long as your tests are deterministic. Fortunately most unit tests are.
12
+
13
+ # Deterministicness
14
+
15
+ For this work, your tests must be deterministic. That means:
16
+ - no random input
17
+ - no testing against real-world net (static mocks only)
18
+ - no error-fraught C-extensions
19
+ - no dependence on dynamic stuff such as the current time
20
+
21
+ Most unit tests abide by these rules.
22
+
23
+ # Bundler
24
+ You need a patched bundler that supports the `glob` option to `gemspec` or else `bundle exec` will issue reads to every file in the repo, rendering the `tup` setup useless.
25
+
26
+ # Dark Corners of Tup
27
+
28
+ Unfortunately, tup brings in a couple of somewhat arbitrary (for testing purposes anyway) rules of its own. Mainly that tests must not tread on each other's output. (that means no shared testing databases, for example -- each test must have its own). I hope to fix this by adding dependency tracking to Rake instead, when I have time.
data/VERSIONING.md ADDED
@@ -0,0 +1,18 @@
1
+ ## Versioning
2
+ ### Version Number for Machines
3
+
4
+ This gem uses a slightly modified version of the **SemVer** specification, namely:
5
+ ```ruby
6
+ spec.version = "BREAKING.PATCHES.NONBREAKING"
7
+ ```
8
+ You can use this versioning with your dependency tools, only you have a somewhat stronger guarantee that your
9
+ code won't break if you limit yourself to the third number, but you need to allow second level updates in order to
10
+ get (security and other) patches.
11
+
12
+ ### Version Number for Humans
13
+ Since the above-described type of versioning doesn't tell you anything about the functional state of the gem (you can go from a "hello world" to a full blown operating system
14
+ without making a breaking change, as long as your operating system prints "hello world" to the screen) (SemVer, when used correctly, doesn't tell anything about the functional state of a software package either), a second, human-friendly version number can be found in `spec.metadata[:human_version]`.
15
+
16
+ The magnitude of this version number shall be made to correspond to actual functional changes in the software. If I've worked a lot on the package, I'll make it move a lot, but unless I've made breaking changes, I'll stick to only moving the third number in the `spec.version` version.
17
+
18
+ This number is for you. If you see it increase a lot, it probably means much more new goodies, but is less strictly defined then the version number for the machine. (I reserve the right to later change the way I change this number).
data/bin/camelCase ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ #Read input from params or stding
5
+ #Snake_case each item
6
+
7
+ require 'core_x/string/import'
8
+
9
+ input = ARGV.empty? ? STDIN.lazy.map(&:chomp) : ARGV
10
+
11
+ input.each do |item|
12
+ puts item.camelize
13
+ end
14
+
15
+
16
+
data/bin/snake_case ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ #Read input from params or stding
5
+ #Snake_case each item
6
+
7
+ require 'core_x/string/import'
8
+
9
+ input = ARGV.empty? ? STDIN.lazy.map(&:chomp) : ARGV
10
+
11
+ input.each do |item|
12
+ puts item.snakecase
13
+ end
14
+
15
+
16
+
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ function ls() { /bin/ls --color=auto --hide '*.rb.txt' "$@"; }
data/exe/console ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ __DIR__ = File.expand_path(File.dirname(__FILE__))
3
+ gem_name = File.basename(File.expand_path(File.join(__DIR__,'..')))
4
+
5
+ require "bundler/setup"
6
+ require gem_name
7
+
8
+ # You can add fixtures and/or initialization code here to make experimenting
9
+ # with your gem easier. You can also use a different console, if you like.
10
+
11
+ # (If you use this, don't forget to add pry to your Gemfile!)
12
+ require "pry"
13
+ Pry.start
data/exe/find_root ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ =begin
4
+ Ascend the current directory until you find $root_marker
5
+ © Petr Skočík, 2015
6
+
7
+ This program is free software; you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation; either version 2 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program; if not, see <http://www.gnu.org/licenses/>.
19
+ =end
20
+
21
+ require 'shellwords'
22
+ require 'pathname'
23
+
24
+ $root_marker = ARGV[0] || ".git"
25
+ $cross_filesystems = ARGV[1] || false
26
+ $show_relative = ( ARGV[2].nil? && true ) || ARGV[2]
27
+
28
+ dir = Pathname.pwd
29
+
30
+ unless $cross_filesystems
31
+ child = dir
32
+ end
33
+
34
+ class BoundaryCrossedError < RuntimeError
35
+ end
36
+ begin
37
+ root = dir.ascend do |cdir|
38
+ unless $cross_filesystems
39
+ if cdir.stat.dev != child.stat.dev
40
+ raise BoundaryCrossedError, "BoundaryCrossedError: File system boundary reached at #{Shellwords.escape(child)}"
41
+ end
42
+ child = cdir
43
+ end
44
+ break cdir if cdir.join($root_marker).exist?
45
+ end
46
+ puts root.relative_path_from(Pathname.pwd)
47
+ exit 0
48
+ rescue BoundaryCrossedError => boundary_error
49
+ warn boundary_error
50
+ exit 1
51
+ end
data/exe/pty_run ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ #Run in an echoing pseudo-terminal
5
+
6
+ require 'pty'
7
+ PTY.spawn(*ARGV) do |r,w,pid|
8
+ begin
9
+ while $_ = r.gets
10
+ STDOUT.print $_
11
+ end
12
+ rescue Errno::EIO
13
+ end
14
+ end
data/exe/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,19 @@
1
+ #!/bin/bash
2
+
3
+ #Usage: collect_test_results success_heap.txt failing_heap.txt [result1 result2 ... ]
4
+
5
+ success_heap=$1
6
+ failing_heap=$2
7
+ touch "$1" "$2"
8
+
9
+ shift; shift
10
+
11
+ for arg in "$@"
12
+ do
13
+ if tail -1 "$arg" | grep -q "^Failed"
14
+ then
15
+ cat "$arg" >> "$failing_heap"
16
+ else
17
+ cat "$arg" >> "$success_heap"
18
+ fi
19
+ done
data/exe/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
data/exe/watch ADDED
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+ inotifywait --quiet -e modify,delete,attrib $PWD -r --exclude '/\.[^/]*'
3
+ bundle exec rake -s
4
+ exec "$0"
data/gemspec.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'gemspec_boilerplate'
4
+
5
+ spec = Gem::Specification.new do |s|
6
+
7
+ GemspecBoilerplate.boilerplate(s)
8
+
9
+ #s.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com' to prevent pushes to rubygems.org, or delete to allow pushes to any server."
10
+
11
+ #####Must change
12
+ s.summary = %q{Mixins to extend the core with}
13
+ s.description = s.summary
14
+ s.licenses = %w[mit]
15
+
16
+
17
+ #####Unlikely to change
18
+ s.email = [ `git config user.email` ]
19
+ s.homepage = "https://github.com/#{`git config github.username`.chomp}/#{s.name}"
20
+ ###################################
21
+
22
+ s.add_dependency 'i18n', '~> 0.7'
23
+ s.add_dependency 'json', '~> 1.7', '>= 1.7.7'
24
+ s.add_dependency 'tzinfo', '~> 1.1'
25
+ s.add_dependency 'attach_function'
26
+
27
+ s.add_development_dependency "rake", "~> 10.0"
28
+ s.add_development_dependency "pry"
29
+ s.add_development_dependency "rspec"
30
+
31
+ end
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'fileutils'
4
+ require 'erb'
5
+ require_relative '.gemspec_utils'
6
+
7
+ $__DIR__ = File.expand_path(File.dirname(__FILE__))
8
+ lib = File.expand_path('lib', $__DIR__)
9
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
10
+
11
+ module GemspecBoilerplate
12
+ module_function
13
+ def boilerplate(s)
14
+ #####Won't change as long as you follow conventions
15
+ s.name = File.basename($__DIR__)
16
+ add_naming_metadata!(s)
17
+ bootstrap_lib!(s)
18
+ metadata = s.metadata
19
+
20
+ require "#{metadata["namespaced_path"]}/version"
21
+ spec_module = Object.const_get(metadata["constant_name"])
22
+ s.version = spec_module::VERSION
23
+ s.metadata["human_version"] = spec_module::HUMAN_VERSION
24
+ s.files = `git ls-files -z`.split("\x0")
25
+ s.test_files = s.files.grep(%r{^(test|s|features)/})
26
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|s|features)/}) }
27
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
28
+ s.require_paths = ["lib"]
29
+ s.authors = `git log > /dev/null 2>&1 && git shortlog -sn`.split("\n").map {|a| a.sub(/^[\d\s]*/, '') }
30
+ end
31
+ end
32
+
data/lib/core_x.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "core_x/version"
2
+
3
+ module CoreX
4
+
5
+ end
@@ -0,0 +1,71 @@
1
+ require 'attach_function'
2
+
3
+ #These are stolen from active_support (Ruby on Rails, (TM)) and modified (no acronyms in case of camelize; made into a mixin instead of
4
+ #monkey peatching core classes directly.
5
+
6
+ module CoreX
7
+ module String
8
+
9
+
10
+ # Converts strings to UpperCamelCase.
11
+ # If the +uppercase_first_letter+ parameter is set to false, then produces
12
+ # lowerCamelCase.
13
+ #
14
+ # Also converts '/' to '::' which is useful for converting
15
+ # paths to namespaces.
16
+ #
17
+ # camelize('active_model') # => "ActiveModel"
18
+ # camelize('active_model', false) # => "activeModel"
19
+ # camelize('active_model/errors') # => "ActiveModel::Errors"
20
+ # camelize('active_model/errors', false) # => "activeModel::Errors"
21
+ #
22
+ # As a rule of thumb you can think of +camelize+ as the inverse of
23
+ # underscore.
24
+ #
25
+ # (This is a mechanical method that doesn't understand human stuff like acronyms.)
26
+ def camelize(string, first_letter_small = false)
27
+ string = string.to_s
28
+ if !first_letter_small
29
+ string = string.sub(/^[a-z\d]*/) { $&.capitalize }
30
+ else
31
+ string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { $&.downcase }
32
+ end
33
+ string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }
34
+ string.gsub!(/\//, '::')
35
+ string
36
+ end
37
+
38
+ alias_method :camelcase, :camelize
39
+ module_function :camelize, :camelcase
40
+
41
+ # Makes an underscored, lowercase form from the expression in the string.
42
+ #
43
+ # Changes '::' to '/' to convert namespaces to paths.
44
+ #
45
+ # underscore('ActiveModel') # => "active_model"
46
+ # underscore('ActiveModel::Errors') # => "active_model/errors"
47
+ #
48
+ # As a rule of thumb you can think of +underscore+ as the inverse of
49
+ # #camelize
50
+ #
51
+ # camelize(underscore('SSLError')) # => "SslError"
52
+ #
53
+ def underscore(camel_cased_word)
54
+ return camel_cased_word unless camel_cased_word =~ /[A-Z-]|::/
55
+ word = camel_cased_word.to_s.gsub(/::/, '/')
56
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
57
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
58
+ word.tr!("-", "_")
59
+ word.downcase!
60
+ word
61
+ end
62
+ alias_method :snakecase, :underscore
63
+ module_function :underscore, :snakecase
64
+
65
+ module MethodVersions
66
+ extend AttachFunction
67
+ attach_outer_class_methods!
68
+ end
69
+ end
70
+ end
71
+
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'core_x/string'
4
+ String.send :include, CoreX::String::MethodVersions
5
+
@@ -0,0 +1,4 @@
1
+ module CoreX
2
+ VERSION = "0.1.1"
3
+ HUMAN_VERSION = "0.1.0"
4
+ end
data/spec/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,4 @@
1
+ __DIR__ = File.expand_path(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift File.expand_path('../lib', __DIR__)
3
+ gem_name = File.basename(File.expand_path('..', __DIR__))
4
+ require gem_name
metadata ADDED
@@ -0,0 +1,185 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: core_x
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Petr Skocik
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.7.7
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '1.7'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.7.7
47
+ - !ruby/object:Gem::Dependency
48
+ name: tzinfo
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.1'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: attach_function
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '10.0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '10.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: pry
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ description: Mixins to extend the core with
118
+ email:
119
+ - |
120
+ pskocik@gmail.com
121
+ executables:
122
+ - camelCase
123
+ - snake_case
124
+ extensions: []
125
+ extra_rdoc_files: []
126
+ files:
127
+ - ".gemspec.gemspec"
128
+ - ".gemspec_utils.rb"
129
+ - ".gitignore"
130
+ - ".rspec"
131
+ - Gemfile
132
+ - LICENSES/MIT
133
+ - README.md
134
+ - Rakefile
135
+ - TESTING.md
136
+ - VERSIONING.md
137
+ - bin/camelCase
138
+ - bin/snake_case
139
+ - exe/bash_import.sh
140
+ - exe/console
141
+ - exe/find_root
142
+ - exe/pty_run
143
+ - exe/setup
144
+ - exe/test_stats_collector.sh
145
+ - exe/version.rb
146
+ - exe/watch
147
+ - gemspec.gemspec
148
+ - gemspec_boilerplate.rb
149
+ - lib/core_x.rb
150
+ - lib/core_x/string.rb
151
+ - lib/core_x/string/import.rb
152
+ - lib/core_x/version.rb
153
+ - spec/.rspec
154
+ - spec/spec_helper.rb
155
+ homepage: https://github.com/pjump/core_x
156
+ licenses:
157
+ - mit
158
+ metadata:
159
+ name: core_x
160
+ underscored_name: core_x
161
+ namespaced_path: core_x
162
+ constant_name: CoreX
163
+ human_version: 0.1.0
164
+ post_install_message:
165
+ rdoc_options: []
166
+ require_paths:
167
+ - lib
168
+ required_ruby_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ required_rubygems_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ requirements: []
179
+ rubyforge_project:
180
+ rubygems_version: 2.2.2
181
+ signing_key:
182
+ specification_version: 4
183
+ summary: Mixins to extend the core with
184
+ test_files: []
185
+ has_rdoc: