fort 1.1.0 → 2.0.0

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.
@@ -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