fort 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,5 +3,5 @@ require 'rake/testtask'
3
3
 
4
4
  ::Rake::TestTask.new do |t|
5
5
  t.libs = ['lib', 'test'].map{|dir| File.join(__DIR__, dir)}
6
- t.pattern = "test/**/test_*.rb"
6
+ t.pattern = "test/**/*_test.rb"
7
7
  end
data/fort.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.name = gem_name
11
11
  s.summary = "Library for Fortran 90 and newer."
12
12
  s.version = ::Fort::VERSION
13
- s.add_runtime_dependency 'ruby_patch', '~> 1.1'
13
+ s.add_runtime_dependency 'ruby_patch', '>= 1.1.0'
14
14
  s.add_development_dependency 'pry', '~> 0.9'
15
15
  s.author = 'kshramt'
16
16
  s.description = "Ruby library for Fortran 90 and newer."
data/lib/fort/type.rb CHANGED
@@ -1,43 +1,147 @@
1
- module Fort
2
- class Type
3
- require 'ruby_patch'
4
- extend ::RubyPatch::AutoLoad
1
+ module ::Fort::Type
2
+ USE_ISO_FORTRAN_ENV = "use, intrinsic:: iso_fortran_env, only: INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128"
3
+ DIM_RANGE = (0..7)
5
4
 
6
- USE_ISO_FORTRAN_ENV = "use, intrinsic:: iso_fortran_env, only: INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128"
5
+ module Providable
6
+ ID_GENERATOR = lambda{
7
+ id_number = '0'
8
+ lambda{'T' + id_number.next!}}.call
7
9
 
8
- attr_reader :dim, :stem
10
+ def provide(params = {})
11
+ @params_default ||= {}
12
+ @memo ||= {}
13
+ params_for_new = @params_default.merge(params)
14
+ @memo[params_for_new] ||= new(::Fort::Type::Providable::ID_GENERATOR.call, params_for_new)
15
+ end
9
16
 
10
- def initialize(dim = 0)
11
- @dim = dim
12
- @stem = self.class.to_s.split('::').last.sub(/Type\z/, '')
17
+ # @param [Hash<Array>] params
18
+ def multi_provide(params = {})
19
+ @params_default_for_multi_provide ||= {}
20
+ params_for_new = @params_default_for_multi_provide.merge(params)
21
+ product_all(params_for_new.values.map{|val| Array(val)})\
22
+ .map{|values| Hash[params_for_new.keys.zip(values)]}\
23
+ .map{|hash| provide(hash)}
13
24
  end
14
25
 
26
+ private
27
+
28
+ def product_all(array)
29
+ return array if array.size <= 1
30
+ first = array.first
31
+ rest = array[1..-1]
32
+ first.product(*rest)
33
+ end
34
+ end
35
+
36
+ class Base
37
+ extend Providable
38
+
39
+ def initialize(id, params = {})
40
+ @id = id
41
+ @dim = params.fetch(:dim)
42
+ raise ArgumentError, "@dim: #{@dim}" if @dim < 0
43
+ @type = self.class.to_s.split('::').last
44
+ end
45
+ attr_reader :id, :dim, :type
46
+
15
47
  def to_s
16
- "#{@stem}Dim#{dim}"
48
+ "#{@type}Dim#{@dim}"
17
49
  end
18
50
 
19
51
  def declare
52
+ @type + dimension()
53
+ end
54
+
55
+ def parenthesis
20
56
  if @dim >= 1
21
- ", dimension#{self.parenthesis}"
57
+ "(" + colons() + ")"
22
58
  else
23
- ""
59
+ ''
24
60
  end
25
61
  end
26
62
 
27
- def colons
28
- ([':']*@dim).join(', ')
29
- end
63
+ private
30
64
 
31
- def parenthesis
65
+ def dimension
32
66
  if @dim >= 1
33
- "(#{self.colons})"
67
+ ", dimension" + parenthesis()
34
68
  else
35
69
  ''
36
70
  end
37
71
  end
38
72
 
