method_source-expressions 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in method_source-expressions.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Hashrocket Workstation
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,25 @@
1
+ # MethodSource::Expressions
2
+
3
+ Small extension to [method_source](https://github.com/banister/method_source). It adds `#expressions` to the Proc class. This method returns a hash of expressions defined inside a given Proc/Lambda. Each expression object knows its range of line numbers, its source, and its source_location.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'method_source-expressions'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install method_source-expressions
18
+
19
+ ## Contributing
20
+
21
+ 1. Fork it
22
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
23
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
24
+ 4. Push to the branch (`git push origin my-new-feature`)
25
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,12 @@
1
+ require "method_source"
2
+ require "method_source-expressions/version"
3
+ require "method_source-expressions/expression"
4
+ require "method_source-expressions/proc_extensions"
5
+ require "method_source-expressions/expression_collection"
6
+
7
+ module MethodSource::Expressions
8
+ end
9
+
10
+ class Proc
11
+ include MethodSource::Expressions::ProcExtensions
12
+ end
@@ -0,0 +1,39 @@
1
+ module MethodSource::Expressions
2
+ class Expression
3
+ attr_reader :source, :location
4
+
5
+ def initialize(options)
6
+ @source = options.fetch(:source)
7
+ @line_number = options.fetch(:line_number)
8
+ @location = options.fetch(:location)
9
+ end
10
+
11
+ def range
12
+ is_multi_line? ? multi_line_expression_range : line_number..line_number
13
+ end
14
+
15
+ def within(other_expression)
16
+ range.all? {|i| other_expression.range.include?(i) } &&
17
+ range != other_expression.range
18
+ end
19
+
20
+ private
21
+
22
+ def line_number
23
+ @line_number.to_i
24
+ end
25
+
26
+ def is_multi_line?
27
+ expression_length > 1
28
+ end
29
+
30
+ def multi_line_expression_range
31
+ line_number..(expression_length + line_number - 1)
32
+ end
33
+
34
+ def expression_length
35
+ source.split("\n").length
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ module MethodSource::Expressions
2
+ class ExpressionCollection
3
+ attr_reader :expressions
4
+
5
+ def initialize(expressions)
6
+ @top_node, *@expressions = expressions
7
+ end
8
+
9
+ def direct_descendents(collection=expressions)
10
+ child_expressions.map{ |child| expression_or_collection(child) }
11
+ end
12
+
13
+ def source
14
+ @top_node.source
15
+ end
16
+
17
+ private
18
+ attr_reader :top_node
19
+
20
+ def child_expressions
21
+ expressions.reject do |outer|
22
+ expressions.any? {|inner| outer.within(inner) }
23
+ end
24
+ end
25
+
26
+ def expression_or_collection(expression)
27
+ sub_children = expressions.select{|e| e.within(expression) }
28
+
29
+ if sub_children.length > 0
30
+ self.class.new([expression, *sub_children])
31
+ else
32
+ expression
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ module MethodSource::Expressions
2
+ module ProcExtensions
3
+ def expressions
4
+ ec = MethodSource::Expressions::ExpressionCollection.new(collection)
5
+ ec.direct_descendents
6
+ end
7
+
8
+ private
9
+
10
+ def collection
11
+ source_range.map do |line_number|
12
+ expression = create_expression(line_number)
13
+ expression if expression.source
14
+ end.compact
15
+ end
16
+
17
+ def source_range
18
+ starting_line..(starting_line + length)
19
+ end
20
+
21
+ def create_expression(line_number)
22
+ expression = soft_extract(line_number)
23
+ MethodSource::Expressions::Expression.new(source: expression, line_number: line_number, location: source_location.first)
24
+ end
25
+
26
+ def soft_extract(line_number)
27
+ MethodSource.expression_at(File.read(source_location.first),line_number).strip
28
+ rescue SyntaxError
29
+ false
30
+ end
31
+
32
+ def length
33
+ @length ||= source.split("\n").length
34
+ end
35
+
36
+ def starting_line
37
+ source_location[1]
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ module MethodSource
2
+ module Expressions
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'method_source-expressions/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "method_source-expressions"
8
+ gem.version = MethodSource::Expressions::VERSION
9
+ gem.authors = ["Jonathan Jackson"]
10
+ gem.email = ["dev@hashrocket.com"]
11
+ gem.description = %q{Ruby doesn't like you arbitrarily deciding when to execute expressions. Take control with this gem. It's a simple way to mix in additional behavior into Proc that will allow you to make custom DSL's that will change how ruby deals with expressions.}
12
+ gem.summary = %q{Expression parsing addition to the method_source gem}
13
+ gem.homepage = "https://github.com/rondale-sc/method_source-expressions"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency "method_source"
21
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe MethodSource::Expressions::ExpressionCollection do
4
+ let(:blk) do
5
+ Proc.new do
6
+ puts "something"
7
+ Proc.new do
8
+ puts "otherthing"
9
+ end
10
+ end
11
+ end
12
+
13
+ describe "expressions_at_nesting" do
14
+ it "first item is" do
15
+ expect(blk.expressions.first.source).to eql("puts \"something\"")
16
+ end
17
+
18
+ it "last item is" do
19
+ expected_value ="Proc.new do\n puts \"otherthing\"\n end"
20
+ expect(blk.expressions.last.source).to eql(expected_value)
21
+ end
22
+
23
+ it "can be used on its returned items" do
24
+ last_item = blk.expressions.last
25
+ expect(last_item.expressions.first.source).to eql('puts "otherthing"')
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe MethodSource::Expressions::Expression do
4
+ let(:options) { {source: "expr", line_number: "1", location: "/somepath"} }
5
+ subject(:expression) { described_class.new(options) }
6
+
7
+ it "exposes its source" do
8
+ expect(expression.source).to eq("expr")
9
+ end
10
+
11
+ it "exposes its line_number" do
12
+ expect(expression.location).to eq("/somepath")
13
+ end
14
+
15
+ context "#range" do
16
+ it "knows its range representation" do
17
+ expect(expression.range).to eq(1..1)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ require "spec_helper"
2
+
3
+ describe MethodSource::Expressions::ProcExtensions do
4
+
5
+ let(:blk) do
6
+ Proc.new do
7
+ puts "something"
8
+ Proc.new do
9
+ puts "otherthing"
10
+ end
11
+ end
12
+ end
13
+
14
+ describe "#expressions" do
15
+ it "returns a hash with values of expression objects" do
16
+ result = blk.expressions.all? do |v|
17
+ v.class == MethodSource::Expressions::Expression ||
18
+ v.class == MethodSource::Expressions::ExpressionCollection
19
+ end
20
+ expect(result).to be_true
21
+ end
22
+
23
+ it "returns expressions" do
24
+ expect(blk.expressions.first.source).to eq("puts \"something\"")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,8 @@
1
+ require 'method_source-expressions'
2
+
3
+ RSpec.configure do |config|
4
+ config.treat_symbols_as_metadata_keys_with_true_values = true
5
+ config.run_all_when_everything_filtered = true
6
+ config.filter_run :focus
7
+ config.order = "random"
8
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: method_source-expressions
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jonathan Jackson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-08-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: method_source
16
+ prerelease: false
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ none: false
23
+ type: :runtime
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ! '>='
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ none: false
30
+ description: Ruby doesn't like you arbitrarily deciding when to execute expressions. Take
31
+ control with this gem. It's a simple way to mix in additional behavior into Proc
32
+ that will allow you to make custom DSL's that will change how ruby deals with expressions.
33
+ email:
34
+ - dev@hashrocket.com
35
+ executables: []
36
+ extensions: []
37
+ extra_rdoc_files: []
38
+ files:
39
+ - .gitignore
40
+ - .rspec
41
+ - Gemfile
42
+ - LICENSE.txt
43
+ - README.md
44
+ - Rakefile
45
+ - lib/method_source-expressions.rb
46
+ - lib/method_source-expressions/expression.rb
47
+ - lib/method_source-expressions/expression_collection.rb
48
+ - lib/method_source-expressions/proc_extensions.rb
49
+ - lib/method_source-expressions/version.rb
50
+ - method_source-expressions.gemspec
51
+ - spec/method_source-expressions/expression_collection_spec.rb
52
+ - spec/method_source-expressions/expression_spec.rb
53
+ - spec/method_source-expressions/proc_extensions_spec.rb
54
+ - spec/spec_helper.rb
55
+ homepage: https://github.com/rondale-sc/method_source-expressions
56
+ licenses: []
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ none: false
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ none: false
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 1.8.24
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: Expression parsing addition to the method_source gem
79
+ test_files:
80
+ - spec/method_source-expressions/expression_collection_spec.rb
81
+ - spec/method_source-expressions/expression_spec.rb
82
+ - spec/method_source-expressions/proc_extensions_spec.rb
83
+ - spec/spec_helper.rb
84
+ has_rdoc: