sugar-high 0.4.0 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/VERSION +1 -1
  2. data/lib/sugar-high/array.rb +58 -7
  3. data/lib/sugar-high/class_ext.rb +11 -0
  4. data/lib/sugar-high/enumerable.rb +67 -0
  5. data/lib/sugar-high/file.rb +24 -76
  6. data/lib/sugar-high/file_ext.rb +65 -0
  7. data/lib/sugar-high/file_mutate.rb +45 -192
  8. data/lib/sugar-high/file_mutate/append_content.rb +17 -0
  9. data/lib/sugar-high/file_mutate/delete.rb +29 -0
  10. data/lib/sugar-high/file_mutate/insert_content.rb +62 -0
  11. data/lib/sugar-high/file_mutate/mutate.rb +58 -0
  12. data/lib/sugar-high/file_mutate/overwrite_content.rb +17 -0
  13. data/lib/sugar-high/file_mutate/remove_content.rb +33 -0
  14. data/lib/sugar-high/file_mutate/replace_content.rb +45 -0
  15. data/lib/sugar-high/kind_of.rb +8 -43
  16. data/lib/sugar-high/string.rb +5 -0
  17. data/spec/fixtures/application_file.rb +1 -0
  18. data/spec/fixtures/class_file.rb +15 -0
  19. data/spec/fixtures/content_file.txt +1 -0
  20. data/spec/fixtures/file.txt +1 -0
  21. data/spec/fixtures/routes_file.rb +16 -0
  22. data/spec/sugar-high/array_spec.rb +44 -3
  23. data/spec/sugar-high/file/file_dsl_spec.rb +4 -0
  24. data/spec/sugar-high/file_mutate/append_content_spec.rb +60 -0
  25. data/spec/sugar-high/file_mutate/delete_spec.rb +47 -0
  26. data/spec/sugar-high/file_mutate/insert_before_last_spec.rb +56 -0
  27. data/spec/sugar-high/file_mutate/insert_content_spec.rb +111 -0
  28. data/spec/sugar-high/file_mutate/overwrite_content_spec.rb +80 -0
  29. data/spec/sugar-high/file_mutate/remove_content_spec.rb +109 -0
  30. data/spec/sugar-high/file_mutate/replace_content_spec.rb +33 -0
  31. data/spec/sugar-high/{file/file_spec.rb → file_spec.rb} +1 -0
  32. data/sugar-high.gemspec +26 -27
  33. metadata +27 -28
  34. data/spec/sugar-high/file/file_mutate_spec.rb +0 -325
@@ -0,0 +1,17 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module AppendContent
4
+ def append content=nil, &block
5
+ File.append self.path, content, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ def append path, content=nil, &block
10
+ File.open(path, 'a') do |f|
11
+ f.puts content ||= yield
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ require 'sugar-high/blank'
2
+ require 'sugar-high/arguments'
3
+ require 'sugar-high/path'
4
+ require 'sugar-high/regexp'
5
+ require 'sugar-high/string'
6
+ require 'sugar-high/file'
7
+
8
+ module SugarHigh
9
+ module FileMutate
10
+ module Delete
11
+ module ClassMethods
12
+ def delete! name
13
+ return nil if !File.exist?(name)
14
+ File.delete name
15
+ end
16
+ alias_method :delete_file!, :delete!
17
+ end
18
+
19
+ def delete!
20
+ File.delete(self.path)
21
+ end
22
+ alias_method :delete_file!, :delete!
23
+
24
+ def mutate marker, place, &block
25
+ File.mutate_file self.path, marker, place, &block
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,62 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module InsertContent
4
+ def insert *args, &block
5
+ File.insert_into self.path, *args, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ # insert_into 'my_file.txt', :after => 'Blip', :content => 'Hello
10
+ # insert_into 'my_file.txt', 'Hello', :after => 'Blip'
11
+ # insert_into 'my_file.txt', :after => 'Blip' do
12
+ # 'Hello'
13
+ # end
14
+ def insert_into file_name, *args, &block
15
+ options = last_option args
16
+ content = insertion_content options, *args, &block
17
+
18
+ # no content to insert?
19
+ return nil if content.blank?
20
+
21
+ file = begin
22
+ get_file(file_name)
23
+ rescue
24
+ return nil
25
+ end
26
+
27
+ # already inserted?
28
+ return nil if !options[:repeat] && file.has_content?(content)
29
+
30
+ # find where to insert
31
+ place, marker = if options[:before]
32
+ [ :before, options[:before] ]
33
+ elsif options[:before_last]
34
+ [ :before_last, options[:before_last] ]
35
+ else
36
+ [ :after, options[:after] ]
37
+ end
38
+
39
+ return nil if !file.has_content?(marker)
40
+
41
+ # do mutation
42
+ res = file.mutate marker, place do
43
+ content
44
+ end
45
+ res
46
+ end
47
+
48
+ def insertion_content options = {}, *args, &block
49
+ case args.first
50
+ when String
51
+ args.first
52
+ when Hash
53
+ options[:content] || (yield if block)
54
+ else
55
+ return yield if block
56
+ raise ArgumentError, "You must supply content to insert, either as a String before the options hash, a :content option or a block"
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,58 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module Mutate
4
+ module ClassMethods
5
+ def mutate_file file, marker, place, &block
6
+ raise ArgumentError, "You must define a replacement marker for a :before, :before_last or :after key" if !marker
7
+
8
+ file = File.get_file(file)
9
+
10
+ if place == :before_last
11
+ content = file.read
12
+ content = content.insert_before_last yield, marker
13
+ file.overwrite content
14
+ return
15
+ end
16
+
17
+ marker_found = file.has_content? marker
18
+ return nil if !marker_found
19
+
20
+ replace_in_file file, /(#{marker})/mi do |match|
21
+ place == :after ? "#{match}\n #{yield}" : "#{yield}\n #{match}"
22
+ end
23
+ true
24
+ end
25
+
26
+ def replace_in_file(file, regexp, *args, &block)
27
+ file = File.get_file(file)
28
+ content = file.read.gsub(regexp, *args, &block)
29
+ file.overwrite content
30
+ end
31
+ end
32
+
33
+ protected
34
+
35
+ def get_file file_name
36
+ case file_name
37
+ when PathString, String
38
+ File.new file_name
39
+ when File
40
+ file_name
41
+ else
42
+ raise ArgumentError, "Could not be converted to a File object: #{file_name}"
43
+ end
44
+ end
45
+
46
+ def get_filepath file
47
+ case file
48
+ when PathString, String
49
+ file
50
+ when File
51
+ file.path
52
+ else
53
+ raise ArgumentError, "Could not be converted to a file path: #{file_name}"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,17 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module OverwriteContent
4
+ def overwrite content=nil, &block
5
+ File.overwrite self.path, content, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ def overwrite file, content=nil, &block
10
+ File.open(get_filepath(file).path, 'w') do |f|
11
+ f.puts content ||= yield
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module RemoveContent
4
+ def remove_content options=nil, &block
5
+ opt_str = case options
6
+ when String
7
+ options
8
+ when Hash
9
+ content = options[:content] || options[:where]
10
+ raise ArgumentError, "Bad :content value in Hash" if !content || content.strip.empty?
11
+ content.strip
12
+ else
13
+ raise ArgumentError, "non-block argument must be either String or Hash with a :content option" if !block
14
+ end
15
+ content = block ? yield : opt_str
16
+
17
+ File.remove_content_from self.path, :content => content, :with => '', &block
18
+ end
19
+ alias_method :remove, :remove_content
20
+
21
+ module ClassMethods
22
+ def remove_from file_name, content=nil, &block
23
+ content ||= yield
24
+ replace_content_from file_name, :content => content, :with => '', &block
25
+ end
26
+
27
+ def remove_content_from file_name, options = {}, &block
28
+ replace_content_from file_name, options.merge(:with => ''), &block
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,45 @@
1
+ module SugarHigh
2
+ module FileMutate
3
+ module ReplaceContent
4
+ def replace_content options = {}, &block
5
+ File.replace_content_from self.path, options, &block
6
+ end
7
+
8
+ module ClassMethods
9
+ # replaces content found at replacement_expr with content resulting from yielding block
10
+ # File.replace_content_from 'myfile.txt', where => /HelloWorld/, with => 'GoodBye'
11
+ def replace_content_from file_name, options = {}, &block
12
+ replacement_expr = options[:where] || options[:content]
13
+ new_content = options[:with]
14
+
15
+ begin
16
+ replacement_expr = replacement_expr.to_regexp
17
+ rescue
18
+ raise ArgumentError, "Content to be replaced must be specified as either a String or Regexp in a :where or :content option"
19
+ end
20
+
21
+ file = get_file file_name
22
+
23
+ # get existing file content
24
+ content = file.read
25
+
26
+ # return nil if no mathing replacement found
27
+ return nil if !(content =~ replacement_expr)
28
+
29
+ new_content ||= yield if block
30
+
31
+ raise ArgumentError, "Content to be replaced with must be specified as a :with option or as a block" if !new_content
32
+
33
+ # remove content that matches expr, by replacing with empty
34
+ mutated_content = content.gsub replacement_expr, new_content
35
+
36
+ # write mutated content as new file
37
+ file.overwrite mutated_content
38
+
39
+ true # signal success!
40
+ end
41
+ alias_method :replace_content_in, :replace_content_from
42
+ end
43
+ end
44
+ end
45
+ end
@@ -12,6 +12,13 @@ class Object
12
12
  false
13
13
  end
14
14
 
15
+ def not_any_kind_of? *kinds
16
+ kinds.all_kinds.each do |kind|
17
+ return false if self.kind_of? kind
18
+ end
19
+ true
20
+ end
21
+
15
22
  def kind_of_label?
16
23
  self.any_kind_of? String, Symbol
17
24
  end
@@ -20,49 +27,7 @@ class Object
20
27
  self.any_kind_of? Symbols, Symbol
21
28
  end
22
29
  end
23
-
24
- module Enumerable
25
- def only_kinds_of? *kinds
26
- all?{|a| a.any_kind_of? *kinds }
27
- end
28
-
29
- def only_labels?
30
- all?{|a| a.kind_of_label? }
31
- end
32
-
33
- def select_kinds_of *kinds
34
- select{|a| a.any_kind_of? *kinds }
35
- end
36
-
37
- def select_labels
38
- select{|a| a.kind_of_label? }
39
- end
40
-
41
- def select_symbols
42
- select{|a| a.kind_of_symbol? }
43
- end
44
-
45
- def select_strings
46
- select_only :string
47
- end
48
-
49
- def select_only type
50
- const = type.kind_of_label? ? "#{type.to_s.camelize}".constantize : type
51
- select{|a| a.kind_of? const}
52
- end
53
-
54
- def all_kinds
55
- map do |a|
56
- case a
57
- when Kinds
58
- a.kinds
59
- else
60
- a if a.kind_of?(Module)
61
- end
62
- end.compact.uniq.flatten
63
- end
64
- end
65
-
30
+
66
31
  class Kinds
67
32
  attr_accessor :kinds
68
33
 
@@ -1,4 +1,9 @@
1
1
  class String
2
+ # remove prefixed '-' signs, then allow any letter, number, underscore '_' or dash '-'
3
+ def alpha_numeric
4
+ self.gsub(/^\-+/, '').gsub(/[^0-9a-zA-Z_\-]+/i, '')
5
+ end
6
+
2
7
  def insert_before_last str, marker = 'end'
3
8
  res = []
4
9
  found = false
@@ -3,3 +3,4 @@ require File.expand_path('../application', __FILE__)
3
3
 
4
4
  # Initialize the rails application
5
5
  Fixtures::Application.initialize!
6
+ hello
@@ -1,4 +1,19 @@
1
1
  class Abc
2
2
  def begin
3
3
  end
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
4
19
  end
@@ -0,0 +1 @@
1
+ {:with=>"New content"}
@@ -0,0 +1 @@
1
+ Hello Me
@@ -1,6 +1,22 @@
1
1
  Fixtures::Application.routes.draw do
2
2
 
3
3
 
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
4
20
 
5
21
 
6
22
 
@@ -3,19 +3,27 @@ require 'sugar-high/array'
3
3
 
4
4
  describe "SugarHigh" do
5
5
  describe "Array ext" do
6
+
6
7
  describe '#to_symbols' do
7
8
  it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
8
9
  [1, 'blip', [3, "hello"]].to_symbols.should == [:blip, :hello]
9
10
  end
10
11
 
11
12
  it "should translate nested array of numbers and strings into symbols only array, including numbers" do
12
- [[1, 'blip', [3, "hello"]]].to_symbols(:num).should == [:_1, :blip, :_3, :hello]
13
+ [[1, 'blip', [3, "hello"]]].to_symbols_num.should == [:_1, :blip, :_3, :hello]
13
14
  end
14
15
 
15
- it "should translate nested array of numbers and strings into strings only array" do
16
- [['blip', [3, :hello]]].to_strings.should == ['blip', 'hello']
16
+ it "should translate nested array of numbers and strings into symbols only array, including numbers" do
17
+ [[1, 'blip', [1, "hello"]]].to_symbols_uniq.should include :blip, :hello
17
18
  end
18
19
  end
20
+
21
+ describe '#to_symbols!' do
22
+ it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
23
+ x = [1, 'hello', 'blip', [3, "hello"]].to_symbols!
24
+ x.should include :hello, :blip
25
+ end
26
+ end
19
27
 
20
28
  describe '#to_strings' do
21
29
  it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
@@ -23,6 +31,13 @@ describe "SugarHigh" do
23
31
  end
24
32
  end
25
33
 
34
+ describe '#to_strings!' do
35
+ it "should translate nested array of numbers and strings into symbols only array, excluding numbers" do
36
+ x = [1, 'blip', [3, "hello"]].to_strings!
37
+ x.should == ['blip', 'hello']
38
+ end
39
+ end
40
+
26
41
  describe '#flat_uniq' do
27
42
  it "should flatten array, remove nils and make unique" do
28
43
  [1, 'blip', ['blip', nil, 'c'], nil].flat_uniq.should == [1, 'blip', 'c']
@@ -33,6 +48,32 @@ describe "SugarHigh" do
33
48
  end
34
49
  end
35
50
 
51
+ describe '#flat_uniq!' do
52
+ it "should flatten array, remove nils and make unique" do
53
+ x = [1, 'blip', ['blip', nil, 'c'], nil]
54
+ x.flat_uniq!
55
+ x.should == [1, 'blip', 'c']
56
+ end
57
+ end
58
+
59
+ describe '#sum' do
60
+ it "should add elements in array" do
61
+ [1, 2, 3].sum.should == 6
62
+ end
63
+ end
64
+
65
+ describe '#mean' do
66
+ it "should find mean of elements in array" do
67
+ [1, 2, 3].mean.should == 2
68
+ end
69
+ end
70
+
71
+ describe '#extract' do
72
+ it "should call method on each element in array" do
73
+ ["a", "ab", "abc"].extract(:size).mean.should == 2
74
+ end
75
+ end
76
+
36
77
  describe '#none?' do
37
78
  it "should be none if no real values in array" do
38
79
  [nil, nil].none?.should be_true