pfa 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +46 -0
- data/README.md +156 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/assets/Manuel/ImageMagick.md +155 -0
- data/lib/assets/Manuel/Manuel-developer.md +50 -0
- data/lib/assets/fr/PFA_ABSOLUTE_DATA.yaml +212 -0
- data/lib/assets/fr/errors.yaml +107 -0
- data/lib/pfa/absolute_pfa.rb +25 -0
- data/lib/pfa/any_builder.rb +28 -0
- data/lib/pfa/constants.rb +24 -0
- data/lib/pfa/errors_manager.rb +14 -0
- data/lib/pfa/imagemagick_module.rb +551 -0
- data/lib/pfa/img_builder.rb +198 -0
- data/lib/pfa/node_time.rb +188 -0
- data/lib/pfa/pfa_element_module.rb +30 -0
- data/lib/pfa/relative_pfa.rb +191 -0
- data/lib/pfa/relative_pfa_datatime.rb +27 -0
- data/lib/pfa/relative_pfa_node.rb +238 -0
- data/lib/pfa/temporal_methods.rb +69 -0
- data/lib/pfa/version.rb +3 -0
- data/lib/pfa.rb +20 -0
- data/pfa.gemspec +34 -0
- data/pfa.jpg +0 -0
- metadata +147 -0
@@ -0,0 +1,238 @@
|
|
1
|
+
require_relative 'imagemagick_module'
|
2
|
+
require_relative 'pfa_element_module'
|
3
|
+
|
4
|
+
module PFA
|
5
|
+
class RelativePFA
|
6
|
+
class Node
|
7
|
+
|
8
|
+
include PFAElementModule
|
9
|
+
include MagickPFA
|
10
|
+
|
11
|
+
attr_reader :pfa, :key
|
12
|
+
|
13
|
+
attr_reader :description
|
14
|
+
|
15
|
+
def initialize(pfa, key, value = nil)
|
16
|
+
@pfa = pfa
|
17
|
+
@key = key
|
18
|
+
parse_raw_value(value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def code_image_magick
|
22
|
+
pfa.img_builder.code_image_magick
|
23
|
+
end
|
24
|
+
|
25
|
+
# --- MÉTHODES TEMPORELLES ---
|
26
|
+
|
27
|
+
# -- Temps relatifs --
|
28
|
+
|
29
|
+
# [PFA::NTime] Temps (relatif) de début du nœud
|
30
|
+
# @note : défini à l'instantiation
|
31
|
+
def start_at
|
32
|
+
@start_at
|
33
|
+
end
|
34
|
+
|
35
|
+
# [PFA::NTime] Temps (relatif) de fin du noeud
|
36
|
+
def end_at
|
37
|
+
@end_at ||= start_at + duration # attention : 2 NTime
|
38
|
+
end
|
39
|
+
|
40
|
+
# \PFA::NTime Durée
|
41
|
+
# Soit elle a été explicitement définie en renseignant le noeud,
|
42
|
+
# soit on lui donne la valeur de la durée absolue.
|
43
|
+
# Sauf pour les actes, qui possèdent leur propre calcul, étant
|
44
|
+
# donné qu'ils dépendent d'autres éléments
|
45
|
+
def duration
|
46
|
+
@duration ||= begin
|
47
|
+
if type == :part
|
48
|
+
case key
|
49
|
+
when :exposition then @end_at = pfa.developpement_part1.start_at
|
50
|
+
when :developpement_part1 then @end_at = pfa.developpement_part2.start_at
|
51
|
+
when :developpement_part2 then @end_at = pfa.denouement.start_at
|
52
|
+
when :denouement then @end_at = PFA::NTime.new(pfa.duration.to_i)
|
53
|
+
end
|
54
|
+
end_at - start_at
|
55
|
+
else
|
56
|
+
abs_duration
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# [String] Horloge du temps (relatif) de départ
|
62
|
+
def horloge
|
63
|
+
@horloge ||= start_at.to_horloge
|
64
|
+
end
|
65
|
+
|
66
|
+
# -- Temps Absolus --
|
67
|
+
|
68
|
+
# [PFA::NTime] Temps absolu (idéal) de départ
|
69
|
+
def abs_start
|
70
|
+
@abs_start ||= calc_with_fraction_of_duree(abs_data[:abs_start])
|
71
|
+
end
|
72
|
+
|
73
|
+
def abs_end
|
74
|
+
@abs_end ||= abs_start + abs_duration
|
75
|
+
end
|
76
|
+
|
77
|
+
def abs_duration
|
78
|
+
@abs_duration ||= calc_with_fraction_of_duree(abs_data[:abs_duration])
|
79
|
+
end
|
80
|
+
|
81
|
+
# --- MÉTHODES DE DIMENSIONNEMENT ---
|
82
|
+
|
83
|
+
# -- Dimensions Absolues --
|
84
|
+
|
85
|
+
def abs_left
|
86
|
+
@abs_left ||= abs_start.to_px(pfa)#.tap { |n| dbg "abs_left: #{n}".bleu}
|
87
|
+
end
|
88
|
+
|
89
|
+
def abs_width
|
90
|
+
@abs_width ||= abs_duration.to_px(pfa)
|
91
|
+
end
|
92
|
+
|
93
|
+
def abs_right
|
94
|
+
@abs_right ||= begin
|
95
|
+
if id == 'DE' # denouement
|
96
|
+
# Pour que le trait du dénouement soit dans l'image
|
97
|
+
abs_left + abs_width - 2
|
98
|
+
else
|
99
|
+
abs_left + abs_width
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def abs_top
|
105
|
+
@abs_top ||= MagickPFA::ABS_TOPS[type]
|
106
|
+
end
|
107
|
+
|
108
|
+
def abs_bottom
|
109
|
+
@abs_bottom ||= MagickPFA::ABS_BOTTOMS[type]
|
110
|
+
end
|
111
|
+
|
112
|
+
def abs_height
|
113
|
+
@abs_height ||= MagickPFA::HEIGHTS[type]
|
114
|
+
end
|
115
|
+
|
116
|
+
def img_abs_surface
|
117
|
+
@img_abs_surface ||= "#{abs_width}x#{abs_height}"
|
118
|
+
end
|
119
|
+
|
120
|
+
# -- Dimensions Relatives --
|
121
|
+
|
122
|
+
def left
|
123
|
+
@left ||= start_at.to_px(pfa)
|
124
|
+
end
|
125
|
+
|
126
|
+
def width
|
127
|
+
@width ||= duration.to_px(pfa)
|
128
|
+
end
|
129
|
+
|
130
|
+
def right
|
131
|
+
@right ||= begin
|
132
|
+
if id == 'DE' # denouement
|
133
|
+
# Pour que le trait du dénouement soit dans l'image
|
134
|
+
left + width - 2
|
135
|
+
else
|
136
|
+
left + width
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def top
|
142
|
+
@top ||= MagickPFA::TOPS[type]
|
143
|
+
end
|
144
|
+
|
145
|
+
def bottom
|
146
|
+
@bottom ||= MagickPFA::BOTTOMS[type]
|
147
|
+
end
|
148
|
+
|
149
|
+
# Hauteur de la boite pour écrire le texte
|
150
|
+
def height
|
151
|
+
@height ||= (MagickPFA::HEIGHTS[type]).to_i
|
152
|
+
end
|
153
|
+
|
154
|
+
def img_surface
|
155
|
+
@img_surface ||= "#{width}x#{height}"
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
# --- Predicate Methods ---
|
160
|
+
|
161
|
+
# @return [Bool] true si le nœud courant est après
|
162
|
+
# le nœud [RelativePFA::Node] +node+
|
163
|
+
#
|
164
|
+
def after?(node)
|
165
|
+
# dbg "node = #{node.inspect}".orange
|
166
|
+
return start_at > node.start_at
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
# --- Absolute Data ---
|
171
|
+
|
172
|
+
# \Hash Données absolues du nœud
|
173
|
+
def abs_data
|
174
|
+
@abs_data ||= AbsolutePFA.data[:nodes][key]
|
175
|
+
end
|
176
|
+
|
177
|
+
def mark
|
178
|
+
abs_data[:hname]
|
179
|
+
end
|
180
|
+
|
181
|
+
def type
|
182
|
+
abs_data[:type].to_sym
|
183
|
+
end
|
184
|
+
|
185
|
+
def id
|
186
|
+
abs_data[:id]
|
187
|
+
end
|
188
|
+
|
189
|
+
# --- Calculated Values (dimensions) ---
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
# -- Des valeurs qui peuvent servir… --
|
194
|
+
def demiheight ; @demiheight ||= height / 2 end
|
195
|
+
def demiwidth ; @demiwidth ||= width / 2 end
|
196
|
+
def abs_demiwidth ; @absdemiwidth ||= abs_width / 2 end
|
197
|
+
def hcenter ; @hcenter ||= left + demiwidth end
|
198
|
+
def abs_hcenter ; @abshcenter ||= abs_left + abs_demiwidth end
|
199
|
+
def vcenter ; @vcenter ||= top + demiheight end
|
200
|
+
# Le bas ultime du paradigme ?
|
201
|
+
def box_bottom ; @box_bottom ||= top + 13 * MagickPFA::LINE_HEIGHT end
|
202
|
+
|
203
|
+
|
204
|
+
private
|
205
|
+
|
206
|
+
|
207
|
+
# Méthode qui parse la valeur fournie à l'instantiation pour en
|
208
|
+
# tirer les valeurs (@start_at et @duration)
|
209
|
+
def parse_raw_value(value)
|
210
|
+
@raw_value = value
|
211
|
+
if value.is_a?(Hash)
|
212
|
+
@start_at = NTime.new(value[:t], pfa.zero.to_i)
|
213
|
+
@description = value[:d]
|
214
|
+
if value.key?(:duree) || value.key?(:duration)
|
215
|
+
# La durée est fournie en secondes, elle doit donc être
|
216
|
+
# ramenée à la valeur sur 120 minutes
|
217
|
+
@duration = NTime.new(value[:duree]||value[:duration], 0)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
# @return [PFA::NTime] le temps représenté par une fraction dans
|
223
|
+
# les données absolues du Paradigme de Field Augmenté
|
224
|
+
#
|
225
|
+
# @param [String] fraction_str
|
226
|
+
# Cette fraction peut avoir les aspects suivants :
|
227
|
+
# 1/2
|
228
|
+
# 1/2 + 1/48
|
229
|
+
# 1/2 - 1/24
|
230
|
+
#
|
231
|
+
def calc_with_fraction_of_duree(fraction_str)
|
232
|
+
fraction = eval(fraction_str.to_s.gsub(/\//,'.0/')) # p.e. 1/24 => 1.0/24
|
233
|
+
return PFA::NTime.new(pfa.duration.to_i * fraction, 0)
|
234
|
+
end
|
235
|
+
|
236
|
+
end #/class Node
|
237
|
+
end #/class RelativePFA
|
238
|
+
end #/module PFA
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module PFA
|
2
|
+
|
3
|
+
# Reçoit une valeur temporelle quelconque (mais valide) et retourne
|
4
|
+
# le temps \Time correspondant
|
5
|
+
#
|
6
|
+
# Les valeurs adminissibles sont \Time, \String (format horloge)
|
7
|
+
# ou \Integer (nombre de secondes)
|
8
|
+
#
|
9
|
+
def self.time_from(value)
|
10
|
+
case value
|
11
|
+
when Time then value
|
12
|
+
when String then PFA.h2t(value)
|
13
|
+
when Integer then Time.at(value)
|
14
|
+
else raise PFAFatalError.new(52, **{value:"#{value.inspect}::#{value.class}"})
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Reçoit une horloge au format \String et retourne un nombre
|
19
|
+
# de secondes correspondant.
|
20
|
+
#
|
21
|
+
# @param \String horloge L'horloge transmise, sous différents
|
22
|
+
# formats possible, comme 'H:M:S', 'H+M+S' ou 'H,M,S'
|
23
|
+
#
|
24
|
+
def self.h2s(horloge)
|
25
|
+
horloge.match?(REG_HORLOGE) || raise(PFAFatalError.new(52, **{value:"#{horloge.inspect}::#{horloge.class}"}))
|
26
|
+
s, m, h = horloge.split(/[+,:]/).reverse.collect {|n| n.to_i}
|
27
|
+
return (s||0) + (m||0) * 60 + (h||0) * 3600
|
28
|
+
end
|
29
|
+
|
30
|
+
# Reçoit une horloge et retourne le temps correspondant
|
31
|
+
def self.h2t(horloge)
|
32
|
+
Time.at(h2s(horloge))
|
33
|
+
end
|
34
|
+
|
35
|
+
# Reçoit un nombre de secondes \Integer et retourne une horloge
|
36
|
+
# au format 'H:MM:SS'
|
37
|
+
# Si +options[:as]+ = :duree, on renvoie une version durée,
|
38
|
+
# c'est-à-dire avec les heures, et les minutes sur deux chiffres
|
39
|
+
# seulement s'il y a des heures.
|
40
|
+
def self.s2h(secondes, **options)
|
41
|
+
secondes.is_a?(Integer) || raise(PFAFatalError.new(51), **{value: "#{secondes.inspect}::#{secondes.class}"})
|
42
|
+
h = secondes / 3600
|
43
|
+
r = secondes % 3600
|
44
|
+
m = r / 60
|
45
|
+
s = r % 60
|
46
|
+
if options[:as] == :duree
|
47
|
+
# -- Version durée --
|
48
|
+
# (on ne met les heures que si elles sont définies)
|
49
|
+
segs = []
|
50
|
+
segs << "#{h}" if h > 0
|
51
|
+
m = m.to_s.rjust(2,'0') if h > 0
|
52
|
+
segs << "#{m}"
|
53
|
+
segs << s.to_s.rjust(2,'0')
|
54
|
+
segs.join(':') # => "1:02:54" ou "2:45"
|
55
|
+
else
|
56
|
+
# -- Version horloge normale --
|
57
|
+
# (toujours avec les heures)
|
58
|
+
"#{h}:" + [m,s].collect{|n|n.to_s.rjust(2,'0')}.join(':')
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Reçoit un temps \Time et retourne une horloge 'H:MM:SS'
|
63
|
+
def self.t2h(time)
|
64
|
+
time.is_a?(Time) || raise(PFAFatalError.new(50, **{value: "#{time.inspect}::#{time.class}"}))
|
65
|
+
return s2h(time.to_i)
|
66
|
+
end
|
67
|
+
|
68
|
+
REG_HORLOGE = /^([0-9][+:,])?([0-9]{1,2}[+:,])?[0-9]{1,2}$/.freeze
|
69
|
+
end#/module PFA
|
data/lib/pfa/version.rb
ADDED
data/lib/pfa.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
def dbg(str)
|
2
|
+
STDOUT.write("\n#{str}\n")
|
3
|
+
end
|
4
|
+
require 'clir'
|
5
|
+
require 'yaml'
|
6
|
+
require 'singleton'
|
7
|
+
require "pfa/version"
|
8
|
+
require 'pfa/constants'
|
9
|
+
require 'pfa/errors_manager'
|
10
|
+
require 'pfa/temporal_methods'
|
11
|
+
require 'pfa/node_time'
|
12
|
+
require 'pfa/relative_pfa'
|
13
|
+
require 'pfa/absolute_pfa'
|
14
|
+
require 'pfa/relative_pfa_node'
|
15
|
+
require 'pfa/relative_pfa_datatime'
|
16
|
+
require 'pfa/img_builder'
|
17
|
+
|
18
|
+
module PFA
|
19
|
+
|
20
|
+
end
|
data/pfa.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative 'lib/pfa/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "pfa"
|
5
|
+
s.version = PFA::VERSION
|
6
|
+
s.authors = ["PhilippePerret"]
|
7
|
+
s.email = ["philippe.perret@yahoo.fr"]
|
8
|
+
|
9
|
+
s.summary = %q{Gestion d'un Paradigme de Field Augmentée (Field Augmented Paradigm)}
|
10
|
+
s.description = %q{Gestion complète d'un PFA, pour le produire soit en HTML soit en PDF et calculer les différences entre PFA relatif et PFA absolu.}
|
11
|
+
s.homepage = "https://rubygems.org/gems/pfa"
|
12
|
+
s.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
13
|
+
|
14
|
+
s.metadata["allowed_push_host"] = "https://rubygems.org"
|
15
|
+
|
16
|
+
s.add_dependency 'yaml'
|
17
|
+
s.add_dependency 'clir'
|
18
|
+
s.add_dependency 'singleton'
|
19
|
+
s.add_development_dependency 'minitest'
|
20
|
+
s.add_development_dependency 'minitest-color'
|
21
|
+
|
22
|
+
s.metadata["homepage_uri"] = s.homepage
|
23
|
+
s.metadata["source_code_uri"] = "https://github.com/PhilippePerret/pfa"
|
24
|
+
s.metadata["changelog_uri"] = "https://github.com/PhilippePerret/pfa/CHANGELOG.md"
|
25
|
+
|
26
|
+
# Specify which files should be added to the gem when it is released.
|
27
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
28
|
+
s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
29
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test)/}) }
|
30
|
+
end
|
31
|
+
s.bindir = "exe"
|
32
|
+
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
end
|
data/pfa.jpg
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pfa
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- PhilippePerret
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-09-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: yaml
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: clir
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: singleton
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest-color
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Gestion complète d'un PFA, pour le produire soit en HTML soit en PDF
|
84
|
+
et calculer les différences entre PFA relatif et PFA absolu.
|
85
|
+
email:
|
86
|
+
- philippe.perret@yahoo.fr
|
87
|
+
executables: []
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- ".DS_Store"
|
92
|
+
- ".gitignore"
|
93
|
+
- ".travis.yml"
|
94
|
+
- CHANGELOG.md
|
95
|
+
- Gemfile
|
96
|
+
- Gemfile.lock
|
97
|
+
- README.md
|
98
|
+
- Rakefile
|
99
|
+
- bin/console
|
100
|
+
- bin/setup
|
101
|
+
- lib/assets/Manuel/ImageMagick.md
|
102
|
+
- lib/assets/Manuel/Manuel-developer.md
|
103
|
+
- lib/assets/fr/PFA_ABSOLUTE_DATA.yaml
|
104
|
+
- lib/assets/fr/errors.yaml
|
105
|
+
- lib/pfa.rb
|
106
|
+
- lib/pfa/absolute_pfa.rb
|
107
|
+
- lib/pfa/any_builder.rb
|
108
|
+
- lib/pfa/constants.rb
|
109
|
+
- lib/pfa/errors_manager.rb
|
110
|
+
- lib/pfa/imagemagick_module.rb
|
111
|
+
- lib/pfa/img_builder.rb
|
112
|
+
- lib/pfa/node_time.rb
|
113
|
+
- lib/pfa/pfa_element_module.rb
|
114
|
+
- lib/pfa/relative_pfa.rb
|
115
|
+
- lib/pfa/relative_pfa_datatime.rb
|
116
|
+
- lib/pfa/relative_pfa_node.rb
|
117
|
+
- lib/pfa/temporal_methods.rb
|
118
|
+
- lib/pfa/version.rb
|
119
|
+
- pfa.gemspec
|
120
|
+
- pfa.jpg
|
121
|
+
homepage: https://rubygems.org/gems/pfa
|
122
|
+
licenses: []
|
123
|
+
metadata:
|
124
|
+
allowed_push_host: https://rubygems.org
|
125
|
+
homepage_uri: https://rubygems.org/gems/pfa
|
126
|
+
source_code_uri: https://github.com/PhilippePerret/pfa
|
127
|
+
changelog_uri: https://github.com/PhilippePerret/pfa/CHANGELOG.md
|
128
|
+
post_install_message:
|
129
|
+
rdoc_options: []
|
130
|
+
require_paths:
|
131
|
+
- lib
|
132
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: 2.3.0
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
requirements: []
|
143
|
+
rubygems_version: 3.1.6
|
144
|
+
signing_key:
|
145
|
+
specification_version: 4
|
146
|
+
summary: Gestion d'un Paradigme de Field Augmentée (Field Augmented Paradigm)
|
147
|
+
test_files: []
|