39
- def format
40
- "#{@dim}"
73
+ def colons
74
+ if @dim >= 1
75
+ ([':']*@dim).join(', ')
76
+ end
77
+ end
78
+ end
79
+
80
+ class Numeric < Base
81
+ def initialize(id, params = {})
82
+ super
83
+ @kind = params.fetch(:kind)
84
+ end
85
+ attr_reader :kind
86
+
87
+ def to_s
88
+ super + "Kind#{@kind}"
89
+ end
90
+
91
+ def declare
92
+ "#{@type}(kind = #{@kind})#{dimension()}"
41
93
  end
42
94
  end
95
+
96
+ class Integer < Numeric
97
+ KINDS = [:INT8, :INT16, :INT32, :INT64]
98
+ @params_default = {dim: 0, kind: :INT32}
99
+ @params_default_for_multi_provide = {dim: ::Fort::Type::DIM_RANGE, kind: KINDS}
100
+ end
101
+
102
+ class Real < Numeric
103
+ KINDS = [:REAL32, :REAL64, :REAL128]
104
+ @params_default = {dim: 0, kind: :REAL32}
105
+ @params_default_for_multi_provide = {dim: ::Fort::Type::DIM_RANGE, kind: KINDS}
106
+ end
107
+
108
+ class Complex < Numeric
109
+ KINDS = [:REAL32, :REAL64, :REAL128]
110
+ @params_default = {dim: 0, kind: :REAL32}
111
+ @params_default_for_multi_provide = {dim: ::Fort::Type::DIM_RANGE, kind: KINDS}
112
+ end
113
+
114
+ class Character < Base
115
+ @params_default = {dim: 0, len: :*}
116
+ @params_default_for_multi_provide = {dim: ::Fort::Type::DIM_RANGE, len: :*}
117
+
118
+ def initialize(id, params)
119
+ super
120
+ @len = params.fetch(:len)
121
+ end
122
+ attr_reader :len
123
+
124
+ def to_s
125
+ super + "Len#{len_str()}"
126
+ end
127
+
128
+ def declare
129
+ "#{@type}(len = #{@len})#{dimension()}"
130
+ end
131
+
132
+ private
133
+
134
+ def len_str
135
+ if @len == :*
136
+ 'Ast'
137
+ else
138
+ @len
139
+ end
140
+ end
141
+ end
142
+
143
+ class Logical < Base
144
+ @params_default = {dim: 0}
145
+ @params_default_for_multi_provide = {dim: ::Fort::Type::DIM_RANGE}
146
+ end
43
147
  end
data/lib/fort/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fort
2
- VERSION = '1.1.0'
2
+ VERSION = '2.0.0'
3
3
  end
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ class TypeTest < ::MiniTest::Unit::TestCase
4
+ T = ::Fort::Type
5
+
6
+ def test_different_ids_for_different_types
7
+ assert(not(T::Real.provide(dim: 1, kind: 'REAL32').id == T::Complex.provide(dim: 1, kind: 'REAL32').id))
8
+ end
9
+
10
+ def test_different_ids_for_different_hashs
11
+ assert(not(T::Real.provide(dim: 1, kind: 'REAL32').id == T::Real.provide(dim: 1, kind: 'REAL64').id))
12
+ assert(not(T::Real.provide(dim: 1, kind: 'REAL32').id == T::Real.provide(dim: 1, kind: 'REAL32', dummy: :dummy).id))
13
+ end
14
+
15
+ def test_same_id_for_same_type_and_hash
16
+ assert(T::Real.provide(dim: 1, kind: 'REAL32').id == T::Real.provide(kind: 'REAL32', dim: 1).id)
17
+ end
18
+
19
+ def test_base
20
+ assert_equal('BaseDim3', T::Base.provide(dim: 3).to_s)
21
+ assert_equal('Base, dimension(:, :, :)', T::Base.provide(dim: 3).declare)
22
+ end
23
+
24
+ def test_numeric
25
+ t = T::Numeric.provide(dim: 0, kind: 1)
26
+ assert_equal('NumericDim0Kind1', t.to_s)
27
+ assert_equal('Numeric(kind = 1)', t.declare)
28
+ end
29
+
30
+ def test_multi_provide
31
+ assert_equal(21, T::Numeric.multi_provide(dim: [1, 2, 3, 4, 5, 6, 7], kind: ['REAL32', 'REAL64', 'REAL128']).size)
32
+ end
33
+
34
+ def test_integer
35
+ t = T::Integer.provide(dim: 7, kind: :INT32)
36
+ assert_equal('IntegerDim7KindINT32', t.to_s)
37
+ assert_equal('Integer(kind = INT32), dimension(:, :, :, :, :, :, :)', t.declare)
38
+ end
39
+
40
+ def test_real
41
+ t = T::Real.provide(dim: 1, kind: :REAL128)
42
+ assert_equal('RealDim1KindREAL128', t.to_s)
43
+ assert_equal('Real(kind = REAL128), dimension(:)', t.declare)
44
+ end
45
+
46
+ def test_complex
47
+ t = T::Complex.provide(dim: 1, kind: :REAL128)
48
+ assert_equal('ComplexDim1KindREAL128', t.to_s)
49
+ assert_equal('Complex(kind = REAL128), dimension(:)', t.declare)
50
+ end
51
+
52
+ def test_character
53
+ t = T::Character.provide(dim: 1, len: 2)
54
+ assert_equal('CharacterDim1Len2', t.to_s)
55
+ assert_equal('Character(len = 2), dimension(:)', t.declare)
56
+ end
57
+
58
+ def test_character_asterisk
59
+ t = T::Character.provide(dim: 1, len: :*)
60
+ assert_equal('CharacterDim1LenAst', t.to_s)
61
+ assert_equal('Character(len = *), dimension(:)', t.declare)
62
+ end
63
+
64
+ def test_logical
65
+ t = T::Logical.provide(dim: 1)
66
+ assert_equal('LogicalDim1', t.to_s)
67
+ assert_equal('Logical, dimension(:)', t.declare)
68
+ end
69
+ end
@@ -1,3 +1,4 @@
1
+ require 'minitest/pride'
1
2
  require 'minitest/autorun'
2
3
 
3
4
  require 'fort'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fort
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-11 00:00:00.000000000 Z
12
+ date: 2012-12-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ruby_patch
16
- requirement: &69161810 !ruby/object:Gem::Requirement
16
+ requirement: &2156749900 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: '1.1'
21
+ version: 1.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *69161810
24
+ version_requirements: *2156749900
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: pry
27
- requirement: &69176500 !ruby/object:Gem::Requirement
27
+ requirement: &2156771300 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,13 +32,14 @@ dependencies:
32
32
  version: '0.9'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *69176500
35
+ version_requirements: *2156771300
36
36
  description: Ruby library for Fortran 90 and newer.
37
37
  email:
38
38
  executables: []
39
39
  extensions: []
40
40
  extra_rdoc_files: []
41
41
  files:
42
+ - Rakefile
42
43
  - fort.gemspec
43
44
  - lib/fort.rb
44
45
  - lib/fort/src.rb
@@ -46,26 +47,13 @@ files:
46
47
  - lib/fort/src/code/depended_module.rb
47
48
  - lib/fort/src/code/program_unit.rb
48
49
  - lib/fort/type.rb
49
- - lib/fort/type/character_type.rb
50
- - lib/fort/type/complex_type.rb
51
- - lib/fort/type/integer_type.rb
52
- - lib/fort/type/logical_type.rb
53
- - lib/fort/type/numeric_type.rb
54
- - lib/fort/type/real_type.rb
55
50
  - lib/fort/version.rb
56
- - rakefile
57
51
  - spec/fort/src/code_spec.rb
58
52
  - spec/fort/src/lib_test.f90
59
53
  - spec/fort/src/test.f90
60
54
  - spec/fort/src/test_clean_code.f90
61
- - test/fort/test_type.rb
62
- - test/fort/type/test_character_type.rb
63
- - test/fort/type/test_complex_type.rb
64
- - test/fort/type/test_integer_type.rb
65
- - test/fort/type/test_logical_type.rb
66
- - test/fort/type/test_real_type.rb
67
- - test/helper_for_test.rb
68
- - test/test_fort.rb
55
+ - test/fort/type_test.rb
56
+ - test/test_helper.rb
69
57
  homepage:
70
58
  licenses: []
71
59
  post_install_message:
@@ -86,16 +74,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
74
  version: '0'
87
75
  requirements: []
88
76
  rubyforge_project:
89
- rubygems_version: 1.8.11
77
+ rubygems_version: 1.8.15
90
78
  signing_key:
91
79
  specification_version: 3
92
80
  summary: Library for Fortran 90 and newer.
93
81
  test_files:
94
- - test/fort/test_type.rb
95
- - test/fort/type/test_character_type.rb
96
- - test/fort/type/test_complex_type.rb
97
- - test/fort/type/test_integer_type.rb
98
- - test/fort/type/test_logical_type.rb
99
- - test/fort/type/test_real_type.rb
100
- - test/test_fort.rb
82
+ - test/test_helper.rb
101
83
  has_rdoc:
@@ -1,31 +0,0 @@
1
- module Fort
2
- class Type
3
- class CharacterType < self
4
- require 'ruby_patch'
5
- extend ::RubyPatch::AutoLoad
6
-
7
- attr_reader :len
8
-
9
- def initialize(dim = 0, len = 1)
10
- super(dim)
11
- @len = len
12
- @len_suf = case @len
13
- when '*'
14
- 'Ast'
15
- when ':'
16
- 'Colon'
17
- else
18
- @len
19
- end
20
- end
21
-
22
- def to_s
23
- "#{super}Len#{@len_suf}"
24
- end
25
-
26
- def declare
27
- "#{@stem}(len = #{@len})#{super}"
28
- end
29
- end
30
- end
31
- end
@@ -1,15 +0,0 @@
1
- module Fort
2
- class Type
3
- class ComplexType < ::Fort::Type::NumericType
4
- require 'ruby_patch'
5
- extend ::RubyPatch::AutoLoad
6
-
7
- attr_reader :kind, :kind_const
8
-
9
- def initialize(dim = 0, kind = 32)
10
- super
11
- @kind_const = "REAL#{@kind}"
12
- end
13
- end
14
- end
15
- end
@@ -1,13 +0,0 @@
1
- module Fort
2
- class Type
3
- class IntegerType < ::Fort::Type::NumericType
4
- require 'ruby_patch'
5
- extend ::RubyPatch::AutoLoad
6
-
7
- def initialize(dim = 0, kind = 32)
8
- super
9
- @kind_const = "INT#{@kind}"
10
- end
11
- end
12
- end
13
- end
@@ -1,16 +0,0 @@
1
- module Fort
2
- class Type
3
- class LogicalType < self
4
- require 'ruby_patch'
5
- extend ::RubyPatch::AutoLoad
6
-
7
- def initialize(dim = 0)
8
- super
9
- end
10
-
11
- def declare
12
- "#{@stem}#{super}"
13
- end
14
- end
15
- end
16
- end
@@ -1,24 +0,0 @@
1
- module Fort
2
- class Type
3
- class NumericType < ::Fort::Type
4
- require 'ruby_patch'
5
- extend ::RubyPatch::AutoLoad
6
-
7
- attr_reader :kind, :kind_const
8
-
9
- def initialize(dim = 0, kind = 32)
10
- super(dim)
11
- @kind = kind
12
- @kind_const = nil
13
- end
14
-
15
- def to_s
16
- "#{super}Kind#{@kind}"
17
- end
18
-
19
- def declare
20
- "#{@stem}(#{@kind_const})#{super}"
21
- end
22
- end
23
- end
24
- end
@@ -1,15 +0,0 @@
1
- module Fort
2
- class Type
3
- class RealType < ::Fort::Type::NumericType
4
- require 'ruby_patch'
5
- extend ::RubyPatch::AutoLoad
6
-
7
- attr_reader :kind, :kind_const
8
-
9
- def initialize(dim = 0, kind = 32)
10
- super
11
- @kind_const = "REAL#{@kind}"
12
- end
13
- end
14
- end
15
- end
@@ -1,7 +0,0 @@
1
- require 'helper_for_test'
2
-
3
- class TestType < ::MiniTest::Unit::TestCase
4
- def test_USE_ISO_FORTRAN_ENV
5
- assert(::Fort::Type::USE_ISO_FORTRAN_ENV)
6
- end
7
- end
@@ -1,21 +0,0 @@
1
- require 'helper_for_test'
2
-
3
- class TestCharacterType < ::MiniTest::Unit::TestCase
4
- def setup
5
- @cAst_0 = ::Fort::Type::CharacterType.new(0, '*')
6
- @cColon_1 = ::Fort::Type::CharacterType.new(1, ':')
7
- @c3_2 = ::Fort::Type::CharacterType.new(2, 3)
8
- end
9
-
10
- def test_to_s
11
- assert_equal(@cAst_0.to_s, "CharacterDim0LenAst")
12
- assert_equal(@cColon_1.to_s, "CharacterDim1LenColon")
13
- assert_equal(@c3_2.to_s, "CharacterDim2Len3")
14
- end
15
-
16
- def test_declare
17
- assert_equal(@cAst_0.declare, "Character(len = *)")
18
- assert_equal(@cColon_1.declare, "Character(len = :), dimension(:)")
19
- assert_equal(@c3_2.declare, "Character(len = 3), dimension(:, :)")
20
- end
21
- end
@@ -1,18 +0,0 @@
1
- require 'helper_for_test'
2
-
3
- class TestComplexType < ::MiniTest::Unit::TestCase
4
- def setup
5
- @d_0 = ::Fort::Type::ComplexType.new(0, 64)
6
- @s_2 = ::Fort::Type::ComplexType.new(2, 32)
7
- end
8
-
9
- def test_to_s
10
- assert_equal(@d_0.to_s, "ComplexDim0Kind64")
11
- assert_equal(@s_2.to_s, "ComplexDim2Kind32")
12
- end
13
-
14
- def test_declare
15
- assert_equal(@d_0.declare, "Complex(REAL64)")
16
- assert_equal(@s_2.declare, "Complex(REAL32), dimension(:, :)")
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- require 'helper_for_test'
2
-
3
- class TestIntegerType < ::MiniTest::Unit::TestCase
4
- def setup
5
- @d_0 = ::Fort::Type::IntegerType.new(0, 64)
6
- @s_2 = ::Fort::Type::IntegerType.new(2, 32)
7
- end
8
-
9
- def test_to_s
10
- assert_equal(@d_0.to_s, "IntegerDim0Kind64")
11
- assert_equal(@s_2.to_s, "IntegerDim2Kind32")
12
- end
13
-
14
- def test_declare
15
- assert_equal(@d_0.declare, "Integer(INT64)")
16
- assert_equal(@s_2.declare, "Integer(INT32), dimension(:, :)")
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- require 'helper_for_test'
2
-
3
- class TestLogicalType < ::MiniTest::Unit::TestCase
4
- def setup
5
- @l0 = ::Fort::Type::LogicalType.new(0)
6
- @l2 = ::Fort::Type::LogicalType.new(2)
7
- end
8
-
9
- def test_to_s
10
- assert_equal(@l0.to_s, "LogicalDim0")
11
- assert_equal(@l2.to_s, "LogicalDim2")
12
- end
13
-
14
- def test_declare
15
- assert_equal(@l0.declare, "Logical")
16
- assert_equal(@l2.declare, "Logical, dimension(:, :)")
17
- end
18
- end
@@ -1,18 +0,0 @@
1
- require 'helper_for_test'
2
-
3
- class TestRealType < ::MiniTest::Unit::TestCase
4
- def setup
5
- @d_0 = ::Fort::Type::RealType.new(0, 64)
6
- @s_2 = ::Fort::Type::RealType.new(2, 32)
7
- end
8
-
9
- def test_to_s
10
- assert_equal(@d_0.to_s, "RealDim0Kind64")
11
- assert_equal(@s_2.to_s, "RealDim2Kind32")
12
- end
13
-
14
- def test_declare
15
- assert_equal(@d_0.declare, "Real(REAL64)")
16
- assert_equal(@s_2.declare, "Real(REAL32), dimension(:, :)")
17
- end
18
- end
data/test/test_fort.rb DELETED
@@ -1,7 +0,0 @@
1
- require 'helper_for_test'
2
-
3
- class TestFort < ::MiniTest::Unit::TestCase
4
- def test_VERSION
5
- assert(::Fort::VERSION)
6
- end
7
- end